• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセス 別フォームの関数の実行について)

Access別フォームでの関数実行について

このQ&Aのポイント
  • Accessを使用してメイン画面から別のフォームの関数を実行する方法について教えてください。
  • 現在、サブフォームを使用して呼び出し元フォームの値を更新していますが、変数を使用して可変にしたいです。
  • 特定のフォームごとに検索画面を作成せずに、どのフォームでも使用できる検索画面の作成方法を知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答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 これで呼び出した側のプロシージャを呼び出せます。

123daa
質問者

お礼

kmetuさま ご丁寧な回答をありがとうございます。 まさに、これを求めていました。本当に感謝いたします。 今日は、すっきり寝れそうです。 CallByName 初めてしりました。 ありがとうございました!

その他の回答 (7)

回答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さんの最初の回答が宜しいかと・・・。

123daa
質問者

お礼

本当にご丁寧にありがとうございます。 public変数 を使うのはいやだったのですが、 やり方がわからなくて・・・ 引数渡しがいいですね。 おふた方のおかげさまで、無事1つは解決したのですが、 新たな問題が発生しました。 再度、質問させていただくことにします。 本当にありがとうございました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.6

> Me.nameの受け渡しと同時にMe.nameに作った、public sub 関数名() を > 変数等々にいれ、渡し、実行する方法はありませんか? 呼び出し側のプロシージャで値変更するのではなく、新たに呼び出される側に値変更プロシージャを作るという考え方です。変更したいコントロール名の受け渡し方は追加補足したのでそちらを参考にしてください。

123daa
質問者

お礼

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変数 ほか・・・ やっぱり無理なのでしょうか・・・

  • kmetu
  • ベストアンサー率41% (562/1346)
回答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さんは、ここを具体的に示されています。 ですから、両者は、同じ主旨。 一つ違うと言えば、コントロール名も渡す点です。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

呼び出し元のプロシージャを使うのではなくて、呼び出し元のフォーム名を引数として検索画面に渡して検索画面のプロシージャで処理するのはいかがでしょう OpenFormメソッドのOpenArgs引数でフォーム名を渡す DoCmd.OpenForm "検索画面フォーム", , , , , , Me.Name 検索画面フォームのプロシージャで、変数Me.OpenArgs(呼び出したフォームの名前が入っている)を利用して呼び出し元フォームのコントロールの値を変更してください。 Forms(Me.OpenArgs)![得意先ID] = Me![ID] みたいな感じです。

123daa
質問者

お礼

早速ありがとうございます。 得意先IDの部分も可変にしたいのですが・・・ Me.nameの受け渡しと同時にMe.nameに作った、public sub 関数名() を 変数等々にいれ、渡し、実行する方法はありませんか? それとも、画面表示の関数は、どの画面も同じ関数名にしてしまったほうが 早いのでしょうか?

回答No.1

http://msdn.microsoft.com/ja-jp/library/office/ff195841.aspx 検索フォームに呼び出し元のフォーム名と更新するコントロール名とを渡せば汎用化できます。それを基に呼び出し元を更新するコードは、ほとんど正しいと言えます。コントロールを指定されると完璧かと思いますよ。

123daa
質問者

お礼

早速、ありがとうございます。 public sub 関数名() も、controls になるのですか? No2の方のご回答のような呼び出し方はしておらず、 nameForms = "フォーム名" nameControls = "関数名" DoCmd.OpenForm "検索画面" nameFormsとnameControsは、標準モジュールでpublic宣言しています。

関連するQ&A