
すいません1つ質問があります。
以前質問させて頂きましたが、ExcelのVlookupでACCESSのクエリを参照してレコードを取得したいです。
ADOでAccessのテーブルから持ってくることは出来ました。
が、繰り返しても最初の数字の9999しかもって来ません・・・。
下記が私の書いたコードとなります。
ExcelシートとACCESSテーブルを画像として添付します。
D2には9999、D3には55555・・・・と持ってくるようにしたいです。
原因と修正法を教えて頂ければ幸いです。
何卒よろしくお願いします。
Option Explicit
Sub test()
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim i As Long
Dim Maxrow As Long
Set db = New ADODB.Connection
db.Provider = "Microsoft.ace.oledb.12.0"
db.Open "C:\Users\Kei\Desktop\Test\Test.accdb"
Set rs = New ADODB.Recordset
rs.Open "Ship", db, adOpenStatic
Maxrow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Maxrow
strSQL = "select * from Ship where 商品名 =" & Cells(i, 1) & ";"
Cells(i, 4) = rs!出荷数
Next i
rs.Close
db.Close
Set db = Nothing
Set rs = Nothing
End Sub

A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
#1です。
xl2010/Acc2010で動作確認してから投稿しております。
Test.accdbをデスクトップに置いて実行すれば、そのままコピペして動作する筈です。
実行結果と、テーブルの情報を画像で添付いたします。
ご確認下さい。

No.1
- 回答日時:
rs.Open "Ship", db, adOpenStatic で、テーブル丸ごと開いていて、
strSQL = "select * from Ship where 商品名 =" & Cells(i, 1) & ";" が、意味をなしていませんね。
下記testの様に、ループの中で都度SQLを指定してRecordsetを取得するか、
test2の様に、テーブル丸ごと取得しておいて、フィルターで絞り込むかどちらかでしょう。
ご参考まで。
※試験のためのパスが違っていますので、そのまま貼り付けても駄目ですのでご注意下さい。
また、記載漏れかもしれませんが、文字列型での抽出の場合はシングルクォーテーションで囲ってやる必要がありますので、念のため。
Sub test()
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim i As Long
Dim Maxrow As Long
Set db = New ADODB.Connection
db.Provider = "Microsoft.ace.oledb.12.0"
db.Open GetDesktopPath & "\Test.accdb"
Set rs = New ADODB.Recordset
Maxrow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Maxrow
strSQL = "select * from Ship where 商品名 ='" & Cells(i, 1) & "';"
rs.Open strSQL, db, adopenstatic
Cells(i, 4) = rs!出荷数
rs.Close
Next i
If rs.State = 1 Then rs.Close 'adStateOpen=1
db.Close
Set db = Nothing
Set rs = Nothing
End Sub
Sub test2()
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim i As Long
Dim Maxrow As Long
Set db = New ADODB.Connection
db.Provider = "Microsoft.ace.oledb.12.0"
db.Open GetDesktopPath & "\Test.accdb"
Set rs = New ADODB.Recordset
rs.Open "Ship", db, adopenstatic
Maxrow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Maxrow
rs.Filter = "商品名 ='" & Cells(i, 1) & "'"
Cells(i, 4) = rs!出荷数
rs.Filter = ""
Next i
rs.Close
db.Close
Set db = Nothing
Set rs = Nothing
End Sub
Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function
この回答への補足
アドバイスありがとうございます。
1番目を試したところ、やはり、全て9999でした・・・。
1番目のやり方だときちんとFor nextが機能せず、"りんご"のみを参照し続ける用に思えます。
何とかここをクリアしたいのですがアドバイス頂けますか?
何卒よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access2000のVBAでコンパイルエ...
-
型 varchar から型 numeric へ...
-
Developer2000って何?(^^;
-
データベースの2GBって・・・?
-
スタライズとは、どういう意味...
-
カンマ区切りで格納するカラム...
-
JavaとOracle Javaって何が違う...
-
データベースの最適化をマクロ...
-
ODBC接続とDBLINK
-
データベースのデファクトスタ...
-
クラリスワークスみたいなDBって
-
エクセルのフォームについて(...
-
SQLite3の許容される登録数は?
-
VBAかSQL?
-
無料開発環境にODBC導入
-
ACCESSではどの程度の規...
-
Notes って 何が良くて使うの...
-
クライアントPCからのアクセ...
-
AndroidからのAccessデータベー...
-
データのインポートに失敗します。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
希望の位置へフィールドを追加...
-
キーワードを1つにまとめたいです
-
現在CentOSにOpenldapをインス...
-
パススルークエリの使い方について
-
FindFirst複数条件
-
VBAのfor next で繰り返しが出...
-
[ACCESS/VBA]動的にSQL文を...
-
Access2000のVBAでコンパイルエ...
-
accessのvbaでの実行時エラーに...
-
データベースの変換
-
UNION ALLのように順番がありNU...
-
DAO フィルターをかけたい エ...
-
110db+110db=?db 教えて下さい。
-
型 varchar から型 numeric へ...
-
JavaとOracle Javaって何が違う...
-
データベースの最適化をマクロ...
-
SQL Serverとは?
-
AndroidからのAccessデータベー...
-
データベースの2GBって・・・?
-
ハイフン無しの電話番号データ...
おすすめ情報