この記事では、Excelのマクロを使ってAccessのフォームにあるコントロール名をすべて取得する方法についてご説明します。
【動画】Excelのマクロを使ってAccessのフォームにあるコントロール名をすべて取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
まずはExcelのマクロがAccessのデータベースファイルを開きます。
ファイルが開いたら、フォームを開いてコントロール名を全て取得してExcelのシートに出力しています。
取得後は開いたフォームを閉じます。
フォームが複数ある場合は、フォームの数だけ同じ処理を繰り返します。
マクロ作成の流れ
今回のサンプルでは、コントロール名はどのフォームにあるコントロール名なのか、コントロールの型(コンボボックスやラベルなど)も取得してExcelのシートに出力します。
ExcelファイルとAccessのデータベースのフォームの例
今回は次のExcelファイルを用意しました。
フォーム名、コントロール名、タイプの3つの項目を出力する表と実行ボタンが設置されています。
また、Accessデータベースに、下の2つのフォームを用意しました。
マクロを実行すると、以上の2つのフォームにあるコントロール名(とフォーム名、タイプ)がExcelのシートに出力されます。
コードの例
Option Explicit Private Sub btn_exec_Click() Dim accApp As Object 'Accessアプリケーション参照用変数 Dim db As Object 'Accessのデータベース用変数 Dim frm As Object 'フォーム用変数 Dim ctl As Object 'コントロール用変数' Dim cnt As Integer 'カウンタ用変数 Dim ws As Worksheet 'ワークシート変数 'Accessのデータベースファイルの置き場を取得する Const dbFile As String = "C:\work\10_勉強\10_VBA関連\0262\0262.mdb" 'シートを取得する Set ws = Worksheets("work") 'カウンタを初期化する cnt = 2 'セルをクリアする ws.Range("A2:C60").ClearContents 'Accessアプリケーションを開始する Set accApp = CreateObject("Access.Application") 'Accesのデータベースを開く accApp.OpenCurrentDatabase dbFile 'データベースオブジェクトを取得する Set db = accApp.CurrentDb() 'Accessのデータベースにあるフォーム分だけ処理を繰り返す For Each frm In db.Containers("Forms").Documents 'フォームを開く accApp.DoCmd.OpenForm frm.Name, acNormal 'フォームにあるすべてのコントロールをループする For Each ctl In accApp.Forms(frm.Name).Controls 'フォーム名、コントロール名、型を出力する ws.Range("A" & cnt).Value = frm.Name 'フォーム名 ws.Range("B" & cnt).Value = ctl.Name 'コントロール名 ws.Range("C" & cnt).Value = TypeName(ctl) '型 cnt = cnt + 1 DoEvents Next ctl 'フォームを閉じる accApp.DoCmd.Close acForm, frm.Name, acSaveNo Next frm 'Accessを閉じる accApp.Quit acQuitSaveNone '後処理 Set ctl = Nothing Set frm = Nothing Set db = Nothing Set accApp = Nothing End Sub
注目すべきコード①
最初に見て頂きたいのは13行目です。
'Accessのデータベースファイルの置き場を取得する Const dbFile As String = "C:\work\10_勉強\10_VBA関連\0262\0262.mdb"
コードの説明
以上のコードは、Accessのデータベースファイルの置き場を取得しているコードです。
このAccessのデータベースファイルのフォームにあるコントロール名をすべて取得します。
注目すべきコード②
次に見て頂きたいのは25行目から31行目です。
'Accessアプリケーションを開始する Set accApp = CreateObject("Access.Application") 'Accesのデータベースを開く accApp.OpenCurrentDatabase dbFile 'Accessの操作を行うためのインスタンスを生成する Set db = accApp.CurrentDb()
コードの説明
以上のコードは、Accessのデータベースファイルを開き、Accessのデータベースの操作を行うためのインスタンスを生成する処理のコードです。
今回のコードでは、Accessのデータベースにあるフォームを取得するのにdbを使います。
Accessのデータベースにあるフォームを取得するのは、「注目すべきコード③」で行います。
注目すべきコード③
次に見て頂きたいのは34行目です。
'Accessのデータベースにあるフォーム分だけ処理を繰り返す For Each frm In db.Containers("Forms").Documents
コードの説明
以上のコードは、Accessのデータベースにあるフォームの取得を、Accessのデータベースに存在する分だけ行うFor文です。
Containersに「Forms」を指定すると、DocumentsコレクションがAccessのデータベースにあるフォームを返します。(frmに、取得したAccessのデータベースにあるフォームが格納されます)
注目すべきコード④
次に見て頂きたいのは36行目です。
'フォームを開く accApp.DoCmd.OpenForm frm.Name, acNormal
コードの説明
以上のコードは、「注目すべきコード③」で取得したフォームを開く処理のコードです。
OpenFormメソッドの引数に、取得したAccessのデータベースにあるフォームの名前を指定して実行することでフォームが開きます。
フォームを開くことでフォームにあるコントロールの情報を取得できるようになります。
注目すべきコード⑤
次に見て頂きたいのは40行目から52行目です。
'フォームにあるすべてのコントロールをループする For Each ctl In accApp.Forms(frm.Name).Controls 'フォーム名、コントロール名、型を出力する ws.Range("A" & cnt).Value = frm.Name 'フォーム名 ws.Range("B" & cnt).Value = ctl.Name 'コントロール名 ws.Range("C" & cnt).Value = TypeName(ctl) '型 cnt = cnt + 1 DoEvents Next ctl
コードの説明
以上のコードは、開いたフォームにあるコントロールの情報を取得するコードです。
なお、ここではコントロールの情報を取得するのと同時に、フォーム名(どのフォームにコントロールがあるのか)とコントロールの型(コンボボックスやラベルなど)も取得しています。
コードの詳細
40行目のコードでは、フォームにあるコントロールの数だけループするFor文です。
44行目のコードでは、フォーム名(どのフォームにコントロールがあるのか)をA列のセルに出力しています。
45行目のコードでは、コントロール名をB列のセルに出力しています。
46行目のコードでは、コントロールの型(コンボボックスやラベルなど)をC列のセルに出力しています。
注目すべきコード⑥
次に見て頂きたいのは55行目です。
'フォームを閉じる accApp.DoCmd.Close acForm, frm.Name, acSaveNo
コードの説明
以上のコードは、開いたフォームを閉じる処理のコードです。
注目すべきコード⑦
次に見て頂きたいのは60行目です。
'Accessを閉じる accApp.Quit acQuitSaveNone
コードの説明
以上のコードは、Accessを閉じる処理のコードです。
動作確認
「ExcelファイルとAccessのデータベースのフォームの例」をご覧ください。
【注意】参照設定が必要です
一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。
参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。
- Microsoft Access 16.0 Object Library(MSACC.OLB)
なぜ必要かというと、先ほどのコードの2行目の「ADODB.Connection」というオブジェクトが「msado28.tlb」というファイルを、3行目の「Access.Application」が「MSACC.OLB」というファイルを参照するからです。
Dim adoCON As New ADODB.Connection Dim accApp As New Access.Application
この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。
ここでは「MSACC.OLB」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、参照設定しないと動かない程度に思って頂ければと思います。
最後に
この記事では、Excelのマクロを使ってAccessのフォームにあるコントロール名をすべて取得する方法についてご説明しました。
Accessのフォームにあるコントロール名をすべて取得したいときは本記事を参考にしてみてくださいね。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。