[[20120426095942]] 『VBAのSQL構文で抽出内容をセルの値で変更させる』(まにまに) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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内の抽出条件を変更する方法はないものでしょうか?

お知恵を貸してください。


"SELECT * FROM sample.csv WHERE F12 ='SIN' AND ( F13 LIKE 'TYO')"

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)

Mook様

!!明快でした。ありがとうございます。
みやりほん様がおっしゃっていた『一組の "" の中に入っている部分が文字列と認識されます』という
意味が、とっても分かりやすく理解できました!

LIKEと=の違いも教えてくださり、ありがとうございます。
勉強になりました。

ありがとうございました。

(まにまに)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.