素人プログラミング備忘録

VBA内のSQLで「関係演算子が無効です」というエラーが出たときの原因と対処法。大体ANDとかORの使い方のせいらしい。【VBA備忘録】

プログラミング01

素人VBA備忘録第6回です。

例によって個人的な備忘録ですが、もしかしたら役に立つかもしれないので公開しています。

SQLでデータを引っ張ってくる際に出たエラーの話です。

「関係演算子が無効です」だと?意味わからん。

データベースから欲しいデータを引っ張ってくるときはSQLでやることが多いのですが、構文を間違えると当然ながらうまく持ってくることができません。
例えば一見正しそうな下の例、

"SELECT 取引先コード, 取引先名, " & _
"FROM マスタ1" & _
"WHERE "(取引区分 = '00') AND " & _
       "(データ区分 <> '20') AND " & _
       "(取引先コード = '30152' OR '30153') " & _
"ORDER BY 取引開始日, 取引先コード"

 

これでマクロを走らせると以下のエラーが返ってきます。

関係演算子が無効01

「関係演算子が無効です」???
とりあえず調べてみても AND とか OR の使い方がおかしいということ以外はわからず、上のコードのおかしさがわからない私には手詰まり感が半端ありませんでした。

AND や OR が複数出てくるとわかりにくいのは確かなので、なるべくカッコで括ってやるようにしていました。
それなのにおかしいと言われてもこちらとしては納得がいきません。

三本松
三本松
接続詞わかるようにちゃんと括ってるじゃねえか!

という逆ギレ状態のまま実行ボタンを連打しては跳ね返される時間を無為に過ごしていました。

やっとわかった解決法。SQLのANDとORは英語の接続詞じゃない!

何度実行ボタンを連打してもダメなものはダメなので、仕方なく色々と試してみた結果なんとか解決に至りましたので書き留めておきます。

先に正解を書いておくと、

"SELECT 取引先コード, 取引先名, " & _
"FROM マスタ1" & _
"WHERE "(取引区分 = '00') AND " & _
       "(データ区分 <> '20') AND " & _
       "(取引先コード = '30152' OR 取引先コード = '30153') " & _
"ORDER BY 取引開始日, 取引先コード"

 

これでうまくいきました。
間違っていたコードとの違いは下から2行目の OR のところです。

つまりSQLで条件を指定するときには、

A = B or C というつなぎ方はダメ

ということのようです。

英語の授業で習った接続詞は単語同士、句同士、節同士、文同士をつなぐことができましたが、SQLにおいて接続詞っぽい役割を果たす「AND」と「OR」は単語同士をつないでも前の句を受けてくれないということが判明しました。

A = B or A = C

という形で省略せずに書いてやらないといけなみたいです。

よくよく考えてみれば英語の接続詞で単語同士を接続しても本来は2つ目の単語の前には省略された句や節が存在するわけで、SQLではその省略を許さないということになるのでしょう。

スポンサーリンク




「関係演算子が無効です」エラーの一因まとめ。

今回出た「関係演算子が無効です」のエラーの原因は、ANDやORが単語同士をくっつけてくれない仕様のため出ていたようです。
もちろんこれだけが当エラーの原因ではないでしょうが、単純なコードでこれが出てしまいけっこうな時間を修正に費やしてしまいました。

結果大したことではありませんでしたが、この手の初歩的な問題ははネットで探してもなかなか見つからないのでこの記事を書いた次第でございますよ。

とにかくプログラムは日常の中で当たり前と思っているような前提が通用しない側面があります。
特に普通の英語だと思って接すると思わぬところで引っかかってしまうこともあるんですね。
「そんなバカなミスするのお前だけだろ」と思う方がほとんどでしょうが、ニッチなどなたかの役に立てば幸いでございますよ。

以上です!

 

 

ABOUT ME
三本松
三本松
北海道根室市出身、東京都内在住の中年妻子持ちサラリーマンです。 せっかく大学まで出たのに若いうちの時間を浪費してしまいましたが、自分で納得の行く人生を取り戻すべく現在も奮闘中です。 主に過去の失敗から学んだことを記事にして発信しています。