Accessでフォームを開いたり閉じたりする事は頻繁に利用するコマンドですので、VBAを覚えておくと非常に重宝します。
VBAで書く際、開く場合も閉じる場合も、当該フォームが現在閉じているのか?開いているのか?を確認した上で実行して下さい。開いていないフォームに対して閉じるように実行しても閉じる事は出来ませんので、必ず開いている事を確認した上で閉じるようにしましょう。
VBAでフォームを開く
まずはフォームを開く場合について説明します。Access VBAを使って、フォームを開く時は、DoCmdのOpenFormを使用します。
DoCmd.OpenForm "F000売上伝票一覧", acNormal, , , acFormEdit , acWindowNormal※ 「acNormal」はフォームを開く場合で、印刷プレビューを開く場合は「acPreview」と記述します。
※ 「acFormEdit」は編集フォームを指定(つまり入力編集するフォームを指定)で、もし読み取り専用で開く場合は「acFormReadOnly」と記述します。
VBAでフォームを開く時は、開くレコードを抽出する値を指定したり、開くフォームに値を渡したりすることもできます。
尚、上記で記載しましたが、実際フォームを開く時は、必ずこれから開くフォームが既に開いていないか確認した上で開くようにしましょう。
If CurrentProject.AllForms("F000売上伝票入力フォーム").IsLoaded = True Then
Dim nRet As Long
nRet = MsgBox("編集中の伝票がありますが、破棄して新規伝票を開きますか?", vbYesNo + vbQuestion + vbDefaultButton3, "編集中伝票確認")
If nRet = vbNo Then
'新規伝票を開かずに、編集中の伝票を保持する
Forms!F000売上伝票入力フォーム_D.Recalc
Forms!F000売上伝票入力フォーム_D.SetFocus
Exit Sub
End If
End If
DoCmd.Close acForm, "F000売上伝票入力フォームD", acSaveNo
DoCmd.OpenForm "F000売上伝票入力フォームD", acNormal, , , acFormEdit, acWindowNormal
上記のサンプルでは、開く前にフォームが開いていないか確認し、もし開いていた場合は「破棄して開きますか?」と確認メッセージを出し「はい」の場合は、開いているフォームを先に閉じてから再度フォームを新規に開いています。
「いいえ」の場合は、フォームを閉じずにフォーカスのみ開いているフォームに渡す処理を書いています。
VBAでフォームを閉じる
Access VBAで、開いているフォームを閉じる時は、DoCmdのCloseを使います。
DoCmd.Close acForm, "F000売上伝票一覧", acSaveNo
※ 「acForm」部分は、レポートの場合は「acReport」と記述。
※ ”F000売上伝票一覧”部分には、閉じたいフォーム名を記述。
※ 「acSaveNo」は保存せずに即閉じる。確認ダイアログにて閉じたい場合は「acSavePrompt」と記述。自動保存する場合は「acSaveYes」。
現実的には、閉じようとするフォームが開いているか開いていないかを確認してから閉じる処理を実行した方がよいので
If CurrentProject.AllForms("F000売上伝票一覧").IsLoaded = True Then
DoCmd.Close acForm, "F000売上伝票一覧", acSaveNo
End If
として使えば、開いているフォームのみ閉じる処理を実行させることが出来る。
そんなの面倒やん!という時は
DoCmd.Close
だけでも現在処理を実行しているフォームを閉じる事が出来る。
VBAとマクロ。どっちがよいのか?
私もAccessでの開発はそれほど長けてはいませんけど、「マクロとVBA、どっちがいい」という質問をされる事があります。個人的な意見になりますが、VBAでもマクロでも、複数人で開発しない限りは、処理がマクロで作る事が可能であれば作り手が使いやすい方を使用すればいいと思います。
複雑な処理になればなるほど、マクロで作るよりはVBAで書いた方が早いし分かりやすいかと思いますが、マクロはプログラミングを知らない人が使うのもので駄目という事は全くないです。ですので、マクロの方が使いやすかったり分かりやすいのであれば、マクロでどんどん処理を書いてください。
但し規模が大きくなってきますと、改良・改造したりする際はマクロの場合はちょっと分かりにくかったり作業がやりにくかったりという支障が出てきます。
私の場合ですが、Microsoft Accessで開発する時は、基本マクロは使わないので処理の殆どはVBAでゴリゴリ書いています。マクロも使えば非常に便利なのは分かりますが、マウスで色々選択・クリックするよりは、ソースを書いた方が早いし、自分的には後で見やすく、エラーなど修正時にはマクロに比べて作業が捗ります。
マクロもVBAも、ご自身がやりやすい方で作っていきましょう!
