備忘録記事です。Accessでの話。VBAで動的にフォームを作成(生成)した際の処理。以下のことをしたい場合のヒント。
- 生成したフォームを画面中央で開きたい
- 配置したコントロールにプロシージャを割り当てたい
- 一連の処理終了後にはフォームは保存せずに消去(削除)したい
通常は「保存せずに」処理をするものらしい
いろんな解説サイトを読んでいると、動的に生成したフォームは、プロシージャのコード中で利用するだけであり、フォームを保存したり再利用するようなことはあんまりないらしい。ので、「保存する」という話がそもそもナンセンスなのかもしれません。
ただ、今回の備忘録の場合以下の点をクリアするためにどうしても一旦保存する必要がありました。
- フォームをModal(作業ウィンドウ固定)にしたい・・・編集モードのまま「Modal=True」にしても固定にならない
- 画面中央で開きたい・・・これも編集モードの時点で「中央配置」にしていしてもそのまま開くと中央に配置されない
生成~保存まで
Private pStrFName as String・・・同じモジュール内で再利用するのでPrivate変数にしておく
Public Sub Createフォーム() ・・・「Createフォーム()」は任意名でOK
Dim F As Access.Form
Set F =CreateForm()
With F ~ここにプロパティの指定などを書く~(以下、例)
.DefaultView=0
strFName=.Name ・・・生成したフォームのフォーム名を取得しておく
End With
DoCmd.Close , , acSaveYes ・・・ここで一旦保存して閉じる
End Sub
保存したフォームを開く
Public Sub Openフォーム() ・・・「Openフォーム()」は任意名でOK
DoCmd.OpenForm pStrFName, , , , , acDialog
End Sub
使い終えたフォームを閉じて削除する
処理のたびにフォームを生成するわけだから、利用し終えたフォームは閉じて削除する。
ただ、なぜかAccess2016ではフォームを閉じた直後にフォームオブジェクトの削除をしようとするとエラーが発生するため、閉じたあと一旦リネームしてから削除すると良い(←多分ここがポイント)
Public Sub Closeフォーム() ・・・「Closeフォーム()」は任意名でOK
DoCmd.Close acForm,pStrFName
DoCmd.Rename “変更後のフォーム名”,acForm,pStrFName ・・・”変更後のフォーム名”は任意でOK
DoCmd.DeleteObject acForm, “変更後のフォーム名”
End Sub
ということで、ご参考にされる方は自己責任にてどうぞ。