質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

826閲覧

dictionary変数を用いたフォームの生成では、Activateイベントが呼ばれません。

jkjksan

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/06/30 06:35

はじめに

伝票+伝票明細の画面を作っています。画面の見た目はよくあるタイプです。ここでは伝票フォーム、伝票明細フォームというオブジェクト名にとします。

メインフォーム(非連結、単票モード)
+サブフォーム(帳票モード)
で構成しています。

多画面生成を実現するためにdictionary変数を用いており、簡単に言うと次のような方法を取っています。

VBA

1'Form_画面管理用のフォームオブジェクト 2Public dic As New dictionary 3Public Sub 画面を生成() 4 Dim key As String 5 key = Timer 6 With Me.dic 7 .Add key, New 伝票フォーム 8 9 With .Item(key) 10 .Tag = Key 11 .伝票ID = Call 伝票IDを取得する処理() 12 'その他初期化処理 13 .Visible = True '画面表示開始 14 End With 15 16 End With 17 18End Sub

やりたいこと

サブフォームの指定フィールドに初期値(DefaultValue)を設定したい。
具体的には、伝票明細フォームのコントロール(TextBox,伝票ID,リレーション用の外部キーです。)
やりたい事をコードで説明するなら、以下のようになります。

VBA

1'生成された伝票フォームオブジェクトのActivateイベント 2Me.伝票明細フォーム.Form.伝票ID.DefaultValue = Me.伝票ID.Value

何故実現できないのか

冒頭でDictionaryを用いて初期化している時、サブフォームまでは潜れないようでした。(参照できない)

伝票フォームオブジェクトのOpenイベントにしかけても、参照できないエラーが発生します。

Activateイベントに引っ掛けようとしても、Activateイベント自体が呼ばれませんでした。別画面に切り替え等の操作を行ったとしてもです。

画面が表示された後、親フォームに設置した何かしらのコントロールが起こすChangeイベントでは、子フォームへ対する参照が通りますが、実装としては人による操作が開始される前が望ましいと考えています。

他のアプローチがある場合、アドバイスを頂きたく。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私が過去に作ったcollectionを使って多重new Formするサンプル引っ張ってきましたが
activateイベントは普通に反応しました。

vba

1Me.伝票明細フォーム.Form.伝票ID.DefaultValue = Me.伝票ID.Value

これをせずにリンク親フィールド、リンク子フィールドを使って伝票IDを設定してはいけないんですか?
このやり方はOpenArgsも使えないので初期値関連は渡せないのでめちゃくちゃ不便なんですよね…

タイミングが許すのであればここで設定すればいいかと

vba

1 With .Item(key) 2 .Tag = Key 3 .伝票ID = Call 伝票IDを取得する処理() 4 'その他初期化処理 5 .Visible = True '画面表示開始 6 .伝票明細フォーム.Form.伝票ID.DefaultValue = .伝票ID 7 End With

投稿2020/06/30 07:20

sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/06/30 13:34

私もsousukeさんのリンク親フィールドをリンク子フィールドを設定しておくという案に同意です。 ひょっとするとメインフォームが非連結の場合はリンクフィールドが設定できないと思っているのかな? そんなことないですよ。リンク親フィールドにコントロール名を設定すればリンクできます。 リンクしておけば DefaultValue も自動で設定されます。
jkjksan

2020/07/01 10:05

回答ありがとうございます。 疲れがピークに達したため、リフレッシュしておりました。 頂きました回答を参考に検証を進めていく中で判明したことは、 物凄くお恥ずかしい話ですが、参照先のオブジェクト名を間違えておりました。 サブフォームに「伝票ID」というオブジェクト(TextBox)は存在しておらず、実際のオブジェクト名は「ID」になっていました。これはUIデザインを同時進行で編集していたため、どこかで操作ミスを起こしていたと思います。 提示していたソースコードでは参照エラーが出て、私以外では検証してもエラーが出ないのも当然です。 また、質問当時に頭が煮詰まって休憩中でPCから離れており、スマートフォンにて記憶を頼りにソースコードを提示していたため、不必要に検証させてしまった事についてお詫び申し上げます。 オブジェクト名を間違えていたことに気付かなった原因として、DictionaryやCollection等ではインテリセンスが効かない方法であったため、コードもオブジェクトも間違えていないと強い思い込みをしたことによる検証不足です。 相当にスパゲッティな処理と開発手順であったことを反省し、「多重 New Form」の使いどころも考え直す事にしました。 「リンク親フィールドをリンク子フィールドを設定しておくという案」についてですが、 メインフォームにレコードソースを設定していないため、埋め込み(サブフォーム)に対してリンク親フィールド及びリンク子フィールドを設定することが出来ません。 レコードソースを設定していない理由については、忘れてしまいました。 恐らく、伝票フォームを新規登録として開きたい場合では、 ```VBA DoCmd.GoToRecord acDataForm, Me.Name, acNewRec '多重フォーム状況下では、別のウィンドウ(Hwnd)に対して処理が掛かってしまう ``` ということがありますので、個別に代入するしかないと考えました。 これ以上の事は考えておりませんでした。
sousuke

2020/07/01 10:57

hatena19氏もおっしゃっていますが「リンク親フィールド」を設定するのにメインフォームにレコードソースは必須ではありません。「リンク子フィールド」はサブフォームのレコードソースにあるフィールド名をする必要がありますが、「リンク親フィールド」はフィールド名である必要がなくテキストボックス名などを指定できます。「リンク親フィールド」に「Tempvars!テスト」など書いても普通に動きます。 また「DictionaryやCollection等ではインテリセンスが効かない方法」であるのは 単純にキャストしてないからです。汎用性は乏しいですが伝票フォームの「コード保持」を[はい]にして dim f as Form_伝票フォーム ' Dictionaryからキャストして受け取る set f = .Item(key) with f (ここでドットを打てば伝票フォームのインテリセンスがききます。) こんな感じで書けばインテリセンスききますし存在しないプロパティやコントロールを 書けばコンパイル段階でエラーを吐きます。
jkjksan

2020/07/02 00:25 編集

>「リンク親フィールド」を設定するのにメインフォームにレコードソースは必須ではありません。 直打ちすれば入るんですね、初めて知りました。 キャストについても閃きませんでした。 質問の内容としては、教えていただいた意図した動作を出来るようになりましたので締めようと思います。 おかげさまで非常に助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問