エクセルVBAでの複数条件検索方法

このQ&Aのポイント
  • エクセルVBAでの複数条件でのデータ検索方法について困っています。
  • 検索値に空白がある場合に検索ができない問題があります。
  • IFステートメントやサブクエリを使った方法も考えましたが、うまくいきません。どのような方法がありますか?
回答を見る
  • ベストアンサー

エクセルVBA SQL構文 複数条件で検索方法

エクセルVBAで、アクセスのデータを読み込もうとしています。 複数条件で検索する際の、SQL構文がわからず困っています。 検索値・・・ 部署:(データ型)、月:(整数型)、担当:(データ型) SQL構文・・・ " SELECT * FROM touban WHERE busyo = '" & 部署 & "' AND m2 = " & 月 & " AND tanto = '" & 担当 & "' ORDER BY m2 ASC " 検索値にすべて値が入っていれば検索できたのですが、 1つでも空白があれば検索されません。 (検索値=空白のデータはないので、当たり前ですが・・・) そこで、IFステートメントで空白場合、そうでない場合と分けようかと思いましたが 検索値の個数が増えれば、大変です。 SELECT文の中にSELECT文を入れる方法(サブクエリっていうのかな)も考えたのでですが うまくいきません。 どんな方法がありますか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#212058
noname#212058
回答No.2

WHERE (busyo = '" & 部署 & "' OR '" & 部署 & "' = '') AND ... のように、ひとつひとつの検索条件に OR 文で『空白の場合の条件』を加える方法があります。ただ、この方法の場合、DBのインデックスが効かなくなりますので検索パフォーマンスが遅くなるという問題が出る可能性があります。 やっぱり IF 文で判別するほうが良いかと思いますけどね。 sql = "SELECT ... WHERE " concatWord = "" IF 部署 <> "" THEN sql = sql & concatWord & "busyo = '" & 部署 & "'" concatWord = " AND " END IF IF 月 <> 0 THEN sql = sql & concatWord & "m2 = " & 月 concatWord = " AND " END IF :

ex1990
質問者

お礼

ありがとうございました。 無事仕上げることが出来ました。 この様な変数の使い方があったんですね。 目から鱗です。

その他の回答 (1)

noname#206655
noname#206655
回答No.1

データベースを作成する場合、「空白を許さない」ってのがありますので、必ず値が入ります。 もし、「月」が空白だったら、もし「13月」だったら、を検証し忘れるのが脆弱性となって現れます。 コーティング1/3、例外1/3、デバグ1/3と言います。面倒でも製品として仕上げるなら、入る前に考えうる例外処理をして欲しいと思います。 今回は「身長」という項目がありませんが、もし「3100mm」という値が来たら、体重「220t」という値が来たら、そんな常識ハズレな値が来たら・・・ 部署は「総務部」と「層無部」は違います。「そんな、常識はずれな値を設定する訳ねーだろ」と言いますが、これをチェックしてません。 SQL文に入る前に、値が枠内に入っているか検査します。(私の場合) 勉強だと思って、検査ルーチンを書くことをオススメします。

ex1990
質問者

お礼

勉強になります。 空白をチェックすることで、エラーが防げました。 ありがとうございます。

関連するQ&A

  • SQL構文

    MASTER_TBLを、CDとKAKU_CDの2列で一意をなるようにしたいので、重複データを洗い出すためのSQLを組もうとしています。 FROM句のサブクエリ単体では、正常な結果が取得できるのですが、下のSQLを流すと、全データ件数×全データ件数が結果として返ってきます。 重複行のみを表示するにはどうすればいいのでしょうか?単純な構文ミスのような気がするのですが、、、 SELECT  M1.CD AS CD1,  M1.KAKU_CD AS KAKU_CD1,  M1.UPDATE_DATE AS UPDATE_DATE1 FROM  MASTER_TBL M1,  (   SELECT M2.CD || M2.KAKU_CD AS CODE2, COUNT(*)   FROM MASTER_TBL M2   GROUP BY M2.CD, M2.KAKU_CD   HAVING COUNT(*) > 1  ) SUB_T; WHERE M1.CD || M1.KAKU_CD IN ( CODE2 ) ORDER BY 1, 2, 3 ;

  • SQL構文について教えて下さい!

    こんばんわ。 いつもお世話になっております。 ServletでIPアドレスを取得してデータベースに登録してあるデータであって尚且つ、AuthorityというカラムにAかBのどちらかがあるデータを抽出するSQLを作成しているのですが上手くいきません。 教えて下さい!お願いします。 作成中のSQL構文を途中から投稿致します。 String RemoteAdd = request.getRemoteAddr(); try { String sql = "SELECT * FROM Api where (Authority = 'A' OR Authority = 'B') AND IPAddress='"+ RemoteAdd +"'"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery();

  • SQL構文でデータ抽出。

    欲しいデータのみを取得するステートメント (1)select カラム名 from テーブル名 where 条件; という構文を本で見つけたのですが… これの条件をテキスト入力に変更して DBから情報を引っ張ってくることは可能でしょうか?? 可能であればその構文を教えていただけますと幸いです。

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • 複数条件のSQL文

    こんばんは。 SQL文を書いていますが困っています。 複数条件のつなげ方がうまくいかないのです。 通常のSQLでかけば・・・ (1)WHERE(AreaID='OSAKA') (2)WHERE Size BETWEEN 'S' AND 'LL' (3)WHERE Adrs LIKE '豊中市%' と3文になるような複数のSQL条件を・・・ 「SELECT * FROM ordermaster 」につなげたいと思っています。 どのようにつながれば正解なのでしょうか? 是非とも宜しくお願い致します。

  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。

  • SQLの構文で質問です。

    いつもお世話になっております。 SQLの構文で質問です。 テーブルを開いて、データの中から日付を絞って抽出したいのですが、 whereの後にどのような記述をすればいいのかわかりません。 なんとなく『>』を使ってやってみましたがうまく抽出できませんでした。 例えば、2008/12/01~2008/12/31の絞りで抽出できるようにしたいのですが。 SELECT * FROM 日付 WHERE (日付   2008 / 12 / 01    2008 / 12 / 31) すみません、SQLを使い始めて間もなく本を見てはいるのですがうまくいかないもので。 宜しくお願いします。

  • SQLの構文エラー

    いつもお世話になってます。 現在、VBでSQLを発行し、ACCESSのテーブル(テストデータ)より 値を取得しようとしているのですが、 SQL文の発行時に構文エラーとなってしまいます。 詳細を下記しますので、ご教授頂けたらと思います。 宜しくお願い致します。 【SQL文】 select フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド10*-1 else フィールド10 end)いいい from テストデータ ※フィールド9、フィールド10は数値型、その他はテキスト型です。 実行時エラー'3075' クエリ式'(CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ'の構文エラー:演算子がありません。

  • VBAの構文で教えてください

    VBAの繰り返し処理 Do Until ~について教えてください。 シートの行列を全て書いてしまうと長くなるので 少し省略させていただきます。    A  B  C  D 1 2008 1 ○ 2008 2 2008 2 × 2008 このような羅列がデータ検索の際に何行になるかわからない状態のデータがあります。 C 列はBが1の場合○、2の場合は× D 列はAが数字があればそのままコピーするようにくみました。 ここで教えていただきたいのが、現在私はCとDの構文は AまたはBに数字があればC,Dに反映するという構文ではなく C、Dの列の最後まで全て数式を入力する構文にしています。 なので、A,Bに入力があってもなくても数式が飛ぶような構文になっています。 そこで、DO Until ~ を使用し A列が空白になるまで処理を繰り返すとすればいいのかなとおもうのですが、 Dim n as integer n=1 Do Until Sheets("sheet1").Cells(n, 1) = "" 空白までという構文(正しいかはわかりませんが)で行き詰っています。 これ以降のAが空白ならDに貼り付ける、 B列も同様に空白まで検索し○または×に置き換えるとは どのうように組み立てたらいいのでしょうか? また、申し訳ないのですが Cが×ならその列の背景を色づける(今回の場合なら2の列) とことまでしてみたいのですが・・・ このようなことが可能であれば教えていただければと思います。 VBAははじめたばかりで不勉強な点も多々ありますがよろしくお願いします。

  • SQLの条件検索について

    下記のような「果物TBL」というテーブルがあるとします。 果物TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - 01    りんご     150 02    バナナ     250 03    みかん     250 04    ぶどう     300 -------------------------------- また上記のテーブルと全く同じ構成の「果物検索TBL」というテーブルがあるとします。 そのテーブルには、例として下記のような値を入れておきます。 果物検索TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - NULL   りんご     250 NULL   バナナ     NULL -------------------------------- この時、下記のようなSQLだと SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID AND LEN(果物検索TBL.ID) > 0) OR (果物TBL.名前 = 果物検索TBL.名前 AND LEN(果物検索TBL.名前) > 0) OR (果物TBL.値段 = 果物検索TBL.値段 AND LEN(果物検索TBL.値段) > 0); -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ みかん りんご -------------------------------- という結果になります。(名前:りんご・バナナと値段:250のOR検索) その結果を -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ -------------------------------- という結果にするにはどうすればいいでしょうか?(名前:りんご・バナナと値段:250のAND検索、バナナのみマッチ) 単純にORをANDにしてもうまくいきませんでした。 動的にSQLを作れれば良いのですが、この構成は変えられないのでNULL値がネックになり分かりません。 教えてください。 また、記載してるSQLよりもっとスマートな書き方があれば教えてください。