• 締切済み

エクセルVBAでのSQLについて

エクセルVBAで、SQLを記述しているのですがwhereの抽出条件にセルの値を指定したいと思っています。その当該セルの値を変更することで、抽出条件を変更することができるようにしたいです。 しかし、どのような記述にすればよいか分かりません。以下のような記述をしたのですが、うまくいきません。すみませんが、教えていただけないでしょうか。よろしくお願い申し上げます。 ◆抽出条件を指定するセル:A1 セルA1には、数字(例:1000、2000等)をいれます。 mySQL = " SELECT * FROM [◆◆シート!] WHERE Range("A1")"

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

ADOを使います。 Sheet1の下記のデータの中から、点数が50点のものを抜き出してSheet2に書き出します。過去に私のテストした単純なデータを使って説明します。 例データ Sheet1のA1:C12 番号 氏名 点数1 1 大島 10 2 奥村 20 3 大島 30 4 井上 40 5 永田 50 6 長井 60 7 三村 50 8 森田 40 9 佐田 30 10 田島 20 11 田上 10 一旦下記のブック名で保存しておく。 ’--- コード 標準モジュールに Sub test01() Dim cnStr As String Dim mSql As String Dim cn As Object Dim rs As Object Const EXLFol = "C:\Users\XXX\Documents"  strFilename = "SQLで抜出.xlsm" mSql = "select F1, F2,F3 from [Sheet1$] WHERE F3=50" '--- Set cn = CreateObject("ADODB.Connection") cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\惇\Documents\" & strFilename & ";" & _ "Extended Properties=""EXCEL 8.0;HDR=NO;""" & ";" 'MsgBox cnStr cn.Open cnStr Set rs = CreateObject("ADODB.Recordset") rs.Open mSql, cn, adOpenForwardOnly '--- Worksheets("Sheet2").Range("A1").CopyFromRecordset rs cn.Close Set cn = Nothing Set rs = Nothing End Sub 'ーーー 結果 Sheet2の A1:C2に 5 永田 50 7 三村 50 第1行に、見出し「番号 氏名 点数1」を出したいなら 第1行のA1:C1に「番号 氏名 点数1」をコピー貼り付けして置き、 Worksheets("Sheet2").Range("A1").CopyFromRecordset rs のA1をA2にすればよい。 フィールド名をADO側で左列からF1,F2,F3のように名付けてくれるという 仕組みがあり、それを使って簡略化したもの。 フィールド名を自分流に定義するのは、Iniファイルというものを使えばできるようだが、面倒なので使わない。 詳しくはGoogleででも、「ADO iniファイル」で照会するなどして、勉強してください。

kscgakuin
質問者

お礼

ありがとうございます。参考にさせていただきます。