[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAのSQL構文で抽出内容をセルの値で変更させる』(まにまに)
すいません。方法が分からないのでアドバイスをください。
ADOを使ってCSVを選別、更にSQLを使って特定の値が入力されているレコードだけを抽出するVBAを、質問や検索などで知恵や力をお借りしてして作りました。
************************************
Sub 抽出()
Dim CN As New ADODB.Connection '参照設定 Microsoft ActiveX Data Objects 2.8 Library Dim RS As ADODB.Recordset Dim v(1 To 65000, 1 To 5), i As Long
CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Text;HDR=NO" CN.ConnectionString = "C:\" 'Cドライブ探せー CN.Open 'sample.csvファイルをゲット Set RS = CN.Execute("SELECT * FROM sample.csv") 'CSVファイルの中から12列SINで13列目TYOに該当するものを抽出 Set RS = CN.Execute("SELECT * FROM sample.csv WHERE F12 ='SIN' AND ( F13 LIKE 'TYO')")
Do Until RS.EOF i = i + 1 v(i, 1) = RS.Fields(6) '7列目 v(i, 2) = RS.Fields(4) '5列目 v(i, 3) = RS.Fields(3) '4列目 v(i, 4) = RS.Fields(11) '12列目 v(i, 5) = RS.Fields(12) '13列目 RS.MoveNext Loop
Worksheets("Nice").Range("B3").Resize(65000, 5).Value = v RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing
End Sub
OS xp
エクセル2003
1つのブックに3つのworksheetsがあり
sheet1にはボタンに設定したマクロのみ
sheet2にはマクロの抽出結果
sheet3には別のCSVの抽出結果を表示する
という形で、1Book内に2つのVBAを組んであります。
(ここに書いているのはひとつだけですが)
***********************************
と、上記のコードでほぼ理想通りに動いてはくれるのですが、問題はSQL構文で指定した
『SIN』の部分で、実は抽出したい値が他にもあるのです。
複数条件の値を同時に抽出するだけなら、&とORを使って可能ですが、出来れば
sheet1の適当なセル(RANGEA1)にリストでSIN,CHI,FRAなど、抽出した値だけを入力できるようにセット
そしてRANGE(A1)でCHIが選択されたら列13から値がCHIのものだけを表示。
RANGE(A1)を変更すると、それに連動して抽出結果も変わる。
と、いうような事をやりたいと思ってます。(別にこれでなくてもいいです)
抽出結果を更に別の集計に使うので、オートフィルタで抽出・その後コピーという手法以外で考えたいと思ってます。
単純に、抽出したい値の数だけコードを書いてボタンにマクロをセットすると、数が多くなってしまうので、それも避けたいな、と。
何か、シンプルな方法でSQL内の抽出条件を変更する方法はないものでしょうか?
お知恵を貸してください。
VBAの中では上記がひとつの文字列。
一組の "" の中に入っている部分が文字列と認識されます。
"AB"のAとBの間にRange("A1")の値を挟む場合は
"A" & Range("A1").Value & "B"
と書けます。
というのがヒントです。
(みやほりん)
す、すいません・・・馬鹿なので頂いたヒントだけでは解決しませんでした。
ためしにセレクトの構文を
"SELECT * FROM sample.csv WHERE F12" like "worksheets("sheet1").range("A1").value" AND ( F13 LIKE 'TYO')"
という感じにしてみたらエラーでした・・・
うーん、こういう意味ではないのですよねー。
もう少し、詳しくヒントをいただけますでしょうか?
(まにまに)
A1 で指定するのは F13 ではなくて F12 のように見えますが、 SQL 文は文字列として構築しますので、文字列の外に LIKE を書くと機能しません。 また、LIKE は % などのワイルドカードと一緒に使わなければ意味がないので、同じ という比較をするのであれば、= を使います。
ですから、上の構文を修正するのであれば "SELECT * FROM sample.csv WHERE F12" like "worksheets("sheet1").range("A1").value" AND ( F13 LIKE 'TYO')"
"SELECT * FROM sample.csv WHERE F12 = '" & WorkSheets("Sheet1").Range("A1").Value & "' AND F13 = 'TYO'" のようになります( () はあってもなくても良いですが揃えました)。 (Mook)
!!明快でした。ありがとうございます。
みやりほん様がおっしゃっていた『一組の "" の中に入っている部分が文字列と認識されます』という
意味が、とっても分かりやすく理解できました!
LIKEと=の違いも教えてくださり、ありがとうございます。
勉強になりました。
ありがとうございました。
(まにまに)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.