ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

【Access VBA】フォームを開く・閉じる方法|DoCmd.OpenFormの基本と実務テンプレ

Access VBAでフォームを開くには、DoCmd.OpenFormメソッドを使用します。
また、開いたフォームを閉じる場合は DoCmd.Closeメソッドを使用します。

この記事で学習できること
  • AccessフォームをVBAで開く方法(OpenFormメソッド)
  • フォームを閉じる方法(Closeメソッド)
  • ポップアップでフォームを開く方法
  • Access起動時にフォームを自動で開く方法(AutoExecマクロ)

フォームを開く基本コードは次のとおりです。

DoCmd.OpenForm "フォーム名"

フォームを閉じる場合は次のコードを使用します。

DoCmd.Close acForm, Me.Name

Accessの解説書を勉強して、テーブルやクエリの操作ができるようになると、 「もっと使いやすい画面にできないのかな?」と思うことがあります。

ナビゲーションウィンドウから毎回オブジェクトを探して開くのは、 実際の業務では少し不便です。
そこで使われるのが、フォームをボタンから開く「画面遷移」です。

Accessでは、こうした処理をマクロVBAで作ることができます。
特にVBAを使うことで、業務システムのような動作を柔軟に作ることが可能になります。

フォームの開閉は、Access VBAを学ぶうえで最初に覚えておきたい基本操作です。


また、この記事では、サンプルデータベースダウンロードできます。
購買用データベースからプログラムコードを全て削除しているので、実際にプログラムを書くときに活用してください。

≫ 購買管理DB_コードなし

さらに、「Accessのフォームとは何?」といった疑問に答えた記事も書いていますので、フォームについてもう少し知りたいという方は、よかったらこちらもご覧ください。

https://sys-daddy.com/access-form-beginner

Access VBAでフォームを開く方法(OpenFormメソッド)

DoCmd.OpenFormメソッドは、指定したフォームを開くためのAccess VBAの基本的な命令です。
フォーム名を指定することで、ボタンなどの操作から別の画面を表示することができます。

Access VBAでフォームを開くには、DoCmd.OpenFormメソッドを使用します。
基本構文は次のとおりです。

DoCmd.OpenForm "フォーム名", acNormal

今回のサンプルでは、次のコードでフォーム「F01部品マスタM」を開きます。

DoCmd.OpenForm "F01部品マスタM", acNormal

このコードをボタンのクリックイベントに設定することで、ボタンを押したときにフォームを開くことができます。


1.メインフォームを開く

サンプルデータベースにはプログラムコードが入っていないので、開いてもフォームが開いていない状態です。

オブジェクトウィンドウから、フォーム「F00メイン」をクリックして開きます。

メイン画面が開きました。

2.デザインビューを開く

フォームの見出し部分を右クリックし、デザインビューを選択します。

フォームのデザインビューに切り替わります。
デザインビューでは、ボタンやテキストボックスなどのパーツを配置したり、VBAコードを設定したりすることができます。

3.ボタンのクリックイベントを設定する

ここでは「部品マスタ」ボタンにフォームを開くためのプログラムを追加します。
ボタンをクリックし、プロパティを表示させます。

プロパティが表示されていない時は、ボタンを右クリックすると、メニューが表示されます。
一番下にある「プロパティ」を選択します。

4.イベントプロシージャを作成する

「部品マスタ」ボタンプロパティのイベントタブの順にクリックし、「クリック時」の「イベントプロシージャ」を選択します。

VBEVisual Basic Editor)が起動します。

VBEを確認すると、「部品マスタ_Click」というイベントプロシージャが自動で作成されています。

Private Sub 部品マスタ_Click()

End Sub

このように、Accessフォームのデザインビューから、パーツと動作を選ぶことで、簡単にイベントプロシージャを作成できます。

5.OpenFormコードを記述する

以下のように、フォームを開くコードを記述します。

 Private Sub 部品マスタ_Click()
   DoCmd.OpenForm "F01部品マスタM", acNormal
End Sub

6.動作を確認する

上書き保存した後に、見出しを右クリックし、フォームビューに戻します。

動作確認のために「部品マスタ」ボタンをクリックしましょう。

すると、メイン画面は開いたままの状態で指定したフォームが開きます

これで、メイン画面から一覧フォームを表示させるVBAコードの実装は完了です。

フォームを閉じる方法(Closeメソッド)

Access VBAでフォームを閉じるには、DoCmd.Close メソッドを使用します。
基本構文は次のとおりです。

DoCmd.Close acForm, Me.Name

このコードを実行すると、現在開いているフォームを閉じることができます。

今回は、部品マスタ用のフォームに「戻る」ボタンを設置し、メイン画面に戻る処理を作成します。


1.デザインビューを開く

部品マスタの見出しを右クリックし、デザインビューをクリックします。

2.戻るボタンのクリックイベントを設定する

右上の戻るボタンを右クリックし、VBEを起動させます。

3.Closeメソッドを記述する

右上のアイコン付きの「戻る」ボタンに、フォーム「F00メイン」に戻るためのコードを追加します。

Private Sub 戻る_Click()
    DoCmd.Close acForm, Me.Name
End Sub

4.動作を確認する

フォームビューに戻り、「戻る」ボタンをクリックします。

すると、部品マスタフォームが閉じて、メイン画面に戻ることが確認できます。

Me.Nameの意味

ここでVBAの文法について補足します。
フォームを開く時は、対象のフォーム名を開く必要がありますが、閉じる時はMeを記入します。
Meは、コードを記録しているフォーム自身になります。
Meを記載することで、フォーム名などオブジェクト名の指定を省略することができます。
VBAやVB.NET独自の文法になりますが、とても便利です。

ポップアップでフォームを開く方法

フォーム「F01部品マスタM」部品マスタをデザインモードで開きましょう。

「項目編集」ボタンを選択してコードを挿入します。
以下のようにコードを入力します。

Private Sub 項目編集_Click()
    DoCmd.OpenForm "F01部品マスタT", acNormal
End Sub

上書き保存して、フォームビューに戻します。
項目編集」ボタンをクリックすると、フォーム「F01部品マスタT」が開きます。

F01部品マスタT」を閉じて、コードを以下のように修正します。

 Private Sub 項目編集_Click()
   DoCmd.OpenForm "F01部品マスタT", acNormal, , , , acDialog
End Sub

もう一度フォームを開くと、ポップアップで表示されていることを確認できました。

リストの項目を単票フォームで編集する時は、ポップアップにした方が操作しやすくなります。
ポップアップ形式で開いたフォームは最小化すれば、元のリストを確認することができます。

また、フォームプロパティで、表示形式でポップアップにすれば、同じ動作を設定することができます。

どちらにするかは好みで決めて大丈夫ですが、複数人数で保守する場合はコードで記載した方がメンテナンスしやすいです。

起動時に自動でフォームを開く方法

VBEを開き、メイン画面を開くためのプログラムをコーディングします。

まずは標準モジュールを作成します。
VBEのオブジェクトウインドウ(左側)のどこでもよいので、右クリックします。
挿入」→「標準モジュール」の順に選択します。

Module1」が作成されます。

以下のようにコードを入力します。

Function メイン開く()
    DoCmd.OpenForm "F00メイン", acNormal
End Function

ここでは、SubプロシージャではなくFuntionプロシージャを書きます。
Subプロシージャでは、Access起動時に動作しません。

次に、起動用のマクロを作成します。
マクロの新規作成をクリックします。

マクロの動作を選べるようになっていますが、ここではプロシージャの実行を選択します。

プロシージャを指定する必要がありますので、「メイン開く()」と指定します。

マクロ名を「AutoExec」として保存します。

ここで、別のマクロ名にしても正しくプログラムが作動しません。

AutoExec以外の名前にすることはできません。

一旦データベースを閉じて開き直すと、メイン画面が初めに自動で開きます。

マクロに指定するプロシージャは、Subだと作動しません。Functionにする必要があります。

Runtime版のAccessでシステムを運用させる場合は、AutoExecの作成が必要になります。
Runtime版はオブジェクトウインドウが表示されないので、AutoExecを作成していないと何も表示されなくなります。

DoCmd.OpenFormでよくあるエラー

DoCmd.OpenFormメソッドを使ってフォームを開く処理を作成すると、うまくフォームが開かない場合があります。

ここでは、Access VBAでフォームを開くときに よく発生するエラーと対処方法を紹介します。

フォーム名が間違っている

DoCmd.OpenFormでは、開きたいフォーム名を文字列で指定します。

例えば次のコードでは、フォーム「F01部品マスタM」を開きます。

DoCmd.OpenForm "F01部品マスタM"

このとき、フォーム名のスペルが間違っていると、次のようなエラーが表示されます。

Microsoft Access はフォーム '○○○' を見つけることができません。

このエラーが出た場合は、ナビゲーションウィンドウでフォーム名が正しく指定されているかを確認しましょう。

フォームがすでに開いている

すでに同じフォームが開いている状態で、再度OpenFormを実行すると、意図しない動作になることがあります。

このような場合は、次のように フォームが開いているかを確認してから処理する方法があります。

If CurrentProject.AllForms("F01部品マスタM").IsLoaded Then
    DoCmd.Close acForm, "F01部品マスタM"
End If

DoCmd.OpenForm "F01部品マスタM"

このコードでは、フォームが開いている場合は一度閉じてから再度フォームを開くようにしています。

フォームが削除されている

開こうとしているフォームが削除されている場合も、OpenFormは正常に動作しません。

Accessでシステムを作成していると、フォーム名を変更したり、不要になったフォームを削除したりすることがあります。

その場合は、VBAコード側のフォーム名も最新のフォーム名に合わせて修正する必要があります。

VBAコードが実行されていない

ボタンをクリックしてもフォームが開かない場合、イベントプロシージャが設定されていない可能性があります。

ボタンのプロパティを確認し、イベントタブの 「クリック時」 が

イベントプロシージャ

になっているか確認しましょう。

エラーが出たときの確認ポイント

OpenFormがうまく動作しない場合は、次のポイントを確認すると原因を特定しやすくなります。

  • フォーム名が正しいか
  • フォームが削除されていないか
  • クリックイベントが設定されているか
  • VBAコードが正しく保存されているか

これらを確認することで、ほとんどの場合は問題を解決できます。

補足

OpenFormメソッドは、Access VBAの中でも 最も基本的で使用頻度の高い処理の一つです。
エラーの原因を理解しておくことで、画面遷移の処理をスムーズに作成できるようになります。

まとめ

Accessのフォームを遷移させるプログラムは、簡単なコードで作ることが出来ます。

データの集計プログラムや入力関連のプログラムなど、他にもマスターしておかないといけないものはありますが、まずは画面遷移をマスターしましょう。
画面遷移の動作を体感できると、システムを動かしている実感が沸き、次のAccessプログラミング学習へのモチベーションが高まります。

システムを自作できるようになる効果はとても大きいです。
無駄な入力や集計作業をなくし、大きな業務改善を達成することができます。
社内での業務改善に大きく貢献できれば、社内でのあなたの評価も高まります。


最後に、Access VBAをしっかりと学習したい方に、オススメ本について紹介した記事を書いています。
興味のある方は、こちらも併せてご覧ください。

https://sys-daddy.com/recommend-book-for-access-vba-begginer

本日もありがとうございました。