• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【VBA】if文中のinstrの条件2つ)

【VBA】if文中のinstrの条件2つ

このQ&Aのポイント
  • VBAのif文内で、2つの条件を使用した場合について質問です。条件を複数にする際に、なぜInStr関数を使用せずに数字の比較が必要なのかを理解したいと思っています。
  • 質問者は、VBAのif文内で複数の条件を組み合わせた場合にInStr関数を使用すると、なぜ数字の比較が必要なのか疑問に感じているようです。
  • 質問者は、VBAのif文内で複数の条件を組み合わせた場合に、なぜInStr関数を使用せずに数字の比較が必要なのかを理解したいと思っています。

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

  • ベストアンサー
回答No.3

こんにちは。お邪魔します。 #原稿書いている内に同趣旨、類似のご回答が先着していますが、  拙稿後段に重みを置いて書いているつもりなので、  以下原文ままあげてみます。 > If InStr(.Cells(Line, 10), "test1") > 0 And InStr(.Cells(Line, 10), "test2") > 0 Then '(1) > If InStr(.Cells(Line, 10), "test1") And InStr(.Cells(Line, 10), "test2") Then '(4) この2つは同じ結果を返すと思っていたら 期待した結果と違う場合が多い、 その理由は? というお話としてお応えします。 解り易くする為に、Instr関数の戻り値をそれぞれ、  InStr(.Cells(Line, 10), "test1") → 1  InStr(.Cells(Line, 10), "test1") → 6 とした例で、書き換えてみます。  If 1 > 0 And 6 > 0 Then '(1)n     1 > 0    の演算結果は、論理値 True です。     6 > 0    の演算結果は、論理値 True です。    したがって、     True And True    の演算結果として、論理値 True が返ります。   If 1 And 6 Then '(4)n     1 And 6    の演算結果は、長整数型 0 です。    したがって、If文の内側の論理式は結果として     False を返します。   数値1 And 数値2 のように書くと、数値1と数値2を   ビット演算 した結果を返します。 ビット演算について詳しいことはご自身で調べてみて下さい。 簡単にいうと、数値を二進数として扱うとして、 2進数の各桁ごと共通して 1 である桁、 の数値を返すのがAnd演算子です。 例えば、   1 And 2 は、二進数では、0001 0010 ですから、 各桁ごと共通して 1 である桁がないので、結果は 0   3 And 2 は、二進数では、0011 0010 ですから、 各桁ごと共通して 1 である桁は、二の位なので、結果は 2   7 And 6 は、二進数では、0111 0110 ですから、 各桁ごと共通して 1 である桁は、二の位と四の位なので、結果は 6 そして例示に戻って、   1 And 6 は、二進数では、0001 0110 ですから、 各桁ごと共通して 1 である桁がないので、結果は 0 になります。   If 1 And 6 Then '(4)n は、   If 0 Then '(4)nn と同じ意味で、論理値へキャストされた結果   If False Then '(4)b という意味になります。 恐らく、Or演算子では問題にならなかったものが、 何故And演算子では問題になるのか、という疑問が、 ご質問の本質なのだと思いますが、 Or演算子は二進数として扱った場合の、 各桁のどちらかが 1 であるならば、 その桁は 1 という風に、各桁の重複を無視した和を求めます。 和を求める以上、   数値1 Or 数値2 数値1または数値2のどちらかが 0 でない数値ならば、 結果が 0 になることはないのです。 例えば、   1 Or 2  → 0001 Or 0010 → 0011 → 3   3 Or 2  → 0011 Or 0010 → 0011 → 3   7 Or 6  → 0111 Or 0110 → 0111 → 7   1 Or 6  → 0001 Or 0110 → 0111 → 7   0 Or 0  → 0000 Or 0000 → 0000 → 0 といった具合。 0 以外の数値を論理式に渡した場合は、   If True Then '(4)b という意味になります。 And演算子を使う場合は、 > If InStr(.Cells(Line, 10), "test1") > 0 And InStr(.Cells(Line, 10), "test2") > 0 Then '(1) のように、論理値同士を演算させるのが必須です。 > If InStr(.Cells(Line, 10), "test1") And InStr(.Cells(Line, 10), "test2") Then '(4) のようにビット演算を用いるのは間違いです。 Or演算子については、(数値同士を演算させる場合は) If InStr(.Cells(Line, 10), "test1") Or InStr(.Cells(Line, 10), "test2") Then If InStr(.Cells(Line, 10), "test1") > 0 Or InStr(.Cells(Line, 10), "test2") > 0 Then どちらも同じ結果を返します。 この場合に不等号を使うべきか使わないでいいのか、 意見は分かれるところでしょうけれど、 私は、不等号省略する派、ですが、 And、Or、両方使う場合は、論理演算なのかビット演算なのか明示する意味 で、不等号で統一する場合も少なくないです。 Orの場合に限っては、どちらでも書ける、と覚えておけば、 人様のコードを読む時に困らないで済む、ということだけは ハッキリと言えることです。 以上、ご参考まで。

MKT_
質問者

お礼

 どうもありがとうございます!m(_ _)m   >#原稿書いている内に同趣旨、類似のご回答が先着していますが、 >拙稿後段に重みを置いて書いているつもりなので、 >以下原文ままあげてみます。  はい、誠にありがとうございます。ビット演算の説明まである方が 後々ここを見られる初心者の方が分かりやすいかな?と思いましたので realbeatin様をBAにさせていただきます。m(_ _)m >And、Or、両方使う場合は、論理演算なのかビット演算なのか明示する意味で、不等号で統一する場合も少なくないです。  なるほどでございます。理解いたしました。^^  ここまでお詳しいご説明をいただけて光栄でございます。 お時間を取っていただき誠にありがとうございました^^ゞ

その他の回答 (2)

回答No.2

(4)は、InStr(.Cells(line, 10), "test1") と InStr(.Cells(line, 10), "test2") の戻り値を2進数にして、各ビットのANDを取った結果が0以外ならTrue、0ならFalseとしたい場合の滅多に使わない書き方。

MKT_
質問者

お礼

 どうもありがとうございます!m(_ _)mm(_ _)m >戻り値を2進数にして、  自分で調べても気づくだけのスキルがございませんでした。。。^^; orz  この度はどうもありがとうございました!

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

InStr関数は文字列が見つかった位置を表す数値を返します。 数値>0は論理値です。 論理値 and 論理値は論理値です。論理演算を行います。(1)の状況です。 論理値が期待されているところに数値を書けば0はfalseでそれ以外はtrueを解釈されます。(2)や(3)の状況です。 数値 and 数値は数値です。ビット演算を行います。その上で論理値に解釈されます。(4)の状況です。 もし InStr(.Cells(line, 10), "test1")=1 InStr(.Cells(line, 10), "test2")=6 であれば (1)(2)(3)はtrueになりますが(4)はfalseですね。 もし InStr(.Cells(line, 10), "test1")=1 InStr(.Cells(line, 10), "test2")=7 であれば (1)(2)(3)はtrueになりますし(4)もtrueですね。

MKT_
質問者

お礼

 どうもありがとうございます!m(_ _)m >数値 and 数値は数値です。ビット演算を行います。 という事だったのでございますか(・o・ 存じませんでした。m(_ _)m >InStr(.Cells(line, 10), "test1")=1 >InStr(.Cells(line, 10), "test2")=7 >であれば >(1)(2)(3)はtrueになりますし(4)もtrueですね。  はい。全く分かっておりませんでした。おかげで理解いたしました。m(_ _)m  後から見る方でビット演算の事がわからない方が結構いるのでは?などと思いましたのでその説明もつけていただけたNo.3様をBAにさせていただきます。  カテゴリーマスターを持っていらっしゃる方にコメントいただけて光栄でございます。もしまた困っているのを見かけてくださったらどうぞ、コメントしてやって下さい。^^  この度はご親切に誠にありがとうございました。m(_ _)m

関連するQ&A