高校三年生の合唱祭で何を歌いましたか?

お世話になります。
ご存知のかた、ご教授お願いします。


アクセス2013 を使用しています。

メイン画面から、検索画面を呼び出し、検索画面で
対象のデータを選択後、メイン画面の表示を更新したい。

現在サブフォームで Forms!フォーム名.関数名 で、
呼び出し元フォームの値を更新しています。

これを変数で可変にしたいのですが(イメージは下)

aaa = "受注画面"
bbb = "商品表示"
(受注画面のpublic sub に商品表示があります)

forms(aaa).商品表示 だと実施できますが、

forms!aaa.bbb

当然?のようにできません。
何か方法はありませんか?

商品コードを検索するような検索画面は、多くの画面で
使用することがあると思います。
そのつど、呼び出し元フォームごとに、検索画面を作っていたら
フォーム数が非常に多くなりますよね?
その回避の仕方が知りたいのです。
私は、上記の方法しか思いつきませんでしたが、ほかにもあれば
ご教授よろしくお願いします。

A 回答 (8件)

追加補足です。



呼び出し元で

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

これで呼び出した側のプロシージャを呼び出せます。
    • good
    • 0
この回答へのお礼

kmetuさま

ご丁寧な回答をありがとうございます。

まさに、これを求めていました。本当に感謝いたします。

今日は、すっきり寝れそうです。

CallByName 初めてしりました。

ありがとうございました!

お礼日時:2013/08/24 20:39

メイン:売上履歴


サブ_:売上明細 サブフォーム
検索_:商品検索

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さんの最初の回答が宜しいかと・・・。
「アクセス 別フォームの関数の実行について」の回答画像8
    • good
    • 0
この回答へのお礼

本当にご丁寧にありがとうございます。

public変数 を使うのはいやだったのですが、
やり方がわからなくて・・・

引数渡しがいいですね。

おふた方のおかげさまで、無事1つは解決したのですが、
新たな問題が発生しました。

再度、質問させていただくことにします。

本当にありがとうございました。

お礼日時:2013/08/24 23:23

> Me.nameの受け渡しと同時にMe.nameに作った、public sub 関数名() を


> 変数等々にいれ、渡し、実行する方法はありませんか?

呼び出し側のプロシージャで値変更するのではなく、新たに呼び出される側に値変更プロシージャを作るという考え方です。変更したいコントロール名の受け渡し方は追加補足したのでそちらを参考にしてください。
    • good
    • 0
この回答へのお礼

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変数
ほか・・・

やっぱり無理なのでしょうか・・・

お礼日時:2013/08/24 19:00

追加補足です



DoCmd.OpenForm stDocname, , , , , , Me.Name & "!得意先ID"

とかにしておくと変更したいコントロールを呼び出し元で指定しておけます。

検索画面フォームのプロシージャでは

 Forms(Me.OpenArgs) = Me![ID]

で済ませられます。
    • good
    • 0

補足:失礼!広域変数でも全く同じこと。

ですから、私もNo2さんも質問者も、やろうとしていることは同じ。ただ、

forms!aaa.bbb

の書き方。そこは、先のリンクを参照されて下さい。

forms(aaa).controls(bbb)

なんて書け、OKな筈です。「ほとんど正しい」と言った理由です。
    • good
    • 0

>検索フォームに呼び出し元のフォーム名と更新するコントロール名とを渡せば汎用化できます。



No2さんは、ここを具体的に示されています。
ですから、両者は、同じ主旨。

一つ違うと言えば、コントロール名も渡す点です。
    • good
    • 0

呼び出し元のプロシージャを使うのではなくて、呼び出し元のフォーム名を引数として検索画面に渡して検索画面のプロシージャで処理するのはいかがでしょう



OpenFormメソッドのOpenArgs引数でフォーム名を渡す

DoCmd.OpenForm "検索画面フォーム", , , , , , Me.Name

検索画面フォームのプロシージャで、変数Me.OpenArgs(呼び出したフォームの名前が入っている)を利用して呼び出し元フォームのコントロールの値を変更してください。

Forms(Me.OpenArgs)![得意先ID] = Me![ID]

みたいな感じです。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。

得意先IDの部分も可変にしたいのですが・・・

Me.nameの受け渡しと同時にMe.nameに作った、public sub 関数名() を
変数等々にいれ、渡し、実行する方法はありませんか?

それとも、画面表示の関数は、どの画面も同じ関数名にしてしまったほうが
早いのでしょうか?

お礼日時:2013/08/24 17:27

http://msdn.microsoft.com/ja-jp/library/office/f …

検索フォームに呼び出し元のフォーム名と更新するコントロール名とを渡せば汎用化できます。それを基に呼び出し元を更新するコードは、ほとんど正しいと言えます。コントロールを指定されると完璧かと思いますよ。
    • good
    • 0
この回答へのお礼

早速、ありがとうございます。

public sub 関数名() も、controls になるのですか?

No2の方のご回答のような呼び出し方はしておらず、
nameForms = "フォーム名"
nameControls = "関数名"
DoCmd.OpenForm "検索画面"

nameFormsとnameControsは、標準モジュールでpublic宣言しています。

お礼日時:2013/08/24 17:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報