- ベストアンサー
可変の検索条件件数でAccessデータを抽出
- ADOを用いて、Accessのテーブル内のフィールドに「指定の数値」がある場合その行を全てExcelに抽出したい。
- 特徴として、「指定の数値」は複数あり、なおかつ可変で、VBAで作成したコンボボックス(Accessから読み込み)にて選択し、F45から下に好きな個数だけ追加できる。
- しかし、全ての「指定の数値」を検索対象に(OR検索)してSQLのSelect文で取得しようとしてもやり方が分からない。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
http://okwave.jp/qa/q8790348.html のNo7で述べましたように、この場合は上記の場合とは 方法が違いますので、以下のようにしてみてください。 なお、データは引き続き上記の場合と同じとします。 以下の場合は、IDが2から4までのデータを連続して 取り出します。こういう場合はSQL文を strSQL = "SELECT * FROM Tdata WHERE ID Between [startNum] And [endNum]" のように、WHERE ID Between AAA And BBB というコードを使います。 つまり、この場合はAAAからBBBまでのIDの数値に合致するレコードを 対象にするということです。WHERE句でレコードにフィルタをかけます。 なお、以下ではADOのCommandを使いますのでRecordsetはCommandで指定した SQL文が対象となります。したがって、ADOの接続や切断、オブジェクトの 破棄等は、プロシージャの中に書き込んでください。Recordsetの設定の 順序も違っています。 なお、途中いくつかはこちらの環境設定ですので、実際の環境に合わせて設定してください。 たとえば、 cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath は、Jet.OLEDB.4.0 のところを実際の環境に設定しなおしてください。 たぶん、ここだけと思いますが。それと、Accessのファイル名と取り出す 範囲のところですかね。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim cmd As New ADODB.Command Dim pam As New ADODB.Parameter Dim strSQL As String Dim i As Long Dim j As Long Dim k As Long Dim strPath As String 'IDの2から4までのレコードを取り出します。 'ここは実際に合わせて設定しなおしてください。 i = 2 j = 4 strSQL = "SELECT * FROM Tdata WHERE ID Between [startNum] AND [endNum]" strPath = ThisWorkbook.Path & "\sample.mdb" cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath Set cmd.ActiveConnection = cn With cmd .CommandText = strSQL .CommandType = adCmdText .Prepared = True End With 'startNumをパラメータとして登録。 数値としてadNumericを引数として指定 Set pam = cmd.CreateParameter("startNum", adNumeric) cmd.Parameters.Append pam cmd.Parameters("startNum") = i 'endNumをパラメータとして登録。数値としてadNumericを引数として指定 Set pam = cmd.CreateParameter("endNum", adNumeric) cmd.Parameters.Append pam cmd.Parameters("endNum") = j 'データの取り出し Set rs = cmd.Execute 'Sheetへのデータの格納 If rs.EOF Then MsgBox "レコードがありません。" Else i = rs.Fields.Count k = 1 Do Until rs.EOF For j = 1 To i If Not rs.Fields(j - 1).Name = "年齢" Then Worksheets("Sheet1").Cells(j, k) = rs.Fields(j - 1) End If Next j k = k + 1 rs.MoveNext Loop End If '後処理 rs.Close: Set rs = Nothing Set cmd = Nothing cn.Close: Set cn = Nothing
お礼
回答ありがとうございます、無事自分の思い描いていた挙動になってくれました。 ありがとうございました。