• ベストアンサー

accessVBAでのコードの表記方法について

Sub test() Form_親フォーム.Requery Forms("親フォーム").Requery Forms!親フォーム.Requery End Sub 上記のコードで、すべて問題なく実行できるのですが、 それぞれ「○○方式」という書き方の名前をご存知の方教えてくださいませ。

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

  • ベストアンサー
回答No.1

「○○方式」というような名前は特にないと思います。 ただ、それぞれ微妙に動作が異なりますので、注意が必要です。 まず、 Forms("親フォーム").Requery Forms!親フォーム.Requery の二つですがFormsコレクションから参照してます。 Formsコレクションには現在、開いてるフォームが格納されていますので、開いていないフォームを参照しようとするとエラーになります。 また、Forms!親フォーム の参照法の方が高速らしいです。 変数にフォーム名を代入して使用する場合は()で参照する方法を使用します。 Dim FormName As String FormName = "親フォーム" Forms(FormName).Requery 次に、 Form_親フォーム.Requery の方法はあまり一般的ではないです。Form_親フォーム というのはフォームのクラス名で、実態ではないです。クラスとは何かを説明し出すと長くなるので雛形(設計図)みたいなものだととりあえずご理解ください。 この方法は、フォームの「コード保持」が「はい」の時のみ参照できます。(「いいえ」のときはクラスが生成されない。) この方法で参照する場合、フォームが開いているなら、そのフォームを参照します。 フォームが開いていない場合に参照するとフォームを開いて、Requery を実行します。ただし非表示の状態で開かれますので開いたことに気がつきにくいです。下記のようにすると表示されます。 Form_T_業務内容.Requery Form_T_業務内容.Visible = True ですので開いてないときにこの方法で参照すると「開くとき」とか「読み込み時」とか「レコード移動時」にイベントプロシージャが設定されているとそれも連鎖的に実行されてしまいます。 フォームオブジェクトは、サブフォームに埋めこんだり、Newステートメントで開いたりして、複数の実態(フォーム)を生成することが可能です。この場合、クラス名から参照する方法では、どの実態を参照するかはそのとき次第になります。 というようにクラス名で参照する方法はいろいろ複雑かつ難解なのできちんと理解した上で使うことをお勧めします。

RMCNDQGJR
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • AccessVBAコードの間違いを指摘してください

    Microsoft Accessでデータベースを作っています。テーブル「駅時刻リスト」「列車リスト」クエリ「クエリ1」フォーム「一列車フォーム」「サブフォーム」を作りました。「一列車フォーム」から列車コードを選択すると「サブフォーム」の列車が列車コードで絞り込まれるようにするコードを書きました。間違いを指摘してください。 Private Sub 列車コード_AfterUpdate() Me!サブフォーム.Form.Filter = "列車コード like '*' & [Forms]![一列車フォーム]![列車コード] & '*'" Me!サブフォーム.Form.FilterOn = True DoCmd.Requery End Sub

  • サブフォームに対してGoToRecordするには?

    フォームに対してRequeryすると先頭のレコードへ移動してしまうので Requeryする前のレコードの番号を取得して Requery後にそのレコード番号へ移動したいのですが Sub test() i = Forms("Form").Controls("SubForm").Form.CurrentRecord Forms("Form").Controls("SubForm").Requery DoCmd.GoToRecord acActiveDataObject, Forms("Form").Controls("SubForm"), acGoTo, i End Sub これをすると、実行時エラー2498 指定した式は、いずれかの引数とデータ型が対応していません。 になりますが、 どこがおかしいのでしょうか?

  • AccessVBAについてなのですが

    質問なのですが、フォームを2枚開いていて、片方ののボタンクリックイベントからもう1枚のフォームのForm_Loadイベントを実行させたいのですがどうやればよいのでしょうか?実行させたいフォームを閉じてからもう一度開けばいいのですが、フォームを開いたままForm_Loadイベントを起こさせたいのです。Formsコレクションでどうにかやろうと思っているのですが、どうにもならなくなってしまいました。 困っていますのでよろしくお願いいたします

  • AccessVBAでサブフォームの値チェック

    こんにちは。前々回http://okwave.jp/qa/q6556906.htmlにて 質問させて頂いたサブフォームの値チェックをする際のVBAの記述で 教えて頂きたい事ができましたので、質問させて頂きます。 Accessのバージョンは2003です。 以下のようなVBAを記述しているのですが、一度VBAでの処理を実行すると フォームを一度閉じてから再度フォームを開くと該当フィールドの色が 元に戻らず黄色又はマゼンダのままとなってしまっています… 別のAccessにて動作確認した際は、再度フォームを開いてもフィールドの 色は元のままだったのですが… どこが原因なのか教えていただければ幸いです。 長文で見辛いですが宜しくお願いします。 Dim stDocName As String Dim stLinkCriteria As String 'フォーム上のコントロールを格納する変数 Dim ctrl As Control Dim msg As String 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then 'Aの値が15.5未満の場合 If Forms![F_親フォーム].[F_サブフォーム].Form.[A] <= 15.5 Then '背景をピンクに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta Else '背景を黄色に Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow End If 'Bの値が45未満の場合 If Forms![F_親フォーム].[F_サブフォーム].Form.[B] <= 45 Then '背景をピンクに Forms![F_親フォーム].[F_サブフォーム].Form.[B].BackColor = vbMagenta Else '背景を黄色に Forms![F_親フォーム].[F_サブフォーム].Form.[B].BackColor = vbYellow End If End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_親フォーム].[F_サブフォーム].Form.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'msgにテキストボックスの名前を追加 msg = msg & ctrl.Name & vbCrLf 'メッセージボックスに名前を表示 End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else 'ctrl.BackColor = vbWhite stDocName = "F_フォーム1" DoCmd.Close acForm, Me.Name DoCmd.OpenForm stDocName End If Exit_閉じる_Click: Exit Sub Err_閉じる_Click: MsgBox Err.Description Resume Exit_閉じる_Click End Sub

  • AccessVBAにおけるOpenArgsの使用について

    AccessVBAを最近はじめた初心者です。 ~~~フォーム1~~~ Private Sub コマンド0_Click() DoCmd.OpenForm "フォーム2", , , , , , "コマンド0" End Sub Private Sub コマンド1_Click() DoCmd.OpenForm "フォーム2", , , , , , "コマンド1" End Sub ~~~フォーム2~~~ Private Sub Form_Load() Dim strFormName As String strFormName = Forms.フォーム1.OpenArgs DoCmd.PrintOut strFormName End Sub 上のプログラムのようにフォーム1でクリックしたボタンによってフォーム2を読み込んだ時の動作を変えるプログラムを作成しようとしています。 しかし、実際に起動させると、『strFormName = Forms.フォーム1.OpenArgs』の辺りで 「Null の使い方が不正です。」 というエラーメッセージが表示されます。 Accessのヘルプを参照に組んでみたのですが、どの箇所が間違っているのでしょうか? 回答、よろしくお願いします。

  • フォーム1が開いているのならMsgBoxを表示

    Sub マクロ() If フォーム1が開いているのなら Then MsgBox "フォーム1は開いています" End If End Sub アクセスで上記の事をやりたいのですが、コードを教えていただけますか? Sub test() Dim myForm As Form For Each myForm In Forms Debug.Print myForm.Name Next End Sub で、フォームをループできるのですが、いちいちループさせずに、フォーム1だけをつかんで、 起動している(開いている)ならメッセージボックスを表示させたいです。

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、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の値を取得できるのでしょうか? よろしくお願いします。

  • 白のコード(数値)を教えてください。

    Sub test() Dim Field As String Dim MyFormName As String MyFormName = "フォーム" Field = "フィールド1" With Forms(MyFormName).Controls(Field) With .FormatConditions .Delete With .Add(acExpression, , "[" & Field & "]=""test""") .ForeColor = #FFFFFF '白にしたい End With End With End With End Sub フォームに条件付書式を設定したくて上記のコードをVBE画面に貼りつけたのですが 文字色を白にしたいのです。 しかしデザインビューで白を確認すると、「#FFFFFF」となってしまい、 VBAコードに貼りつけるとコンパイルエラーになります。 アクセス2007です。 白のコード(数値)を教えてください。

  • Nullについて

    こんばんは!よろしくお願いします。 新規に作成したフォームにコンボボックスを設置して Sub test1() If Form_フォーム1.コンボ0.Value = Null Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub Sub test2() If IsNull(Form_フォーム1.コンボ0.Value) = True Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub 上記2つのサンプルを実行した時に、 test1のほうだけ 実行時エラー94 Nullの使い方が不正です。 となります。 ウォッチウインドウで見ていくと、 「オブジェクト変数、またはwithブロック変数が設定されていません。」 となりますが 「If Form_フォーム1.コンボ0.Value = Null Then」 を通過したら Nullになります。 何が起こっているのでしょうか?

  • サブフォームのコントロールの値を取得したい(VBA)

    連続投稿失礼します。 ファーム1のなかにサブフォーム(フォーム2)を設置しました。 フォーム2の中にはテキスト1があります。 VBAでテキスト1の値を取得したいのですがうまくいきません。 フォーム2を開いた状態で、 Sub test1() MsgBox Forms("フォーム2").Controls("テキスト1") End Sub を行なうと、 「あああ」 が返ってくるのですが、 フォーム2を閉じて、 フォーム1を開き、上のコードを実行すると、 「マクロの式、またはVisual Basicのコードで参照されている 'フォーム2'フォームが見つかりません。」 となってしまいます。 普段はフォーム2は閉じ、フォーム1を開いて使うため、 この状態でのVBAコードが知りたいです。 ちなみに変数を代入したいので 「Form_フォーム2.テキスト1」の書き方よりカッコでくくる書き方でご回答いただければ助かります。 よろしくお願いします。

専門家に質問してみよう