14歳の自分に衝撃の事実を告げてください

サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。

Sub test1()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
End Sub
*******************************************************************
Sub test2()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource

End Sub

オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)
*******************************************************************
Sub test3()

Dim サブフォーム As String
Dim フォーム As String

フォーム = "土台"
サブフォーム = "フォーム1"

MsgBox Forms(サブフォーム).RecordSource

End Sub

実行時エラー'2450'
マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。
*******************************************************************
test1~3のうち
test1のみはうまくいくのですが
変数を代入したいです。
ヘルフ゜のには
Forms![受注]![受注サブフォーム].Formとなってますが
これじゃ変数を代入できないですよね。

どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか?

よろしくお願いします。

A 回答 (2件)

No.1です。



> この「.Form」はどこにつければいいのでしょうか?

えーと・・・すみません、後半に余計な説明が多すぎたようです(汗)
一応、前回回答の前半部分に書いていたんですが、式としては

 MsgBox Forms(フォーム).Controls(サブフォーム).Form.RecordSource

になります。

蛇足ついでに、式の構成を簡単に(?)説明すると、
 Forms(~)
  展開済のフォーム群(=複数形:Formsコレクション)から、指定された
  名前のフォームを参照
 Controls(~)
  そのフォーム内のコントロール群(=複数形:Controlsコレクション)から、
  指定された名前のコントロールを参照
 Form.RecordSource
  指定したコントロール(サブフォーム)の、フォームとしてのプロパティ
  (ここではRecordSource)を参照
  (「Form」プロパティを経由しないと、サブフォームの「RecordSource」
   プロパティを参照できない、ということ)
ということです。

※「Forms」と「Form」は英単語上は前者が後者の複数形という関係ですが、
 プログラム上での関連性は薄いので、前者が前側につき、後者が後ろ側
 につくのは、「コレクションやプロパティの使い方・定義がそうなって
 いるから」として割り切るしかないかと思います(汗)


・・・また余計な説明が長くなりすぎた気がしますが(汗)、参考まで。
    • good
    • 0
この回答へのお礼

すいません。
読みこぼしていました。
試してみたらうまくいきました。
豆知識も大変参考になりました。
また何かあったらよろしくお願いします。

お礼日時:2009/04/30 23:47

変数名に全角文字を使用することの是非は、この際おいておくとして・・・(汗)



【サブフォームのRecordSourceをMsgBoxに表示する場合の式】
  MsgBox Forms(フォーム).Controls(サブフォーム).Form.RecordSource

※蛇足かもしれませんが、サブフォームの、
  「コントロールとしての名前」(プロパティシートの「その他」タブの「名前」)と
  「表示に使用しているフォームの名前」(同「データ」タブの「ソースオブジェクト」)
 が違っている場合は、注意が必要です。
 (「サブフォーム」に入れるのは「コントロールとしての名前」の方になります)


【エラーの原因】
<test2>
通常のフォームは「Forms(フォーム名).RecordSource」で参照できますが、
サブフォームの場合、「Forms(フォーム).Controls(サブフォーム)」の時点では
「Controls」という言葉が示す通り「コントロールとしてのサブフォーム」が
参照されている形になります。
そのため、「サブフォームの、フォームとしてのプロパティ(RecordSource等)」の
参照には、「.Form」(メインフォームの参照時と違い、ここは「s」が入らない)が
必要になります。
(コントロールとしてのサブフォームには「RecordSource」というプロパティが
 ないため、「プロパティをサポートしていない」というエラーになる、と)
※コントロールとしてのサブフォーム」のプロパティ、例えば「ソースオブジェクト
 (SourceObject)」などを参照する場合は、「.Form」は無用です。
 (MsgBox Forms(フォーム名).Controls(サブフォーム名).SourceObject)


<test3>
「Forms(フォーム)」の構文で指定できるのは、メインフォームとして展開している
フォームに限られます。
そのため、「フォーム1」フォームが「土台」フォーム内のサブフォームとしてのみ
開いていて、メインフォームとして開かれてはいない場合は、ご質問にあるように
「フォームが見つかりません」(「フォーム名」となっているのは、打ち間違い?)
というエラーになります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
変数名については以後気をつけます。
<test3>については理解できました。

<test2>については理解力がなくよくわからないのですが
>そのため、「サブフォームの、フォームとしてのプロパティ(RecordSource等)」の
>参照には、「.Form」(メインフォームの参照時と違い、ここは「s」が入らない)が
必要になります。


この「.Form」はどこにつければいいのでしょうか?

MsgBox Form(サブフォーム).RecordSource
MsgBox Forms(フォーム).Form(サブフォーム).RecordSource
MsgBox Forms(フォーム).Form.Controls(サブフォーム).RecordSource
もエラーになってしまいました。

お礼日時:2009/04/29 20:50

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

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


おすすめ情報

このQ&Aを見た人がよく見るQ&A