2016-07-04 5 views
2

アクセスクエリの結果をコピーしてExcelタブに貼り付けようとしています。私は周りにグーグルしたが、それは動作するように見えることができない、私はエラー "エラー3343:認識されていないデータベース形式"ので、私はそれが私がチェックした参照とは何かがあると仮定します。VBA経由でExcelにクエリをコピーする(エラー3343)

私はこれを動作させるために必要な正しいリファレンスを知っていますか?

参考文献:

のVisual Basic用のアプリケーション

のMicrosoft Excel 14.0 Object Libraryの

OLEオートメーション

のMicrosoft Office 14.0 Object Libraryの

Microsoft ActiveXデータは、2.8ライブラリのオブジェクト

Microsft DAO 3.6オブジェクトライブラリ

Sub Query() 
Dim db As DAO.Database 
Dim rst As DAO.Recordset 
Dim sql As String 
Dim iCol As Integer 

Sheets("DataDump1").Select 
With Selection.ClearContents 

End With 
Set db = OpenDatabase("C:\Folder\DatabaseName.accdb") 
Set rst = db.OpenRecordset("Query 1") 

For iCol = 1 To rst.Fields.Count 
ActiveSheet.Cells(1, iCol) = rst.Fields(iCol - 1).Name 
Next iCol 

ActiveSheet.Range("A2").CopyFromRecordset rst 
rst.Close 
db.Close 
Set rst = Nothing 
Set db = Nothing 

End Sub 

答えて

1

は、データベースとレコードセットオブジェクトを初期化する前に、アクセスオブジェクトを呼び出す考えてみましょう動作するように、このための基準としてオブジェクトライブラリ。また、はDBEngine Workspaceオブジェクトのため、OpenCurrentDatabaseメソッドを使用します。

Sub Query() 
    Dim accObj As Object 
    Dim db As DAO.Database 
    Dim rst As DAO.Recordset 
    Dim sql As String 
    Dim iCol As Integer 

    Sheets("DataDump1").Cells.ClearContents 

    Set accObj = CreateObject("Access.Application") 
    accObj.OpenCurrentDatabase("C:\Folder\DatabaseName.accdb") 

    Set db = accObj.CurrentDb 
    Set rst = db.OpenRecordset("Query 1") 

    For iCol = 1 To rst.Fields.Count 
     Sheets("DataDump1").Cells(1, iCol) = rst.Fields(iCol - 1).Name 
    Next iCol 

    Sheets("DataDump1").Range("A2").CopyFromRecordset rst 
    rst.Close 
    db.Close 

    Set rst = Nothing 
    Set db = Nothing 
    Set accObj = Nothing 

End Sub 

あるいは、アクセスなどのアクセス・オブジェクトとインターフェースする必要がデータベースはありませんされない任意の他のRDMS(等オラクル、SQLサーバ、MySQLの)のようなODBC/OLEDBを介して接続することができるだけ.EXE

Sub RunSQL() 
    Dim conn As Object, rst As Object 
    Dim strConnection As String, strSQL As String 
    Dim iCol As Integer 

    Set conn = CreateObject("ADODB.Connection") 
    Set rst = CreateObject("ADODB.Recordset") 

    Sheets("DataDump1").Cells.ClearContents 

' strConnection = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};" _ 
'      & "DBQ=C:\Folder\DatabaseName.accdb;" 
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
         & "Data Source='C:\Folder\DatabaseName.accdb';" 

    strSQL = " SELECT * FROM [Query 1];" 

    ' OPEN DB AND RECORDSET 
    conn.Open strConnection 
    rst.Open strSQL, conn 

    ' COLUMN HEADERS 
    For iCol = 1 To rst.Fields.Count 
     Sheets("DataDump1").Cells(1, iCol) = rst.Fields(iCol - 1).Name 
    Next iCol 

    ' DATA ROWS 
    Sheets("DataDump1").Range("A2").CopyFromRecordset rst 

    rst.Close 
    conn.Close  
End Sub 
+0

ありがとう、あなたの2番目のソリューションは、私にとって完璧に働いています。 – JBlack

+0

素晴らしい! 2番目のオプションでは、ユーザーのコンピュータにMSAccess.exeをインストールする必要はありません。 .accdbファイルとPC(Ace/Jetエンジン - Windows .dllファイルがインストールされているはずです)をインストールしてください。 – Parfait

0

私は参照の問題は、ユーザ定義にタイプ認識されないエラーを与えるだろうと思います。むしろDAOよりADODBは動作するはずです:

Sub Query() 
Dim db As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim iCol As Integer 

db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Folder\DatabaseName.accdb;" 
rst.Open "Query 1", db 

For iCol = 1 To rst.Fields.Count 
ActiveSheet.Cells(1, iCol) = rst.Fields(iCol - 1).Name 
Next iCol 

ActiveSheet.Range("A2").CopyFromRecordset rst 
rst.Close 
db.Close 
Set rst = Nothing 
Set db = Nothing 

End Sub 

EDIT:追加してください最新のMicrosoftのActiveXデータは

関連する問題