【ExcelVBA】Excelのマクロを使ってAccessのフォームにあるコントロール名をすべて取得するには

この記事では、Excelのマクロを使ってAccessのフォームにあるコントロール名をすべて取得する方法についてご説明します。

【動画】Excelのマクロを使ってAccessのフォームにあるコントロール名をすべて取得する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


まずはExcelのマクロがAccessのデータベースファイルを開きます。

ファイルが開いたら、フォームを開いてコントロール名を全て取得してExcelのシートに出力しています。

取得後は開いたフォームを閉じます。

フォームが複数ある場合は、フォームの数だけ同じ処理を繰り返します。

マクロ作成の流れ

STEP.1
ExcelのマクロがAccessのデータベースファイルを開く
ExcelのマクロがAccessのデータベースファイルを開きます。
STEP.2
Accessのデータベースファイルにあるフォームを開く
Accessのデータベースファイルにあるフォームを開きます。
STEP.3
フォームにあるコントロール名を取得する
フォームにあるコントロール名を取得します。
今回のサンプルでは、コントロール名はどのフォームにあるコントロール名なのか、コントロールの型(コンボボックスやラベルなど)も取得してExcelのシートに出力します。
STEP.4
フォームの数だけSTEP.2とSTEP.3を繰り返す
フォームの数だけSTEP.2とSTEP.3を繰り返します。

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」ボタンをクリックします。

  1. 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週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら