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

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

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

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

Q&A

解決済

2回答

3300閲覧

accessにおいて、フォーム間でデータのやり取りをしたい

syosinsya109

総合スコア41

Access

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

0グッド

0クリップ

投稿2022/10/07 03:37

前提

accessについて質問します。
フォームAからフォームBに値を渡して、表示したいのですがうまくいきません。

実現したいこと

フォーム間で値の受け渡しをしたい

該当のソースコード

vba

1'フォームA 2Public test As Integer 3Private Sub 詳細情報_Click() 4 'オートインクリメントを格納 5 test = Me!id 6 'フォームBを開く 7 DoCmd.OpenForm "フォームB", , , , , ID 8 9End Sub

vba

1'フォームB 2Private Sub コマンド9_Click() 3 '引数の有無によってメッセージを出し分ける 4 MsgBox test '空文字が格納されていた' 5 If IsNull(Me.OpenArgs) Then 6 'こっちに行った 7 MsgBox "引数なし" 8 Else 9 MsgBox Me.OpenArgs 10 End If 11End Sub

試したこと

試したことは主に3つ
1つ目は、DoCmd.OpenFormの引数を、DoCmd.OpenForm "フォームB", , , , , ,IDにし(1つ引数を増やしました)、MsgBox testで確認しました。しかし空文字でした
2つ目は、DoCmd.OpenFormの引数を、DoCmd.OpenForm "フォームB", , , , , IDにし(元に戻しました)、Private Sub コマンド9_Clickの引数をCancel As Integerにして、IsNull(Me.OpenArgs)で確認、
「プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません」というエラーがでてきて落ちました
3つ目はPublic test As IntegerをフォームAに書き、MsgBox testで出力。結果空文字

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

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

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

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

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

guest

回答2

0

フォームを開くときに、そのフォームに値を渡す方法としては、OpenArgs引数というものが用意されています。
せっかく用意してくれているので、それを使うのがいいでしょう。

OpenFormにカーソルをおいてF1キーを押すと下記のヘルプページが表示されます。

DoCmd.OpenForm メソッド (Access) | Microsoft Learn
構文
expression.OpenForm (FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)
パラメータ
・・・
OpenArgs 省略可能 バリアント型 文字列式。 この式は、フォームの OpenArgs プロパティを設定するために使用されます。 この設定は、Open イベント プロシージャなどのフォーム モジュールのコードで使用可能です。 OpenArgs プロパティは、マクロや式でも参照できます。

vba

1'フォームA 2Public test As Integer 3Private Sub 詳細情報_Click() 4 'フォームBを開く 5 '質問のコードは引数の位置が間違っている(WindowMode になっている) 6 DoCmd.OpenForm "フォームB", , , , , , Me!id 7 '下記の書き方もできます。引数が多いことは下記の方が分かりやすい。 8 'DoCmd.OpenForm "フォームB", OpenArgs:=Me!id 9End Sub

上記でフォームBのOpenArgsプロパティにMe!idが格納されている。

vba

1'フォームB 2Private Sub コマンド9_Click() 3 If IsNull(Me.OpenArgs) Then 4 MsgBox "引数なし" 5 Else 6 MsgBox Me.OpenArgs 7 End If 8End Sub

「フォーム間で値の受け渡しをしたい」という質問に対する回答は上記になりますが、
その前に何をするためのこの手段を選択したのでしょうか。

詳細情報_Click() というのは、前の質問の
accessにおいて、繰り返しボタンの識別
上記の「詳細」ボタンのことでしょうか。
だとすると、今回の目的は、
一覧フォーム(帳票フォーム)のカレントレコードと同じIDのレコードを詳細フォーム(単票フォーム)に表示したいということではないですか。

だとしたら、
もう一度、上のリンク先の内容をみると、WhereCondition という引数があります。

WhereCondition 省略可能 バリアント型 (Variant) 有効な SQL WHERE 句を文字列式で指定します。ただし、WHERE という語を指定する必要はありません。

「SQL WHERE 句」つまり抽出条件式を渡すことができるということです。
つまり、下記でクリックしたカレントレコードのidと一致するレコードを抽出して表示できます。

vba

1 DoCmd.OpenForm "フォームB", , , "id=" & Me.id 2 '下記の書き方もできます。 3 'DoCmd.OpenForm "フォームB", WhereCondition:="id=" & Me.id

こうすれば、フォームBのコードは不要です。

投稿2022/10/07 07:02

hatena19

総合スコア33715

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

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

syosinsya109

2022/10/07 08:34 編集

回答ありがとうございます。 このプログラムではフィルターに指定したwhere句が入ると思いますが、データ一つ一つを取り出すことは可能なのでしょうか。 例)Me.ID
hatena19

2022/10/07 08:41

フォームBがテーブルと連結したフォームなら、IDと一致したレコードが抽出されますので、そのレコードの全フィールドの値を取り出すことは可能です。IDも当然可能です。 一覧フォームから詳細データを表示したいという目的の場合のコード例になります。
guest

0

ベストアンサー

1つ目は、DoCmd.OpenFormの引数を、DoCmd.OpenForm "フォームB", , , , , ,IDにし(1つ引数を増やしました)、MsgBox testで確認しました。しかし空文字でした

ここでの test は[フォームA]のフォームモジュールのモジュールレベルで宣言された変数ではないため。

3つ目はPublic test As IntegerをフォームAに書き、MsgBox testで出力。結果空文字

同上。

とりあえず[フォームB]のフォームモジュールの先頭にOption Explicit ステートメントを記述されることをお奨めします。

2つ目は、DoCmd.OpenFormの引数を、DoCmd.OpenForm "フォームB", , , , , IDにし(元に戻しました)

それでは引数 OpenArgs ではなく引数 WindowMode に[ID]の値を渡すことになってしまいます。

フォームAからフォームBに値を渡して、表示したい

既に開かれている[フォームA]のコントロール[ID]の値を別のモジュールから直接参照したいのであれば、次のように記述なさればよろしいでしょう。

VBA

1 2MsgBox Forms![フォームA]![ID].Value 3

投稿2022/10/07 05:22

sk.exe

総合スコア744

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

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

syosinsya109

2022/10/07 05:54

回答ありがとうございます。いくつか質問させてください >フォームモジュールのモジュールレベルで宣言された変数ではないため。 とはどういいことでしょうか。publicではだめなのでしょうか >次のように記述なさればよろしいでしょう そのプログラムを使用するとして、デメリットはあるのでしょうか 例)更新したら値が消える。2画面以上の値渡しができない等
sk.exe

2022/10/07 07:11

> publicではだめなのでしょうか その変数が宣言されたモジュールの種類や場所によって、変数のスコープ(適用範囲)は異なります。 フォームモジュールやクラスモジュールのモジュールレベルで宣言された Public 変数は、その変数名だけを記述しても他のモジュールから参照することはできません。 今回のケースならば MsgBox Forms![フォームA].test ように記述すれば他のモジュールからでも一応は参照できますが、その時点での[フォームA]の[ID]を直接参照できればよいなら、いちいち仲介用の変数を設ける必要はないでしょう。 > そのプログラムを使用するとして、デメリットはあるのでしょうか 異なるフォーム間で値の受け渡しを行なう目的が不明であるため、具体的にどのようなケースにおいて問題が発生し得るかについては今のところお答えいたしかねます。
syosinsya109

2022/10/07 07:59

なるほど。。 為になる回答をありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問