| 
    
     |  | 大雪男 さん、INAさん、こんばんは。 
 >エクセルから、MDBの中に存在する全てのテーブルの名前を
 >シートに取り込んでくる事は可能でしょうか?
 >
 >また、テーブルのデータをエクセルにインポートする事は出来ますか?
 
 以下のコードの仕様は、最左端シートから、
 セルA1----テーブル名
 2行目のA列から---フィールド名
 3行目のA列から---インポートデータ
 と設定します。
 上記データがテーブル毎に別シートにテーブルの数だけ書き込まれます。
 
 尚、参照設定として「Microsoft ActiveX Data Objects 2.x Library」、
 及び、「Microsoft ADO Ext 2.X for DDL and Security」にチェックして下さい。
 
 標準モジュール(Module1)に、
 '===============================================================
 Sub main()
 Dim tblnm
 If open_cat("D:\EXCELファイル\Import.mdb") = 0 Then
 '↑目的のmdbファイルのフルパス
 tblnm = get_tblnm 'テーブル名を取得
 If VarType(tblnm) <> vbBoolean Then 'テーブルがあれば?
 For idx = 1 To UBound(tblnm) - 1
 Worksheets.Add after:=Worksheets(idx)
 Next
 For idx = LBound(tblnm) To UBound(tblnm)
 Worksheets(idx).Range("a1").Value = tblnm(idx)
 Call copy_rs(Worksheets(idx).Range("a2"), "select * from " & tblnm(idx))
 Next
 End If
 End If
 Call close_cat
 End Sub
 
 
 標準モジュール(Module2)に、
 '===============================================================
 Private cat As New ADOX.Catalog
 Function open_cat(flnm As String) As Long
 On Error Resume Next
 cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
 "Data Source=" & flnm
 open_cat = Err.Number
 On Error GoTo 0
 End Function
 '======================================================================
 Function get_tblnm()
 Dim mytbl()
 Dim tbl As ADOX.Table
 idx = 1
 For Each tbl In cat.Tables
 If UCase(tbl.Type) = UCase("table") Then
 ReDim Preserve mytbl(1 To idx)
 mytbl(idx) = tbl.Name
 idx = idx + 1
 End If
 Next
 If idx > 1 Then
 get_tblnm = mytbl()
 Else
 get_tblnm = False
 End If
 End Function
 '==================================================================
 Function copy_rs(rng As Range, sql) As Long
 Dim rs As ADODB.Recordset
 copy_rs = 0
 Set rs = New ADODB.Recordset
 On Error GoTo err_copy_rs
 rs.Open sql, cat.ActiveConnection, adOpenDynamic, adLockPessimistic
 For idx = 1 To rs.Fields.Count
 With rng
 .Offset(0, idx - 1).Value = rs.Fields(idx - 1).Name
 End With
 Next
 rng.Offset(1, 0).CopyFromRecordset rs
 rs.Close
 ret_copy_rs:
 On Error GoTo 0
 Exit Function
 err_copy_rs:
 copy_rs = Err.Number
 Resume ret_copy_rs
 End Function
 '=======================================================================
 Sub close_cat()
 Set cat = Nothing
 End Sub
 
 
 これで、プロシジャーmainを実行して確認してみて下さい。
 
 |  |