Access VBA 質問スレ Part1
■ このスレッドは過去ログ倉庫に格納されています
AccessのVBAに関する質問スレです
★1 質問テンプレ(雛形)は用意しませんが、OSとAccessのバージョンは必ず書きましょう。
★2 AccessのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 AccessのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★5 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
関連スレ
Excel VBA 質問スレ Part23
http://toro.2ch.net/test/read.cgi/tech/1327763113/l50
ODBCのミドル層で出てるダイアログだから、アクセス側からいじれるプロパティなんてないだろ
自分でIDとパスワード入力してもらうフォーム作ってそこに入力してもらえ DBの持ち物か。すまん。
ダイアログの出る直前にACCESSで入力を固定して終わったら解除ってできないのかね。
(調べてない、ただの理想を述べてみた。) >>129
>>124が言ってるのは多分、ODBCで接続するときにユーザとパスワードを指定しなかったときに出るやつ
自分でちゃんと接続できるユーザとパスワード指定したら出ない
間違ったユーザやパスワード設定したらしらん Access初心者です。
VBAでExcelからデータをコマンドボタンで自動インポートさせる物を
作っています。
インポート漏れがないかのチェック処理もさせたいのですが、
どのようにすればいいかわかりません、ご教授お願いします。 >>132
ありがとうございます。
仮に件数が合わなくてインポート漏れしたレコードを
特定するための処理をいれることはできますか? >>133
ユニークキーで差分とれよ
少しは考えろ そうか
ならインポートしてからチェックするより自前のコードでインポートした方がいいんじゃない? Access初心者なので、そのVBAのコードの書き方がわかりません
教えていただけませんか >>131
www.nurs.or.jp/~ppoy/access/access/acX014.html 数字型のとこに文字入ってるデータとか用意したらいいんじゃね >>145
うーん、そういうデータをインポートすると普通にエラーとして扱われて
「テーブル名_$インポート エラー」 ってテーブルが生成されるから
インポート漏れのレコードがわからなくて困る、なんて状況にはならないんだよね インポート漏れのレコードがわからなくて困る、なんて状況になると言ってる人はいないが DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, _
strac, strxls, True, strrange
上記でインポート エラーになるので引数のacImportのところに、
作成したインポート定義にしたいのですができるのでしょうか そもそもワークシート変換にインポート定義とかないだろ Accessの初心者です。
レポート印刷でページヘッダーのコードが変わったタイミングで改ページしたい
かつ詳細の明細行は4レコードだけで改ページさせる、両方の条件を満たせるには、
どうやって作成したらよいかご教授お願いします。 ページヘッダーじゃなくて、その項目でグループ化してヘッダー作る
そのヘッダーかフッターで改ページを設定する
詳細の高さを4行分になるようにヘッダ、フッタや余白を調整する
つか、VBAまったく関係ない話 >>153
ここはVBAのスレですよね?VBAと関係ある話をしてください。
VBAとまったく関係ない話をしたのはあなたです。VBAでお願いします。 >>154
マジレスしといてやるが、VBAでやるよりよっぽど>>153の方法の方が良いぞ
だがあえてVBAでやりたいなら
明細セクションの最初と最後に改ページコントロール(改ページ1,2)を配置して
Dim 行数 As Integer
Dim 前コード
Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
Me.改ページ1.Visible = False
Me.改ページ2.Visible = False
前コード = Me.フィールド5
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If Me.フィールド5 <> 前コード Then
Me.改ページ1.Visible = True
行数 = 0
Else
Me.改ページ1.Visible = False
End If
前コード = Me.フィールド5
行数 = 行数 + 1
If 行数 > 4 Then
Me.改ページ2.Visible = True
行数 = 0
Else
Me.改ページ2.Visible = False
End If
End Sub
こんな感じ。この例ではフィールド5が変わったら改ページな う。 は空白に置換してくれ
つか普通に貼り付けできなくなったのかよ >>156
もう少し教えてください。。。
明細が5明細あった場合、
コードA
00001
00002
00003
00004
改ページ
コードA
00005
改ページ
コードB
00001
00002
00003
改ページ
コードC
00001
こんな感じで出したいのですが >>158
>>156が理解できないなら、VBAでやるのやめとけ Accessのクエリで、「クエリの並び替え条件を動的に変更する」方法を
教えて頂けないでしょうか。
現状は、下記のクエリを作成しましたが、並び替え条件として判定されません。
SELECT * FROM テーブル1
ORDER BY FORMS!画面1!テキスト1.Value
よろしくお願いします。 >>160
SELECT * FROM テーブル1
ORDER BY FORMS!画面1!テキスト1.Value
これってどこに書いてるの? >>160
どうしてもやりたいならQueryDefとか使えばできるかもしれんが
動的にSQLつくってDoCmd.RunSqlでやる方がいいんじゃね >>161
Accessの「クエリ」で定義していました。
>>162
ご指摘を受けた点を参考にクエリを作成した所、うまく行きました。
ありがとうございます。 株価のデータベースを作りVBAで銘柄の抽出をしています
VBAを呼ぶ度にSQLで株価データを読み込んでるので日に何度もやると結構無駄です
そこでフォームをロードした時に纏めて銘柄毎のクラスオブジェクトを作り
フォームをアンロードするまで保持したいのですが可能でしょうか?
変数の保持はStaticで良いようですが、配列化してるオブジェクトの保持はどのようにするのでしょうか? フォームと連動させるのではなく、最初に実行させる時にStaticで保持し
2度目からオブジェクトが空ではないならデータを取りに行かずに
値渡しするようにして解決しました なんか色々つっこみどろこ満載だな
まあ、動いてるならいいか VBAでリモートのデータベースにトランザクション処理を開始して、コミット/ロールバックするのはわかりました。
これをマクロのアクションだけではできないですよね。
Vbaを嫌がる仲間が同一プロジェクト内にいるので。 昔広島にあったSTGや落ちゲーキャラゲー開発してた会社 マジレスしとこう
>>170
ソースプログラムを実行可能形式に変換する事
簡単に言えば、お前が書いたプログラムを実行できるように準備する作業
ACCESSなら勝手にやってくれるから、意識する必要はない >>175
1998年に無くなって、落ちゲー関係はセガが買い取った >>176
なるほど。では、あえてコンパイルという作業をしなくてもOK
ってことですね。
あるがとうございます! Accessの場合、ソースを中間コードに変換する作業をコンパイルと呼んでる。
その過程でソースにエラーがあるかどうかをチェックするから
実行時エラーとかの対策にはコンパイル通しておいた方が良いと思う。 実行時エラーってのは普通、コンパイルは通った後に発生するエラーの事を言うんだが
まあ、実行時にコンパイルエラー出るのもなんだし、事前にコンパイルしとけってのは同意するが Access独自の便利機能なのか分かりませんが
テキスト型のフィールドで日付が含まれる文を「日付順にソート」出来るのですが
これをVBAでやるにはどうしたら良いのでしょうか?
テキストに規則性が無いためにOrderByなどでは対応出来ません
テキストフィールドに入ってる文字列の例:
"第3四半期決算を1月10日に発表済み"
"第3四半期決算を2月10日"
"本決算を2月13日"
"---"
このようになってても、テーブルのフィールドを選択してソートが出来るとは初めて知ったのですが
VBAからやる方法が分かりません >>181
>テキストに規則性が無いためにOrderByなどでは対応出来ません
最初に書いたSQLが悪かったみたいで
これで出来ました。サーセン そもそも
>テキスト型のフィールドで日付が含まれる文を「日付順にソート」出来るの
これが怪しいんだが
どこでこんな事教えられたんだ そうだな、俺も出来るとは思ってなかった
しかし、実際その通りに動くのだから仕方がないw
だから最初に「Access独自なのか」と思ってるのだが
これが出来るのは2013だからかもしれない テキスト型だから、文字数順に並び替えてるのかと思って試してみた
"本決算を2月13日"、これを"本決算を1月13日"に書き換えて試すと
日付順に並び替わる>>181の例で言うと真ん中に来る
更に"第3四半期決算を2月10日"、これを"第2四半期決算を2月10日"
とやっても日付順に並び替わるので間違いない、>>181の例で言うと一番最初に来る
しかし、2月3日と02月03日表記では並び方が変わる
具体的にはMD表記郡の中でソートされ、MMDD表記郡の中でソートされる 分かった。ググったら出てきた
2007から出来るらしいけど、勝手に日付を解釈してるのではなく
正確にはテキスト部分を無視して数値順に並び替えてる、らしい ソートの問題じゃなくて暗黙の型変換の問題な気はするけど
>テキスト部分を無視して数値順に並び替えてる
普通にソートすればテキストでソートするんだが
どうやったらそんなソートするんだ? あいまいな検索をしたい場合はLike *検索文字列* だけど
これだと、先頭文字列に外字が含まれてる場合は検索されない
のだけれど、回避方法はある? >>191
ちゃんと検索できるっぽいけど
先頭文字に外字ってのは、検索対象のテーブルデータなのか、Likeに指定する文字列なのか? >>192
先頭に含まれる外字は検索対象のテーブルデータです
文字列の中間に外字が含まれる場合は検索できるのに、
先頭だと検索されない減少が発生する… >>193
かるく試したが再現しないな
OSかACCESSのバージョンによる問題か
単にお前の勘違いか
ACCESSでも限定された状況でのバグか
MDB(ACCDB)がぶっ壊れてるか
まあ、単に検索できないレコードに不正なデータが混じってるだけだと思うが 一応解決したっぽい
原因として、dbmagicにodbc経由でリンクテーブルに
したのがダメらしい
リンクテーブルをやめて、テーブルデータごとインポートしたら
通常通りに検索できた
みんなありがと 生データインポ時に変換されただけとかは?
つまりODBC接続でもデータを相応しい変換しておけば解決できるのかも そもそも外字サポートされてるのかどうかしらんが
たんにdbmagicで外字がバグってただけだろ SQLのReplace Intoに相当する物って有るんですか? フォームに伝票基本情報
サブフォームに詳細というか明細欄(だいたい30レコードくらい)配置して、
1売上1レコードになるようにしています。
サブフォームに、
内容 金額 委託 委託金
とフィールドがあり、委託したときに入力するですが、
(この委託の部分も、
1売上(外注)1レコードにできませんか? >>199
そもそも標準的なSQLにそんな命令聞いた事ない
ACCESSでも聞いた事ない >>200
なにがしたいか良くわからんが、サブデータシートとかサブフォームのネストとか
たぶんそれでできるんじゃね >>199
MySQLの独自実装か?
SQL ServerにもPostgreSQLにもないが・・・。
どんな動きかググってまで答える気にならない。 練習がてらVBAでユーザー定義関数をつくろうかと思ったんですが思った通りのものが作れず困っています。
というか簡略化できないもんかと思っているわけですが。
OS XP
Access 2003
Function AAA(Parm01,Parm02,Parm03...) AS String ’parmは最終的にParm24までできますがここでは簡略化
If Parm01 = "S" or Parm01 = "A" then
AAA = "1"
Exit Function
Else
AAA = "0"
end if
End function
とすごく単純なものなのですが、Parm01〜Parm03(実際にはParmは24個)にはそれぞれS・A・B・Cのいずれかが入っているので
それを数値に変換する仕組みを作りたいのです。
SかAだったら1を。それ以外(B・C)だったら0を返す。
上には記載していませんが最終的にはParmの中身を全て合計した値を返すようにいじる予定です。
で、問題なんですが、IF文の中でParmの中身を判定しているわけですが、これをParmの数だけ作るのはなんか美しくない。
Parm01〜24をまとめて判定するにはどのようにするのが美しいでしょう。
ご教授頂ければ嬉しいです。 >>206
まず24個も引数取るのを美しいか疑問に思えよ
その24個をまとめたコレクションなり配列なり用意するとか
その24個にあまり関連がないないならParamArrayつかえ
(その前提でまとめて同じ引数にするのおかしいけどな) >>207
ParamArrayというのがあるんですね。ありがとうございます。調べてみます!
美しさに関しては超ごもっともなんですが、如何せん元のデータをいじる権限がなくてですね。
元データの開発者をぐーで殴りたいレベル。
識別コード(一意)|24ヶ月前|23ヶ月前|22ヶ月前|21ヶ月前|・・・|当月|
ってな感じなんですよ。
んでこの○ヶ月前ってのがParmになるんですけどコレクションにせよ配列にせよ、結局は同じことなので
AAA(24ヶ月前,...当月)ってやっちまったほうが早いかなと。
大変助かりました。ありがとうございます。 VBAにそんなもんあんのか?構造体使うのが普通だろ
ただしVBAの構造体は遅いけどな ACCESSなら元データはテーブルじゃないのか
だったらレコードセットなり渡せば済む話だとおもうが 設計の悪いDBだとたまに見る形だな
一々縦横変換とかしなきゃならんやつ スイマセン。エクセルからACCESSのテーブルにADO接続してエクセルの行(256文字以上のテキスト)をINSERTしようとしています。ACCESS側で受けるフィールドをメモ型にしましたがエクセルからINSERTしても255文字以内しか残りません。 続きです。
何かすっごく基本的な凡ミスな気がしてるのですが、何かここらあたりありますか?
エスパーな質問で申し訳ないです。。 メモ型はSQL使うと切れたり頭の255しか判定してくれなかったりするからなあ
エクスポートインポートとかはバグで切れちゃうし
普通に文字列INSERTで入るか試してみて 171 名前:デフォルトの名無しさん[] 投稿日:2014/07/17(木) 02:49:51.87 ID:TFQGtdi0
http://www.ynsk.co.jp/nsk/knowhow/sendmail/sendmail5.htm
こちらのサイトに公開されてるアクセスのコードなんですが
Windowsの標準DLLを利用して、メールを受信、送信するプログラムを
実行したいのですが、うまく動かせません。
他のスレッドで質問しましたが、こちらに誘導されてきました。
無償で公開されてるソースコードが動かないのですが、わかる有志の方、いらっしゃいましたら
使い方おしえてください。
元スレッド:Excel VBA 質問スレ Part34 ●MDBファイルの内容
・ メールユーザ(テーブル)……利用するメールアカウントの情報を保存します。
※ 以下のように設定して下さい。
メールアドレス
POP3サーバ
ユーザ
パスワード
SMTPサーバ
リターン ← 受信時にサーバなどから通知されるメッセージが設定されます。
受信要求 ← 0(受信しない)または-1(受信する)を設定して下さい。
仮受信 ← -1(メールをサーバから消さない)または0(消す)を設定して下さい。
上記の説明通り、テーブルに必要事項を記入しましたが反応しません。
コンパイルはしました。UACを切ってファイルのアクセス権限をeveryoneに変更しました。。
動作確認済み環境が、Win2000とXPProのようで、office97、2000では動作の確認が取れてるみたいです。
自分の環境:Win7pro office2010pro >>218
反応しないってどういうこと?
テーブルにセットしただけでは何も起こらなくて当然だぞ メール受信(更新クエリというのが有るようですが、そのクエリが見当たりません。初歩的なところで止まっているような気はするのですが、外部からのデータ受ける部分のdllがwin7で動作できない理由と読んでるのですが。ご教授願います。 ・ B_POP3(モジュール)……メールの受信とデコードを行います。
※ このモジュールを実行するためには、作業用のフォルダが必要です。
B_POP3(モジュール)の中のコーディング
「Private Const BWorkDir As String = "c:\maildata"」と
「Private Const BWorkTempDir As String = "c:\maildata\temp"」で
作業用のフォルダを指定しています。
ダウンロードしたままの設定で操作する場合、
Cドライブ直下にmaildataというフォルダとmaildataフォルダのなかに
tempというフォルダを作成して下さい。
別のフォルダを利用する場合、フォルダの指定を変更して下さい。
「Private Const c_WorkDir非消去 As Integer = -1」というコーディングがあります。
-1のままだと、1メールごとに上記作業用のフォルダの中身を削除しません。
1ユーザのメールが複数あって、それを受信した場合、作業用のフォルダには全件分のファイルを残しています。
デバック時に1ユーザごとに受信すれば、中間結果を追えるので、有効なことがあります。
ファイルには、「mail1.txt」,「mail2.txt」.....などの番号を付けています。
ファイルと受信したメールを照合させるため、テーブルに保存したメールの「件名」にも番号を付けています。
0にすると、作業用のフォルダには最後の1件分のファイルしか残りません。
安定した運用段階に入れば、0にした方がディスク負荷は小さくなります フォルダのアクセス権限の確認→念のため、everyoneに変更
ディスク負荷による動作停止の可能性→-1から0に変更したが変化なし
そもそも、動作環境は古いマシンで行われていたので
マシンスペックのリソース不足は考え難いと考えました。
もう少し、調べてみます。winsock.dllあたりが怪しいです。
パケットキャップとる以前に、ハードディスクの動作に変化が見られない。 お騒がせしました。
原因は、accessの使い方がわからないまま
クエリが非表示であることに気付かず、試そうとしたためです。
同じ環境をVM作成し、対象のクエリのSQLクエリが見えたのでそれをぱくりました。
以上 基本的なことと思いますが、教えてください。
Public Function FuncSyohizei(ByVal kingaku As Double) As Double
FuncSyohizei = kingaku * 1.05
End Function
これを、イミディエイトウインドウから実行する場合
?FuncSyohizei(100.0)
・・・型が一致しません。ちなみに、?FuncSyohizei(100)でも、同じ。
?FuncSyohizei 100
→ 100 ?FuncSyohizeiは、文字列とみなされ、無視された?。
ただしく、100と引数を渡したら、105と返ってくるようにするには
イミディエイトウインドウに、どう入力すればいいんでしょうか。 いろいろやってみて、解決しました。
フォームモジュールに、これを作ったのがいけなかったようです。
標準モジュールにコピペして、?FuncSyohizei(100)したら
105が出ました。 Date, Now って
Functionじゃなく
Propertyなのな ■ このスレッドは過去ログ倉庫に格納されています