web-dev-qa-db-ja.com

VBAを使用してMS-Excel(2010)からMS-Accessテーブルを照会する方法

Accessでテーブルを照会するために、Excelでvbaコードを記述しようとしています。追加されたリンクなど、このために複数のコードサンプルを試しましたが、それらはすべて「接続を開く」部分で失敗するようです。さまざまな参照を使用しようとしましたが、どちらを使用すべきか、いくつかの異なるバージョンの違い(Microsoft ActiveX Data Objects 2.0、2.1、...、6.0など)やプロバイダー情報あるべきです。プロバイダー情報については、私は通常の行に沿って何かを見てきました

"Provider = Microsoft.Jet.OLEDB.4.0; Data Source ="

しかし、それが私が使用する必要があるかどうか、または上記のプロバイダー文字列内の何かが変更される必要がある理由/理由はわかりません。誰かがこの種のことを適切に行う方法について私を教育してもらえますか?

注:可能な場合は、他のアプリケーションをダウンロードせずに動作し、2007と2010バージョンのAccessとExcelの両方で動作するソリューションが必要です。これは、異なるバージョンのOfficeを持つ異なるコンピューターで実行する必要があるためです。

同様の質問へのリンク: Excel VBAクエリへのアクセスに失敗していますhttp://www.mrexcel.com/forum/showthread.php?t=52749

コード:

Sub asdf()

strFile = "C:\Users\bwall\Desktop\Excel Query Access Testing"

Dim cn As Object
Dim rs As Object
Dim strSql As String
Dim strConnection As String
Dim AppPath As String
Set cn = CreateObject("ADODB.Connection")
AppPath = Application.ActiveWorkbook.Path


strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & AppPath & "\Masterlist_Current_copy.accdb;"
Debug.Print strConnection
strSql = "SELECT [Neptune Number],[Description],[Manufacturer],[Manufacturer P/N] FROM [All Components];"
cn.Open strConnection
Set rs = cn.Execute(strSql)
MsgBox rs.Fields(0) & " rows in MyTable"
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

End Sub  

strConnection値=

Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\ Users\bwall\Desktop\Excel Query Access Testing\Masterlist_Current_copy.accdb;

13
Bryan

プロバイダーのピースはProvider=Microsoft.ACE.OLEDB.12.0ターゲットデータベースがACCDB形式の場合。 Provider=Microsoft.Jet.OLEDB.4.0は、古いMDB形式でのみ機能します。

32ビットWindowsを実行している場合、Accessをインストールする必要さえありません。 Jet 4は、オペレーティングシステムの一部として含まれています。 64ビットWindowsを使用している場合、Jet 4は含まれていませんが、Access自体をインストールする必要はありません。 Microsoft Access Database Engine 2010 Redistributable をインストールできます。必ず一致するバージョン(32ビットWindowsの場合はAccessDatabaseEngine.exe、64ビットの場合はAccessDatabaseEngine_x64.exe)をダウンロードしてください。

どのADOバージョン参照についての参照を必要としない遅延バインディングを使用することで、問題を回避できます。

Dim conn As Object
Set conn = CreateObject("ADODB.Connection")

次に、ConnectionStringプロパティをconnオブジェクトに割り当てます。 Excel 2003のコードモジュールから実行し、MyTableの行数を含むメッセージボックスを表示する簡単な例を次に示します。 ADO接続およびレコードセットオブジェクトに遅延バインディングを使用するため、参照を設定する必要はありません。

Public Sub foo()
    Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Access\webforums\whiteboard2003.mdb"
    strSql = "SELECT Count(*) FROM MyTable;"
    cn.Open strConnection
    Set rs = cn.Execute(strSql)
    MsgBox rs.fields(0) & " rows in MyTable"
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

この回答で問題が解決しない場合は、質問を編集して、使用しようとしている完全な接続文字列と、その接続文字列の応答として返される正確なエラーメッセージを表示します。

20
HansUp
Sub Button1_Click()
Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\Documents and Settings\XXXXXX\My Documents\my_access_table.accdb"
    strSql = "SELECT Count(*) FROM mytable;"
    cn.Open strConnection
    Set rs = cn.Execute(strSql)
    MsgBox rs.Fields(0) & " rows in MyTable"

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub
6
beginer

必要なのはADODB.Connectionのみ

Dim cnn As ADODB.Connection ' Requieres reference to the
Dim rs As ADODB.Recordset   ' Microsoft ActiveX Data Objects Library

Set cnn = CreateObject("adodb.Connection")
cnn.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Access\webforums\whiteboard2003.mdb;"

Set rs = cnn.Execute(SQLQuery) ' Retrieve the data
0
agcala

オプション明示

Const ConnectionStrngAccessPW As String = _"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=C:\Users\BARON\Desktop\Test_DB-PW.accdb;
Jet OLEDB:Database Password=123pass;"

Const ConnectionStrngAccess As String = _"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=C:\Users\BARON\Desktop\Test_DB.accdb;
Persist Security Info=False;"

'C:\ Users\BARON\Desktop\Test.accdb

Sub ModifyingExistingDataOnAccessDB()

Dim TableConn As ADODB.Connection
Dim TableData As ADODB.Recordset


Set TableConn = New ADODB.Connection
Set TableData = New ADODB.Recordset

TableConn.ConnectionString = ConnectionStrngAccess

TableConn.Open

エラー時GoTo CloseConnection

With TableData
    .ActiveConnection = TableConn
    '.Source = "SELECT Emp_Age FROM Roster WHERE Emp_Age > 40;"
    .Source = "Roster"
    .LockType = adLockOptimistic
    .CursorType = adOpenForwardOnly
    .Open
    On Error GoTo CloseRecordset

        Do Until .EOF
            If .Fields("Emp_Age").Value > 40 Then
                .Fields("Emp_Age").Value = 40
                .Update
            End If
            .MoveNext
        Loop
        .MoveFirst

    MsgBox "Update Complete"
End With

CloseRecordset:TableData.CancelUpdate TableData.Close

CloseConnection:TableConn.Close

Set TableConn = Nothing
Set TableData = Nothing

サブ終了

Sub EditingDataToAccessDB()

Dim TableConn As ADODB.Connection
Dim TableData As ADODB.Recordset
Dim r As Range

Set TableConn = New ADODB.Connection
Set TableData = New ADODB.Recordset

TableConn.ConnectionString = ConnectionStrngAccess

TableConn.Open

エラー時GoTo CloseConnection

With TableData
    .ActiveConnection = TableConn
    .Source = "Roster"
    .LockType = adLockOptimistic
    .CursorType = adOpenForwardOnly
    .Open
    On Error GoTo CloseRecordset

    Sheet3.Activate
    For Each r In Range("B3", Range("B3").End(xlDown))

        MsgBox "Adding " & r.Offset(0, 1)
        .AddNew
        .Fields("Emp_ID").Value = r.Offset(0, 0).Value
        .Fields("Emp_Name").Value = r.Offset(0, 1).Value
        .Fields("Emp_DOB").Value = r.Offset(0, 2).Value
        .Fields("Emp_SOD").Value = r.Offset(0, 3).Value
        .Fields("Emp_EOD").Value = r.Offset(0, 4).Value
        .Fields("Emp_Age").Value = r.Offset(0, 5).Value
        .Fields("Emp_Gender").Value = r.Offset(0, 6).Value
        .Update

    Next r

    MsgBox "Update Complete"
End With

CloseRecordset:TableData.Close

CloseConnection:TableConn.Close

Set TableConn = Nothing
Set TableData = Nothing

サブ終了

0
ronieson