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;
プロバイダーのピースは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
この回答で問題が解決しない場合は、質問を編集して、使用しようとしている完全な接続文字列と、その接続文字列の応答として返される正確なエラーメッセージを表示します。
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
必要なのは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
オプション明示
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
サブ終了