| Excel Tips by pPoy |
| Macro | Accessのテーブル名一覧取得マクロ 《DAO,ADOX 参照設定無し》 (Excel2000〜Excel2010)(Access2000〜Access2010) | ||
|---|---|---|---|
| Excel 側から、Access データベースに保存済みのテーブル名を調べたいときがあります。 方法は色々ありますが、以下は代表的な4種類の方法です。 ※ DAO や ADO への参照設定は行ないません。 | |||
|
≪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 がインストールされている必要があります。 |
|
≪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 に含まれています。 追加取得する必要はありません。 |
|
≪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≫
|
|
≪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≫
|
≪まとめ≫
|