
お世話になります。
ご存知のかた、ご教授お願いします。
アクセス2013 を使用しています。
メイン画面から、検索画面を呼び出し、検索画面で
対象のデータを選択後、メイン画面の表示を更新したい。
現在サブフォームで Forms!フォーム名.関数名 で、
呼び出し元フォームの値を更新しています。
これを変数で可変にしたいのですが(イメージは下)
aaa = "受注画面"
bbb = "商品表示"
(受注画面のpublic sub に商品表示があります)
forms(aaa).商品表示 だと実施できますが、
forms!aaa.bbb
当然?のようにできません。
何か方法はありませんか?
商品コードを検索するような検索画面は、多くの画面で
使用することがあると思います。
そのつど、呼び出し元フォームごとに、検索画面を作っていたら
フォーム数が非常に多くなりますよね?
その回避の仕方が知りたいのです。
私は、上記の方法しか思いつきませんでしたが、ほかにもあれば
ご教授よろしくお願いします。
No.7ベストアンサー
- 回答日時:
追加補足です。
呼び出し元で
DoCmd.OpenForm stDocname, , , , , , Me.Name & ".プロシージャ名"
注:プロシージャ名の前にドットがあります
検索フォームで
Pos = InStr(Me.OpenArgs, ".")
Set MyFrm = Forms(Left(Me.OpenArgs, Pos - 1))
ProcName = Right(Me.OpenArgs, Len(Me.OpenArgs) - Pos)
CallByName MyFrm, ProcName, VbMethod
これで呼び出した側のプロシージャを呼び出せます。
kmetuさま
ご丁寧な回答をありがとうございます。
まさに、これを求めていました。本当に感謝いたします。
今日は、すっきり寝れそうです。
CallByName 初めてしりました。
ありがとうございました!
No.8
- 回答日時:
メイン:売上履歴
サブ_:売上明細 サブフォーム
検索_:商品検索
Private Sub コマンド_フォームを閉じる_Click()
Dim mNmae As String
Dim sName As String
Dim cName As String
mName = "売上履歴"
sName = "売上明細 サブフォーム"
cNmae = "商品名"
Forms(mName).Controls(sName).Controls(cNmae).Value = "AAAA"
DoCmd.Close
End Sub
これで書き込みましたよ。
もちろん、OpenArgs()で値は引き渡します。
>広域変数は便利だが利用は控えめに。
>それは、コードを判りにくくする。
(カーニハン&リッチー)
ですから、No2さんの最初の回答が宜しいかと・・・。

本当にご丁寧にありがとうございます。
public変数 を使うのはいやだったのですが、
やり方がわからなくて・・・
引数渡しがいいですね。
おふた方のおかげさまで、無事1つは解決したのですが、
新たな問題が発生しました。
再度、質問させていただくことにします。
本当にありがとうございました。
No.6
- 回答日時:
> Me.nameの受け渡しと同時にMe.nameに作った、public sub 関数名() を
> 変数等々にいれ、渡し、実行する方法はありませんか?
呼び出し側のプロシージャで値変更するのではなく、新たに呼び出される側に値変更プロシージャを作るという考え方です。変更したいコントロール名の受け渡し方は追加補足したのでそちらを参考にしてください。
f_a_007さん、kmetuさん
ご丁寧な回答をありがとうございます。
私の質問の仕方がまずかったのかも知れませんので、今一度・・・
元フォームには、その画面上の情報を表示するための関数があります。
その関数は簡単には、
public sub 画面表示()
sqlの組み立て
sql = "select * from data where 商品コード = '" & txt商品コード.value & "'"
sqlの実行
set rc = cn.execute(sql)
データの表示
txt商品名.value = rc("商品名")
txt価格.value = rc("価格")
end sub
といった感じです。
ですので、呼び出された側から、この関数を呼び出したいのです。
呼び出された側のフォームから、元フォームのテキストボックスには
値を入れることができますが、この関数を実行することができず、
悩んでおります。
あと、f_a_007さまのとおり、いろいろやってみましたが、結果は、エラーです。
プロパティの使い方が不正だとか、オブジェクトがありませんだとか・・・
forms(me.parent.openargs).controls(画面表示関数名を格納したpublic変数)
call forms(me.parent.openargs).controls(画面表示関数名を格納したpublic変数)
call forms(me.parent.openargs).画面表示関数名を格納したpublic変数
forms!me.parent.openargs.画面表示関数名を格納したpublic変数
ほか・・・
やっぱり無理なのでしょうか・・・
No.5
- 回答日時:
追加補足です
DoCmd.OpenForm stDocname, , , , , , Me.Name & "!得意先ID"
とかにしておくと変更したいコントロールを呼び出し元で指定しておけます。
検索画面フォームのプロシージャでは
Forms(Me.OpenArgs) = Me![ID]
で済ませられます。
No.4
- 回答日時:
補足:失礼!広域変数でも全く同じこと。
ですから、私もNo2さんも質問者も、やろうとしていることは同じ。ただ、forms!aaa.bbb
の書き方。そこは、先のリンクを参照されて下さい。
forms(aaa).controls(bbb)
なんて書け、OKな筈です。「ほとんど正しい」と言った理由です。
No.3
- 回答日時:
>検索フォームに呼び出し元のフォーム名と更新するコントロール名とを渡せば汎用化できます。
No2さんは、ここを具体的に示されています。
ですから、両者は、同じ主旨。
一つ違うと言えば、コントロール名も渡す点です。
No.2
- 回答日時:
呼び出し元のプロシージャを使うのではなくて、呼び出し元のフォーム名を引数として検索画面に渡して検索画面のプロシージャで処理するのはいかがでしょう
OpenFormメソッドのOpenArgs引数でフォーム名を渡す
DoCmd.OpenForm "検索画面フォーム", , , , , , Me.Name
検索画面フォームのプロシージャで、変数Me.OpenArgs(呼び出したフォームの名前が入っている)を利用して呼び出し元フォームのコントロールの値を変更してください。
Forms(Me.OpenArgs)![得意先ID] = Me![ID]
みたいな感じです。
早速ありがとうございます。
得意先IDの部分も可変にしたいのですが・・・
Me.nameの受け渡しと同時にMe.nameに作った、public sub 関数名() を
変数等々にいれ、渡し、実行する方法はありませんか?
それとも、画面表示の関数は、どの画面も同じ関数名にしてしまったほうが
早いのでしょうか?
No.1
- 回答日時:
検索フォームに呼び出し元のフォーム名と更新するコントロール名とを渡せば汎用化できます。それを基に呼び出し元を更新するコードは、ほとんど正しいと言えます。コントロールを指定されると完璧かと思いますよ。
早速、ありがとうございます。
public sub 関数名() も、controls になるのですか?
No2の方のご回答のような呼び出し方はしておらず、
nameForms = "フォーム名"
nameControls = "関数名"
DoCmd.OpenForm "検索画面"
nameFormsとnameControsは、標準モジュールでpublic宣言しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript テーブルの中のセレクトボックスの値が0のとき、非表示にしたい 3 2022/05/29 10:13
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- Access(アクセス) Accessでセレクタをダブルクリックで別フォームで詳細表示 3 2022/12/20 10:36
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Excel(エクセル) Excelマクロの表示のExcel内をfindで検索 3 2022/06/15 20:07
- iOS iPhoneの画面が見切れて困ってます ゲーム画面などで文字が見切れてしまっていたり タップする部分 2 2022/07/05 22:45
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
このQ&Aを見た人はこんなQ&Aも見ています
-
他のフォームから別のフォームのサブルーチンを呼び出す
Visual Basic(VBA)
-
AccessVBA SetFocusとGoToControlが正常に作動しない
Access(アクセス)
-
【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには
Access(アクセス)
-
-
4
Access サブフォームでの選択行の取得
その他(データベース)
-
5
アクセスVBAのMe!と[ ]
Access(アクセス)
-
6
Accessでレコードを別テーブルへコピーするには
Access(アクセス)
-
7
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Accessで、一つのフォーム画面...
-
VBAのテキストフォームの折り返...
-
エクセルのチェックボックスの...
-
フォームのテキストボックスな...
-
EXCEL VBA ユーザーフォームの...
-
ACCESSのフォーム、開くんです...
-
Microsoft Formsの「個人情報や...
-
ExcelVBAのユーザーフォームでe...
-
フォームを画面の下側ぴったり...
-
クリックイベントなのに、2回ク...
-
テキストボックス入力データの...
-
フォームウィンドウを最前面に...
-
クリックした場所にFormを開く
-
C# formの2重起動禁止
-
コントロールの存在確認
-
LoginForm がないのですが
-
ACCESS VBA ウィンドウを閉じる
-
VBAでユーザーフォームを再表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Form_Load と Form_Activate の...
-
VBAでユーザーフォームを再表示...
-
Microsoft Formsの「個人情報や...
-
クリックイベントなのに、2回ク...
-
ユーザーフォームのテキストボ...
-
ユーザーフォーム上に現在日時...
-
ACCESSのフォーム、開くんです...
-
エクセルのチェックボックスの...
-
エクセルVBAのフォームを最...
-
VB.NETでフォームロード中のエ...
-
EXCEL VBA ユーザーフォームの...
-
VBA(エクセル)のユーザー...
-
【Excel VBA】ユーザフォームを...
-
Hideについて(.NET)
-
(Excel+VBA)ユーザーフォームの...
-
モーダルフォームとモードレス...
-
VBA コンボボックスとテキスト...
-
アクセス2013 フォームが...
おすすめ情報