web-dev-qa-db-ja.com

VBAでSQLクエリを実行し、データをシートに入力する

あらゆる形式のコードに非常に新しい。 SQLを使用してAccessデータベースからデータをプルし、Excelスプレッドシートに書き込むスクリプトをVBAで実行しようとしています。コードは以下のようになります。クリーンに実行されますが、プルしているデータの使用方法がわかりません。前もって感謝します。

Sub Get_Data()
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL, strInput As String

strFile = "S:\Location.Database.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

strInput = InputBox("Input Desired Name")

strSQL = "SELECT NAME, Location WHERE NAME =""'strInput'"";"

cn.Execute strSQL

cn.Close
Set cn = Nothing

End Sub
2
Toad62

レコードセットオブジェクトに入力する必要があります(これは、宣言したrs変数です)。以下のコードを変更して、それを実行します。その後、レコードセットからRANGE.copyfromrecordset <yourrecordset>を含む範囲に結果を直接コピーできます。これは、結果をSHeet1.Range( "A1")にダンプする場所にも追加しました。あなたはおそらくそれを変更したいと思うでしょう。追加編集:ADODBの遅延バインディングを使用していることに気づきました。実際に機能するようにコードを調整しました。

Sub Get_Data()
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL, strInput As String

strFile = "S:\Location.Database.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

strInput = InputBox("Input Desired Name")

strSQL = "SELECT NAME, Location WHERE NAME =""'strInput'"";"

'Added the following four lines
Set rs = CreateObject("ADODB.RECORDSET")    
rs.activeconnection = cn    
rs.open strSQL    
Sheet1.Range("A1").CopyFromRecordSet rs

'removed
'cn.Execute strSQL


rs.close
cn.Close
Set cn = Nothing

End Sub

RecordSet(この場合はrs)は、SQLの結果を保持する仮想テーブルと考えることができます。レコードごと(rs.MoveFirst、MoveNext、MoveLastを使用)およびフィールドごと(rs.fieldsコレクションを反復処理することによって)のRecordSetを操作するか、結果を範囲にダンプすることができます。

7
JNevill