Excel Tips by pPoy

トップへ←Top    VBAへVBA  VBA基礎へVBA 基礎  一般へ一般  

Macro Accessのテーブル名一覧取得マクロ 《DAO,ADOX 参照設定無し》
(Excel2000〜Excel2010)(Access2000〜Access2010)
Excel 側から、Access データベースに保存済みのテーブル名を調べたいときがあります。
方法は色々ありますが、以下は代表的な4種類の方法です。
※ DAO や ADO への参照設定は行ないません。
  1. Access の CurrentData オブジェクトを使用する方法
  2. DAO の TableDefs コレクションを使用する方法
  3. ADO の OpenSchema メソッドを使用する方法
  4. ADOX の Catalog オブジェクトを使用する方法

≪1. Access の CurrentData オブジェクトを使用する方法≫

Access データベースを 非表示で 開いてから、CurrentData オブジェクトからテーブル名一覧を取得します。
以下のサンプルでは、Excel2010 の ワークシートに新規シートを追加後、テーブル名一覧を書き出します。

以下のコードを標準モジュールに貼り付けて、マクロを実行してください。

Sub listAllTablesName()
'CurrentData オブジェクトからテーブル名一覧を表示
'Access2000 以降のみ 2011/02/12 pPoy
    Dim objAC As Object         'Access.Application
    Dim objTmp As Object        'AccessObject
    Dim dbs As Object
    Dim stPath As String
    Dim i As Long
    
    stPath = "c:\Test\dbTest2010.accdb"
    If Dir(stPath) = "" Then Exit Sub
    
    Set objAC = CreateObject("Access.Application")
    objAC.OpenCurrentDatabase (stPath)
    
    'AllTables コレクションから検索
    Set dbs = objAC.Application.CurrentData
    i = 1
    '新規シートをシートの先頭に追加し書き出し
    Worksheets.Add before:=Sheets(1)
    With Sheets(1)
        .Activate
        For Each objTmp In dbs.AllTables
            If Left(objTmp.Name, 4)  <> "MSys" Then
                .Cells(i, 1).Value = objTmp.Name
                i = i + 1
            End If
        Next objTmp
    End With
    
    objAC.CloseCurrentDatabase
    objAC.Quit
    Set dbs = Nothing: Set objAC = Nothing
End Sub
≪補足≫

※ Excel2007 や Excel2010 で実行する場合は、Access2000 〜 Access2003形式の mdb も使用可能です。
※ Excel2000 〜 Excel2003 で実行する場合は、accdb 形式のデータは開けません。
※ Access を (非表示で) 開いて使用する為、PC に Access がインストールされている必要があります。
この頁のTOPへTop
≪2. DAO の TableDefs コレクションを使用する方法≫

Excel側でDAOへの参照設定は行いませんが、対象となる Access のバージョンによってコードが異なります。
以下のサンプルでは、Excel2010 の 現在表示されているワークシートにデータを書き出します。

以下のコードを標準モジュールに貼り付けて、新しいシート上で実行してください。
※ 既存のデータは上書きされます。

Sub listDAOTablesName()
' DAO でテーブル名一覧を取得 2011/02/12 pPoy
    Dim dbeng As Object             'DAO.DBEngine
    Dim dbs As Object               'DAO.Database
    Dim tbl As Object               'DAO.TableDef
    Dim stPath As String
    Dim i As Long

    stPath = "c:\Test\dbTest2010.accdb"                 '★1
    If Dir(stPath) = "" Then Exit Sub

    'DAO 12.0 の場合 (Access2007,Access2010)
    Set dbeng = CreateObject("DAO.DBEngine.120")        '★2
    Set dbs = dbeng.workspaces(0).OpenDatabase(stPath)
    
    With ActiveSheet
        i = 1
        For Each tbl In dbs.TableDefs
            'システムテーブルは除外
            If Left(tbl.Name, 4) <> "MSys" Then
                .Cells(i, 1).Value = tbl.Name
                i = i + 1
            End If
        Next tbl
    End With
    
    dbs.Close
    Set dbs = Nothing: Set dbeng = Nothing
End Sub
≪補足1≫

Excel2007 や Excel2010 で実行する場合は、Access2000 〜 Access2003形式の mdb も使用可能です。
その場合、上記の 「★1」 の行のコードは以下のようになります。
    mdbPath = "C:\Test\dbTest.mdb"
上記の 「★2」 の行のコードは変更する必要はありません。
≪補足2≫

Excel2000 〜 Excel2003 で実行する場合は、accdb 形式のデータは読めません。
mdb 形式のデータのみ取得可能です。
上記の 「★1」 の行のコードは以下のようになります。
    mdbPath = "C:\Test\dbTest.mdb"
その場合、上記の 「★2」 の行のコードは以下のようになります。
    Set dbeng = CreateObject("DAO.DBEngine.36")
≪補足3≫

DAO を使用する為のコンポートネント (JET) は、Windows2000 以降は OS に含まれています。
追加取得する必要はありません。
この頁のTOPへTop
≪3. ADO の OpenSchema メソッドを使用する方法≫

Excel側でADOへの参照設定は行いませんが、対象となる Access のバージョンによってコードが異なります。
以下のサンプルでは、Excel2010 の 現在表示されているワークシートにデータを書き出します。

以下のコードを標準モジュールに貼り付けて、マクロを実行してください。
※ 既存のデータは上書きされます。
Sub ListADOTables()
'ADO OpenSchema メソッドを使用 2011/02/12
    Dim cnn As Object            'ADODB.Connection
    Dim rst As Object            'ADODB.Recordset

    Dim stSQL As String
    Dim stProvider As String
    Dim stPath As String
    Dim i As Long
    
    Const adSchemaTables = 20

    'Access2007,Access2010の場合
    stProvider = "Microsoft.ACE.OLEDB.12.0"             '★1

    stPath = "c:\Test\dbTest2010.accdb"                 '★2
    If Dir(stPath) = "" Then Exit Sub

    Set cnn = CreateObject("ADODB.connection")
    cnn.Provider = stProvider
    cnn.Open stPath
   
    Set rst = cnn.OpenSchema(adSchemaTables, _
                  Array(Empty, Empty, Empty, "TABLE"))
    i = 1
    While Not rst.EOF
        With ActiveSheet
            .Cells(i, 1).Value = rst.Fields("TABLE_NAME").Value
            i = i + 1
            rst.MoveNext
        End With
    Wend

    rst.Close: cnn.Close
    Set rst = Nothing: Set cnn = Nothing
End Sub
≪補足1≫

Excel2007 や Excel2010 で実行する場合は、Access2000 〜 Access2003形式の mdb も使用可能です。
その場合、上記の 「★1」 の行のコードは以下のようになります。
    mdbPath = "C:\Test\dbTest.mdb"
上記の 「★2」 の行のコードは変更する必要はありません。
≪補足2≫

Excel2000 〜 Excel2003 で実行する場合は、accdb 形式のデータは読めません。
上記の 「★1」 の行のコードは以下のようになります。
    mdbPath = "C:\Test\dbTest.mdb"
その場合、上記の 「★2」 の行のコードは以下のようになります。
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
≪補足3≫
  1. ADO を使用する為のコンポートネント (MDAC) は、Windows2000 以降は、OS に含まれていますので、
    追加取得する必要はありません。

  2. OpenSchema の引数でクエリ制約に、"TABLE" を指定している為、システムテーブルやリンクテーブルは除外されます。

  3. OpenSchema の引数でクエリ制約に何も指定しない場合、「システム テーブル」、「リンク テーブル」、「選択クエリ」 も一緒に取得されます。
この頁のTOPへTop
≪4. ADOX の Catalog オブジェクトを使用する方法≫

Excel側でADOXへの参照設定は行いませんが、対象となる Access のバージョンによってコードが異なります。
以下のサンプルでは、Excel2010 の 現在表示されているワークシートにデータを書き出します。

以下のコードを標準モジュールに貼り付けて、新しいシート上で実行してください。
※ 既存のデータは上書きされます。

Sub listADOXTablesName()
' ADOX でテーブル名一覧を取得 2011/02/12 pPoy
    Dim cat As Object               'ADOX.Catalog
    Dim tbl As Object               'ADOX.Table
    Dim stProvider As String
    Dim stPath As String
    Dim i As Long
    
    stPath = "c:\Test\dbTest2010.accdb"             '★1
    If Dir(stPath) = "" Then Exit Sub

    'Access2007,Access2010の場合
    stProvider = "Microsoft.ACE.OLEDB.12.0"         '★2

    Set cat = CreateObject("ADOX.Catalog")
    cat.ActiveConnection = _
        "Provider=" & stProvider & ";" & _
        "Data Source=" & stPath & ";"
    
    With ActiveSheet
        i = 1
        For Each tbl In cat.Tables
            'システムテーブルは除外
            If Left(tbl.Name, 4) <> "MSys" Then
                If tbl.Type <> "VIEW" Then
                    .Cells(i, 1).Value = tbl.Name
                    i = i + 1
                End If
            End If
        Next tbl
    End With
        
    Set cat = Nothing
End Sub
≪補足1≫

Excel2007 や Excel2010 で実行する場合は、Access2000 〜 Access2003形式の mdb も使用可能です。
その場合、上記の 「★1」 の行のコードは以下のようになります。
    mdbPath = "C:\Test\dbTest.mdb"
上記の 「★2」 の行のコードは変更する必要はありません。
≪補足2≫

Excel2000 〜 Excel2003 で実行する場合は、accdb 形式のデータは読めません。
上記の 「★1」 の行のコードは以下のようになります。
    mdbPath = "C:\Test\dbTest.mdb"
その場合、上記の 「★2」 の行のコードは以下のようになります。
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
≪補足3≫
  1. Microsoft Jet の OLE DB Provider では、Tables コレクションに View も含まれてしまいます。
    テーブル名一覧を取得する為には、システムテーブルと View を除外する処理が必要となります。

  2. ADOX を使用する為のコンポートネント (MDAC) は、Windows2000 以降は、OS に含まれていますので、
    追加取得する必要はありません。
この頁のTOPへTop
≪まとめ≫
  1. Access の CurrentData オブジェクトを使用する方法は、実行する PC に Access が必要です。
    非表示の Access を開く為、処理も遅くなります。
    対象の Access データベースに、起動時のマクロや VBA がある場合は、それが実行されます。
    ただし、この方法は対象が Access 2000 以降でしたら、バージョンを選びません。

  2. DAO を使用する場合は、実行する Excel のバージョンによって、DBEngine のバージョンを区別する必要があります。

  3. ADO や ADOX を使用する場合は、実行する Excel のバージョンによって、指定する Provider 名を区別する必要があります。

  4. Accessのクエリー名一覧を取得するマクロは、こちら です

  5. Accessデータを取得するマクロは、こちら です。

  6. Office System ドライバ用 コンポーネントは、以下のマイクロソフトのサイトからダウンロードできます。
    Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント

  7. WindowsXP 用の以下のコンポーネントが、マイクロソフトのサイトからダウンロードできます。
    Jet 4.0 Service Pack 8 (SP8) for Windows XP


この頁のTOPへTop
【念の為の注意書きです。】
このページ(下位ページ含む)の全ての物の無断転載を禁止いたします。
又、当ページ(下位ページ含む)に記載されていることは、全て自己の責任において実行してください。

Copyright(C) pPoy 2011