• 締切済み

[Excel ADO]条件入力の簡素化

Excel2007を使い、ADOによるCSVファイルのSQL処理をしています ユーザーフォームで条件を入力し、原則以下のようにSQL文化しています 【売上データから商品名で検索する】 sql = "SELECT * FROM 売上.csv WHERE 商品名='" & 商品名.text & "' (「商品名」はユーザーフォーム上のテキストボックスオブジェクト) この際に、ANDやORなども使えたら便利だと思いますが、 SQLとして正しいものは、 商品名='A' OR 商品名='B' とせねばならず、記述がメンドウです。 入力上は 'A' OR 'B' ('A' AND 'B') OR 'C' などとして、それを内部で正しいSQLに変換するような ライブラリなどはないでしょうか? 機械的に「商品名=」という文字列を挿入するような コードを書こうかとも思いましたが、 もう少し賢いパーサーのようなもの(?)が既に存在しても おかしくない気がしました 何かご存じの方がいらっしゃいましたら教えてください よろしくお願いします

みんなの回答

  • chie65535
  • ベストアンサー率43% (8525/19377)
回答No.1

今までの「商品名」のテキストボックスを「商品名1」に名前変更します。 そして、新規にテキストボックス「商品名2」を作ります。 次に「条件」のグループボックスを作り、その中に「条件and」と「条件or」という名前のオプションボタンを作ります。 そして、sqlを生成している部分を、以下のようにします。 sql = "SELECT * FROM 売上.csv WHERE 商品名='" & 商品名1.text & "" If Not ISEmpty(商品名2) Then If 条件and = True then sql = sql & " AND 商品名='" & 商品名2.text & "" Else If 条件or = True then sql = sql & " OR 商品名='" & 商品名2.text & "" Endif Endif

hzd00430
質問者

お礼

ご回答ありがとうございます。

hzd00430
質問者

補足

せっかくなのですが、パラメータは2つとは限りませんし、 条件となる項目は、色、サイズ、取引先名、納入先名など他にもあるのです。その辺りを勘案しますと、文字入力で条件式を書くのが早そうかと思っています。 ただ、ご提示のようなGUIでも、一から自分で作成するのではなく 可変個数の複数パラメータを柔軟かつ簡単に扱えるライブラリがあれば テキストで条件式をかくよりいっそう便利かなとは思います。

関連するQ&A

  • [Excel ADO]条件にマッチした伝票の出力

    Excel2007 ADOを使ってCSVのSQL処理をしています 対象は売上伝票で、取引先名、商品名などで検索をかけるのですが その結果がマッチした明細のみしか取り出せないのをなんとかしたいです 例えば、1つの伝票には複数明細が含まれるのが通常ですが、 商品名で検索すると、その商品の明細しか出てきません これを、マッチした明細を含む伝票全体を取り出したいのです SELECT 伝票日付,伝票番号 FROM T_売上 WHERE 取引先="A社’ AND 商品名='鉛筆' GROUP BY 伝票日付,伝票番号 こんな形で検索対象を含む伝票の伝票番号リストを得ることはできたので、 次はこの日付と番号でWHEREをかけるのか あるいはEXSISTSなどを使うのか ちょっと具体的にイメージできません 教えていただけるとありがたいです よろしくお願いします

  • [Excel ADO] WITH句の可否

    Excel2007のADOを使ってCSVファイルのデータを集計する方法を習得中です http://okwave.jp/qa/q9081610.htmlで質問させていただきました内容で、 uriage.csv 伝票日付,伝票番号,取引先名,明細番号,納入先コード,商品名,単位,数量,単価,金額,取引区分 270901,00000664,X社,1,0071,商品A,個,4,2250,9000,1 270901,00000664,X社,2,0071,商品B,個,4,1750,7000,1 270901,00000664,X社,3,0071,消費税,,0,0,1280,2 270903,00000739,X社,1,0067,商品C,式,1,0,0,1 270903,00000739,X社,2,0067,商品D,個,1,0,0,1 270915,00000360,X社,1,,振込,,0,0,4320,0 270915,00000363,X社,1,,振込,,0,0,78840,0 270915,00000363,X社,2,,振込,,0,0,135540,0 271022,00000831,Y社,1,0090,商品B,式,1,10000,10000,1 271022,00000831,Y社,2,0090,消費税,,0,0,800,2 271022,00000832,Y社,1,0144,商品D,個,1,2000,2000,1 271022,00000832,Y社,2,0144,消費税,,0,0,160,2 271105,00000447,Y社,1,,振込,,0,0,2160,0 271110,00000459,Y社,1,,振込,,0,0,10800,0 nonyu.csv 納入先コード,納入先名 0067,本社 0071,M支店 0084,N支店 0090,本社 0109,S支店 0144,T支店 というテーブルに対して、以下のようなSQLを発行することで、VBAによらずSQLのみで処理することができるようになりました(実際はもう少し複雑なSQLですが、質問に際して簡略化しました) Sub sqltest() Dim cn As ADODB.Connection Dim rs As Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ActiveWorkbook.Path & ";" & _ "Extended Properties='Text;HDR=YES'" cn.CursorLocation = adUseClient Sql = "SELECT * FROM ( " Sql = Sql & "SELECT 明細番号,伝票日付,伝票番号,商品名,単位,数量,単価,IIF(取引区分>0,金額),NULL,IIF(取引区分=0,金額) FROM uriage.csv 売上" Sql = Sql & " UNION ALL " & _ "SELECT 0,伝票日付,伝票番号,取引先名,NULL,NULL,NULL,NULL,NULL,NULL FROM uriage.csv 売上" & _ " GROUP BY 取引先名,伝票日付,伝票番号" Sql = Sql & " UNION ALL " & _ "SELECT 99,伝票日付,伝票番号,'納入先: ' & 納入先名,NULL,NULL,NULL,NULL,SUM(金額),NULL FROM uriage.csv 売上" & _ " LEFT JOIN nonyu.csv AS 納入先台帳 ON 売上.納入先コード=納入先台帳.納入先コード" & _ " WHERE NOT ISNULL(売上.納入先コード) " & _ " GROUP BY 取引先名,伝票日付,伝票番号,納入先名" Sql = Sql & ") ORDER BY 伝票日付,伝票番号,明細番号" Set rs = cn.Execute(Sql) Range("A2").CopyFromRecordset rs End Sub 一応できたことはできたのですが、データが大量になってくるとSELECT文を3回発行しているためかレスポンスが非常に悪くなってしまっています(上記では、全データを対象にしていますが、実際はWHEREにより日付、取引先名、納入先名などで絞り込んでいます。これを3回やるのは目に見えて無駄とは思うのです) 高速化の方策をいろいろ検索してみましたところ、UNIONで繋げるのは愚策で、共通するSQL文をWITH句でまとめるのが良いという記事がありました しかし、WITHを使おうとしてもエラーとなってしまいます。Excel ADOでは使えないのでしょうか? あるいは、まったく異なるアプローチなど、何かありましたらご示唆ください。 よろしくお願いします

  • [Excel ADO]テキストとシートの混在使用法

    Excel2007を使っています。 ADOを使ったSQL処理をやっているのですが、 元データ(テーブル)をCSVファイルと、エクセルのシートの両方を使うことはできますか? 例えば、商品コード表とか担当者コード表みたいな比較的小規模かつ動きの少ないものはエクセルシート上の表を参照し、CSVファイルの売上データを処理する、というようなイメージです 小さなテーブルのファイルが増えていくのがイヤで、ひとつのブック内に集約しておけないものでしょうか

  • [Excel ADO]合計額の挿入は可能ですか?

    Excel2007のADOを使ってCSVファイルのデータを集計する方法を習得中です ある業務アプリからエクスポートしたデータなのですが、 売上伝票データ: 伝票日付、伝票番号、取引先名、明細番号、商品名、数量、単価、金額、取引区分、納入先コード 納入先コードテーブル: 納入先コード、納入先名 取引区分が0なら売上、1なら入金(入金伝票の場合納入先コードがNULL) これを集計して売上明細表をつくるとして、 伝票毎に伝票合計額、および納入先名を挿入するようなことが SQL文だけで可能でしょうか?

  • 【Excel】条件が多すぎて…?

    おはようございます。早速ですが質問です。 今、ある商品についてExcelで料金参照表を作っています。 商品名Aで仕様がa 商品名Aで仕様がb 商品名Bで仕様がa 商品名Bで仕様がb ・ ・ ・ 商品は”商品名R”まで、全部で18商品、 参照する料金表は全部で15パターンあります。 内訳としては 仕様a.bに対応するのが3商品 仕様a.cに対応するのが1商品 仕様a.dに対応するのが3商品 仕様aのみしか対応できないのが1商品です。 サイズを入れて料金表の中から値を拾うのは INDEXとMATCHを使ってできるのですが 参照すべき料金表を拾うことができないのです。 一度、以下のように作ってみたのですが 条件が多すぎて、ネストの制限に引っ掛かってか エラーになってしまいます。 IF(AND(A1="A",A2="a"),INDEX(料金表! $A$4:$H$8,C3,B3),IF(AND(A1="A",A2="b"),… 以下ずーっと繰り返し続く なにかいい方法はありませんでしょうか? これさえ解決すれば完成するのですが…。 どうか宜しくお願いいたします。

  • 抽出条件入力用テキストボックスが空白の場合の抽出条件

    SQL初心者です。 今あるテーブル(TABLE)に | VALUE_A | VALUE_B | VALUE_C | VALUE_D | ----------------------------------------- | 000 | AAA | AAA | AAA | | 001 | AAA | AAA | BBB | | 002 | AAA | BBB | AAA | | 003 | BBB | BBB | BBB | | 004 | BBB | BBB | NULL | のようなデータが入っているとします。 Web上から VALUE_B VALUE_C VALUE_D に対しそれぞれテキストボックス入力フィールドから値を入力し検索を行うようにしたいのです。 [VALUE_B]=AAA [VALUE_C]=AAA [VALUE_D]=AAA と入力されれば VALUE_A:000 を検索結果として出します。 [VALUE_B]=AAA [VALUE_D]=AAA と入力されれば VALUE_A:000 VALUE_A:002 を検索結果として出します。 [VALUE_B]=AAA だけが入力された場合は VALUE_A:001 VALUE_A:002 VALUE_A:003 を検索結果として出します。 つまり、フォームのテキストボックスに入力された条件で抽出し、入力が無い場合は全件抽出を行いたいのです。 この場合、どのようなSQLを組めばよいのかわかりません。ANDやORだけでは対応できないような気がします。Oracleを始めたばかりということもあり、どのような関数を使えばよいのかもわかりません。どなたかご教授いただけませんでしょうか??よろしくお願いします。

  • excel vba ユーザーフォーム

    現在、セルa101からa110までに「商品名」、セルb101からb110までに「金額」が 入力済みです。 このデータを、ユーザーフォーム上にコンボボックスを2つ作成し、セルa1へ 商品名を選択後、入力。また、b2へ金額を選択後、入力させたいのです。 また、ユーザーフォーム上にテキストボックスを作成し、ここに入力した 「備考」の全角10文字をc1へ移動したいです。 今のところ、ユーザーフォーム、コンボボックス、テキストボックスを作成した だけで 立ち往生しています。 どなたか、ご教授お願いいたします。

  • エクセルVBA条件一致したとき数量加算

    はじまして。最近VBAを勉強するようになり、壁にぶつかりました。      A      B     C    商品名    金額   数量 1   りんご     100    1 2   みかん    110      2 3    りんご    120      1 4   ぶどう     200     3 5     このような表にユーザーフォームを使い入力したいのですが (ユーザーフォームには商品名、金額、数量を入力するテキストボックスがあります。) 例えば次に「りんご 100(金額)  2(数量)」 と入力したときに、セルC1の数値が3になるようにしたいのです。 ようは商品名、金額の両方が一致したときにはそのあてはまる列の数量に加算し、 そうでない場合は下の5列に入力したいのですが、どうすればいいでしょうか。 初めての質問なのでわかりにくかったらすいません。

  • エクセルで、2つの条件に合う結果を自動で入力したい

    お願いします。 下記のような商品の価格一覧表があります。 A列に、商品名 B列に、大きさ C列に、単価 別表で売り上げ入力していますが、 Aの商品名と、Bの大きさは、リストから選択入力していますが、 AとBの組み合わせでCの単価は決まっているのに、毎回リストから同じように選択して入力しています。 このCの単価を、AとBを入力したら、自動的に出てくるようにしたいです。 よろしくお願いします。

  • ■緊急■Access2002 単票形式のフォームでデータが入力できない!

    お願いします。 単票形式のフォームにある入力項目は以下の通りです。 売上ID(オートナンバー) 氏名(テキスト型) 商品名(テキスト型) 数量(数値型) 売上日(日付型) フォームを開いて、新しいレコードを入力する際に、 氏名と商品名は入力できるのですが、 数量、売上日が入力できません。 フォーカスは移動するのですが、、、、 原因がわからず困っています。 どうかよろしくお願いいたします!

専門家に質問してみよう