たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_フォームの操作その1_フォームから別のフォームを開閉

一度に複数のフォームを開く方法・現在のフォームから別のフォームを開く方法

Docmdオブジェクトの【Open】メソッドのおさらい

オブジェクトを開く各書式を復習する
※オブジェクト名以外の引数はほぼ省略可能

OpenTableメソッド , OpenQueryメソッド

 Docmd.OpenTable テーブル名 , ビュー , モード
 Docmd.OpenQuery クエリ名 , ビュー , モード

Docmd.OpenTable "KEN_ALL",acViewNormal,acEdit 'ビューとモードの両方が規定値なので、明示しなくても結果は同じだが例として記載
OpenReportメソッド

 Docmd.OpenReport レポート名 , ビュー , フィルタ名 , フィルタ条件式 , 表示モード , OpenArgs

Docmd.OpenReport "R_KEN_ALL",acViewPreview '印刷プレビュー画面で開く
Docmd.OpenReport "R_KEN_ALL" '2引数が規定値の「acViewNormal」つまり印刷が実行される
OpenFormメソッド★★今回の主役

 Docmd.OpenForm フォーム名 , ビュー , フィルタ名 , フィルタ条件式 , データモード , 表示モード , OpenArgs

Docmd.OpenForm "F_KEN_ALL",acNormal,,,acFormReadOnly,acDialog '読み取り専用かつダイアログ画面で開く

※定数acDialogを使用する場合、基本的にはレコードセレクタ・移動ボタン・スクロールバーを無しとし、境界線スタイルを「ダイアログ」に設定


ケースごとの記述例

フォームモジュール内のボタンやその他イベントに記述
※以下の例における前提条件:現フォーム「F_KEN_ALL1」から別フォーム「F_KEN_ALL2」を開く

現フォームのボタン1をクリックで別フォームを開く
Private Sub btn1_Click() 'フォーム「F_KEN_ALL1」のフォームモジュールに記載
Docmd.OpenForm "F_KEN_ALL2"
End Sub
現フォーム内のラベル「郵便番号」が空白でない時だけ、現フォームのボタン1をクリックで別フォームを開く
Private Sub btn1_Click() 'フォーム「F_KEN_ALL1」のフォームモジュールに記載
 If Not IsNull(Me.郵便番号.Value) Then
  Docmd.OpenForm "F_KEN_ALL2",,,"郵便番号 = " & Me.郵便番号.Value '4引数のフィルタ条件式で指定したレコードの内容を別フォーム上に表示
 End If
End Sub
現フォームがアクティブになるよう切り替える
Private Sub btn1_Click() 'フォーム「F_KEN_ALL2」のフォームモジュールに記載
 Docmd.SelectObject acForm "F_KEN_ALL1"
End Sub

※SelectObjectメソッドを使用(すっかり忘れている…)

【Screen.ActiveForm】アクティブなフォームの参照

ScreenオブジェクトのActiveプロパティを使用し、現在アクティブになっているオブジェクトを参照

▼おもなActiveプロパティ▼
Screen.ActiveForm
Screen.ActiveReport
Screen.ActiveControl

アクティブになっている別フォーム上のボタン2で自身(別フォーム)を閉じる
Private Sub btn2_Click() 'フォーム「F_KEN_AL2」のフォームモジュールに記載
 Docmd.Close acForm, Screen.ActiveForm.Name
End Sub



ほんとうは、実際のフォームをキャプチャするのがよいのだが、め...