EXCEL VBAでADOを使ったデータ取得でSQL実行結果が上手くいかない

このQ&Aのポイント
  • EXCEL VBAでADOを使ってEXCELファイルからデータを取得する際、SQL実行結果が上手くいきません。削除フラグの値を抽出条件にしているため、'1'が入っているデータは削除された古いデータであり、抽出対象外にしたいです。
  • 実行時エラーは発生せず、処理は正常に終了しますが、対象データが取得できません。
  • SQL文や削除フラグのデータに問題があるのか、解決策を教えていただけないでしょうか?
回答を見る
  • ベストアンサー

EXCEL VBAでADOを使ってEXCELファイルよりデータを取得し

EXCEL VBAでADOを使ってEXCELファイルよりデータを取得しています。 その際のSQL実行結果が上手くいきません。 'Excel のバージョン 2003 SP3 'データ項目名 'ID,名前,,,,,,,,,,,長文1,長文2,,,,削除フラグ,削除日時,更新日時 ←こんな感じで20項目 上記の「削除フラグ」の値を抽出条件にしています。 文字列の項目で、''、' '、'1'などの値があります。 '1'が入っているデータは削除された古いデータなので、抽出対象外にしたいです。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1')" Set adoRS = adoCON.Execute(mySql) Debug.Print mySql 上記を実行すると、対象データはあるのに取得できません。 実行時エラーになることはなく、処理は正常に終了します。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ = '1')" だと、「削除フラグ」に'1'が入っているデータが取得できます。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ != '1')" これを試しましたが、構文エラー:演算子がありません となります。 SQL文が悪いのか、「削除フラグ」のデータが悪いのかわかりません。 解決していただけなしでしょうか?

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

  • ベストアンサー
  • kazuma299
  • ベストアンサー率100% (4/4)
回答No.1

こんにちは。 >上記を実行すると、対象データはあるのに取得できません。 取得できない対象データの削除フラグは、空のセルになっていると想像しました。 空のセルはNullという値になっています。 条件「削除フラグ <> '1'」は、真になりません。 >mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1')" 以下のようにすると、取得できなかった対象データも取得できると思います。 削除フラグの条件に OR 削除フラグ IS NULL を追加しています。 mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1' OR 削除フラグ IS NULL)" 確認に使ったサンプルプログラムを添付します。 確認に使ったサンプルデータを画像添付します。 Dim oConn As New ADODB.Connection Dim adoRS As ADODB.Recordset Dim mySql As String 'エクセルファイルに接続 With oConn .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties").Value = "Excel 8.0" .Open "E:\test\q6209009.html\test.xls" End With mySql = "select * FROM Sample1 WHERE (名前 LIKE '%山%') AND (削除フラグ <> '1' OR 削除フラグ IS NULL)" Set adoRS = oConn.Execute(mySql) Do Until adoRS.EOF Debug.Print adoRS!名前; adoRS!削除フラグ adoRS.MoveNext Loop '接続を閉じる oConn.Close はずれていたらごめんなさい。 よろしくお願いします。

sinmai_mam
質問者

お礼

画像まで付けていただいて、ありがとうございます。 サンプル通りで正常に取得できました。 Nullを考慮しなければならないのですね。 勉強になりました。 Nullを考慮して他の所も組みなおします!

関連するQ&A

  • PDOのデータ取得方法について

    お世話になります。 以前まで「mysql_query」でSQLを実行していたのをPDOで行うように変更しております。 prepareの「?」の部分までのSQLにした場合(1)、データ取得出来ますが (2)ですとエラーも返ってこなくデータ取得出来ません。 色々と試してはいますが、全く出来なくて大変困っています。どうかご教示くださいませ。 1)SELECT * FROM table WHERE data_code = ? and data_code2 = ? 2)SELECT * FROM table WHERE data_code = ? and data_code2 = ? and (data_code3 = "null" or data_code3 is null or data_code3 = "") ※PHP5.3、MySQL5.0です。

    • 締切済み
    • PHP
  • SELECT文でMySQLから取得したデータの使用

    PHP初心者なのでお手間を取らせてしまい申し訳ありませんがご教授お願いします。 select~ でMysqlより取得したデータをそのままMysqlで検索掛けたいので 下記のようにしてみたのですが機能しません "select * from address where addr_id like $row[addr]"; 多分色々と間違えてるのかも知れませんがよろしくお願いいたします。

  • MySQLでサブクエリーが使えないため困っています

    MySQL3.23.58にて以下のSQLを実行したいのですが、 サブクエリーが利用できないため困っています。 やりたいことは、 1.memberテーブルにemailが重複したデータがあるため、 ユニークなemailを取得したい。 2.取得したemailを元にmemberテーブルを参照し、 シーケンシャルでユニークなidを取得したい。 3.その取得したidを元にflagが立っているものを取得したい。 以上になります。 実際に行いたいSQL文は以下になります。 select count(*) from member where id in ( select max(id) from member where email in ( select distinct email from M_MEMBER where email != '' and email not like '%@docomo.ne.jp' and email not like '%ezweb.ne.jp' and email not like '%ido.ne.jp' and email not like '%vodafone.ne.jp' and email not like '%@jp-%' ) ) and flag = 1; どうかよろしくお願いいたします。

  • データ内の「\」や「'」を抽出するには

    データ内に「\」や「'」が含まれているデータを抽出するには SELECT * FROM table WHERE column LIKE '%\%' SELECT * FROM table WHERE column LIKE '%'%' で良いのでしょうか?

    • ベストアンサー
    • MySQL
  • 2つの情報を1つのSQLで取得する方法について

    お世話になります。 SQL文で、下記内容のデータを取得する方法がわかりません。 ・TESTテーブルからA、B、Cの3項目のデータを取得する。 ・但し、この中のC項目については、WHERE句の条件を満たす データの最大値を取得する。 ・項目AおよびBの取得条件は、項目Cと同一条件とする。 ・目的は、項目AおよびBに関しては、WHERE句の条件を満たす  全てのレコードを取得し、項目Cにおいては最大値のみ取得したい。 上記内容を取得しようと考えた場合、 現時点で下記のSQL文を作成して実行しましたが、 うまくデータが取得できません。 SELECT A, B, C FROM TEST WHERE C = (SELECT MAX(C) FROM TEST) AND Z = 'xxxxx' AND Y = 'x' AND X = 'Y' ※項目X, Y, ZはTESTテーブルのカラムです ※上記SQLを、A、Bのみ取得用とCのみ取得用に   それぞれ分解して実行すると、それぞれの結果は   正常に取得できます。 2つの結果を1つのSQLで取得することは可能でしょうか? どなたかご教授願えますか?よろしくお願いいたします。

  • 日付の期間内のデータ取得方法は?

    お世話になります。 Microsoft SQL server で、日付の期間内のデータを取得するにはどのような形にすれば良いのでしょうか? たとえば SELECT a FROM data WHERE ... and ... よろしくお願いいたします。

  • ExcelのVBAからoracleデータベースのデータ取り出しについて

    ORACLEのデータベース内の列名称が英文字交じりとなり ユニコードの使用が必要みたいなのですがうまくいきません分かるかたがいらっしゃいましたら回答を御願いします。 現行 mySQL = "select 型式.仕様内容,型式.詳細内容 from A.品番 where(型式.仕様内容 like '検索内容%')" Set rec = cnn.Execute(mySQL) 変更内容 仕様内容-> 内容A 詳細内容-> 内容B 変更後 mySQL = "select 型式.内容N'C,型式.内容D from A.品番 where(型式.内容C like '検索内容%')" Set rec = cnn.Execute(mySQL) エラー表示 実行時エラー (80040e14) ORA-00923 :fromキーワードが指定の位置にありません。 と表示されます。 fromを認識させる為にはどうすればよいですか? ※N'の代わりにStrConv(対象文字,vbUnicode)を使用しても同じこととなります。

  • mysqlのmatch() against()で検索結果が取得できませ

    mysqlのmatch() against()で検索結果が取得できません。 select * from fulltexttable where match( a ) against( '+ほげ' in boolean mode ) で検索結果は0件ですが、 select * from fulltexttable where a like '%ほげ%' だと検索結果は取得できます。 aカラムにはフルテキストインデックスは貼ってあります。 mysqlのバージョンは5.0.77 hogeテーブルはMyISAM どなたか助けてください。

  • MYSQL バイナリーデータに変換して取得

    MYSQLでSELECTして以下のテーブルのCODEカラムからバイナリーデータに変換してデータを取得したいのですが、どうしたら良いでしょうか? SELECT CODE FROM TABLE_NEME WHERE ID='XXX' <テーブルデータ> CODE(varchar型) 011A00046D0ADC4B

    • ベストアンサー
    • MySQL
  • 24時間以内に更新されたデータを取得

    MySQL3で24時間に更新されたデータを取得したいのですが、いまいち方法が分かりません。 select * from test WHERE to_days(now()-60*60*24) > UpdataDate このような形では無理なようなのですが、いい方法はあるでしょうか? UpdataDateはdatetime型です。 よろしくお願いします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう