Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


471 / 9994 ←次へ | 前へ→

【12835】Re:サブフォームの抽出結果をメインフォームに表示させたい
回答  かるびの  - 15/5/28(木) 2:00 -

引用なし
パスワード
    結構しっかりしたコードですね。
 メインフォームからサブフォームを参照することとか、
DCountやDLookupなどD系関数の第3引数の書き方などは、
しばしば間違えやすいのですが、しっかりできているところがあります。
 でも、いくつかおかしな点もありますね。


 第1に、あちこちでActiveControlプロパティが使われていますが、
「Me.ActiveControl」ではエラーになります。
 このコードは、ActiveControlプロパティをフォームオブジェクトに対して
適用しているわけですが、
ActiveControlプロパティは、Screenオブジェクトに対してしか使えません。
 したがって、この行でエラーです。


 また、ActiveControlとは、
その時点でアクティヴなウィンドウにおける、フォーカスがあるコントロール
という意味です。

 例えば、AフォームとBフォームが開かれており、
当初はAフォームのaテキストボックスにフォーカスがあったところ、
フォーカスをBフォームのbテキストボックスに移したとします。
 この場合のActiveControlはbテキストボックスです。 

 この状態で、Aフォームをアクティヴにすると、
aテキストボックスにフォーカスが移るわけですが、
だからといって、Bフォームがアクティヴな状況下において、
「AフォームのActiveControlはaテキストボックスだ」とは言えません。
 あくまでもActiveControlはbテキストボックスです。


 さらに、ActiveControlが何であるかということはかなり微妙です。
 例えば、aテキストボックスにフォーカスがある状態で、
抽出を実行するコマンドボタンをクリックしたとします。
 この場合、コマンドボタンをクリックすることにより
フォーカスは当該コマンドボタンに移ります。
 したがって、コマンドボタンのクリック時において、
ActiveControlは当該コマンドボタンとなります。
 コマンドボタンのクリックイベントにおいて、
ActiveControlはaコントロールであるという思い込みの下で
コードを書いていたりすると、コードは意図どおりに動いてくれません。


 加えて、デバッグに当たり、コードをステップ実行させると、
ActiveControlでエラーになります。
 これは、コードをステップ実行させているときは、
VBEのウィンドウがアクティヴウィンドウになっているためです。
 また、ステップ実行中にマウスカーソルをコード中のActiveControl
という文字の上に持って行っても、
ActiveControlの値は表示されず(ActiveControlプロパティの値はControl型であるため)、
どのコントロールがActiveControlなのかがすぐにはわかりません。
 なので、ActiveControlを使うと、デバッグがやりにくいです。


 その上、提示のコードにおいてはActiveControlプロパティを使うべき必然性が
ないように思います。
 微妙な取扱いが必要とされるActiveControlプロパティを使わなくても、
コードが書けると思います 


 第2に、SetFilter関数における
>  With Me.ActiveControl
>    stCri = .Name & " LIKE '" & .Value & "*'"
>  End With
です。
 ここではFilterプロパティに設定する条件式を作っているわけですが、
Filterプロパティに設定する条件式の基本形は、「フィールド名 = 値」です。
 上記のコードだと、「コントロール名 = 値」という形になってしまうので、
エラーになる可能性があります。
 
 もっとも、フォームをウィザードで作ると、フィールド名とコントロール名が同じ名前になりますから、そうなっていれば、エラーにはなりません。
 ただ、フィールド名とコントロール名が同じ名前だと、取り違えやすいので、
通常は、フィールド名とコントロール名は別の名前にします。


 第3に、
>    MyCount(1) = DCount("*", "X0001GL勘定", Me.ActiveControl.Name & " LIKE '" & Me.ActiveControl.Value & "*'")
です。
 これはだめですね。
 まず、DCount関数の第2引数には、テーブル名又はクエリ名を指定します。
 「X0001GL勘定」は、サブフォーム・コントロール名ですから、この行でエラーです。

 ほかにも、D系関数の第2引数にサブフォーム・コントロール名を指定したものがありましたが、
同様にエラーとなります。

 次に、第3引数ですが、第3引数の基本形は「フィールド名 = 値」です。
上記コードだと「コントロール名 = 値」という形になってしまうので、エラーになる可能性があります。


 第4に、ラベル情報サブプロシージャの
>  Me.txtR3番号.Value = DLookup("[R/3コード]", "X0001GL勘定", [Forms]![MainGL勘定Pr]![小区分名称])
です。
 まず、第2引数にサブフォーム・コントロール名を指定していることについては
既に指摘したとおりです。

 次に、第1引数です。
 フィールド名には、記号は使えません。例外は、アンダーバー(_)だけです。
 だから、フィールド名に「/」を使っていること自体でエラーになります。
 使ってはいけない文字をオブジェクト名に使った場合のエラーは、
エラーメッセージを見ても、エラーの原因を推測できず、原因探求に苦労します。

 さらに、第3引数ですが、条件式になっていませんね。


 第5に、これはコードの問題ではないのですが、
フォーム構成がよくわかりません。
 メインフォームが少なくとも2つ、
サブフォームコントロールが少なくとも2つ出てくるようですが、
それらがどういう機能を持つものなのかピンときません。
 また、提示されたコードがどのフォームに書かれているのかもわかりません。

771 hits

【12834】サブフォームの抽出結果をメインフォームに表示させたい rinrin 15/5/26(火) 21:22 質問[未読]
【12835】Re:サブフォームの抽出結果をメインフォー... かるびの 15/5/28(木) 2:00 回答[未読]
【12836】Re:サブフォームの抽出結果をメインフォー... hatena 15/5/28(木) 15:08 回答[未読]
【12837】Re:サブフォームの抽出結果をメインフォー... かるびの 15/5/29(金) 0:07 発言[未読]
【12838】Re:サブフォームの抽出結果をメインフォー... rinrin 15/5/29(金) 23:18 お礼[未読]

471 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free