• ベストアンサー

VB6,論理演算子Orの使い方がわからない

以下のようなコードを書きました。 If a = 0 Or 6 Then   msgbox a Else   msgbox "a" End If 期待しているのは、変数aの値が0か6のときにだけ変数aを表示するというものです。 しかし実際にはたとえばaの値が2のときでも変数aが表示されてしまいます。 ひょっとしてOrの使い方を間違っているのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.7

>a=0 or 6が実は定数-1になってしまいます。 >というのはどうしてなのでしょうか a = 0 or 6 と普通にaに代入すると これはビット演算ですから a に6が入ります。 しかし、if文の中では a=0 と 6 の論理演算になります。 演算子の優先順序など、詳しいことは#6の方の説明の中にあります。 そして (( a = 0 ) or 6 ) の評価が-1(True)となります。 上記でも分かると思いますが、6が単独で残ってしまうのが問題で、 必ずTrueになってしまいます。

tochanx
質問者

お礼

思い出しました! CInt(True) とすると結果は-1になるんですね! 本当に助かりました。どうもありがとうございました!

その他の回答 (6)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.6

> 0 or 6 では単純な計算式ですから 6 となります。 Or演算子は論理和ではなくbit和で計算されます。 00000000と00000110のbit和で00000110 一方、=演算子はbool値を帰します。 また、演算子には優先順位があって、= の方が Or より強い。 > If a = 0 Or 6 Then は ((a = 0) Or 6) が評価され aが0の場合は (a=0)の値はTrue 2進で書くと 1111111111111111 Or 0000000000000110 でbit和は 1111111111111111 つまり if True then aが0以外は (a=0)の値はFalse 2進で書くと 0000000000000000 Or 0000000000000110 でbit和は 0000000000000110 つまり if 6 then if文は0以外はthen節を実行される。

tochanx
質問者

お礼

とてもとても勉強になりました!どうもありがとうございました!

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.5

かなり派手に間違っていますね^^; 正しい書き方は#1の方の通りですが、 0 or 6 では単純な計算式ですから 6 となります。 すると 上記のコードは if a = 6 then と同じことになり・・・ ちょっとおかしいですよね。 a = 6と同じなら a が6のときしかifの中に入らないはず!? 実は上記の使い方は二重に論理ミスを犯していまして、 かなりおかしなことになっています。 a = 0 or 6 が実は定数 -1 になってしまっています。 で上記のコードは if -1 then と同じになっています。

tochanx
質問者

補足

回答ありがとうございます。 かなり派手に間違ってしまいました。 ところで、 >a=0 or 6が実は定数-1になってしまいます。 というのはどうしてなのでしょうか?もうちょっと教えてもらえないでしょうか?

  • 2531kbps
  • ベストアンサー率13% (183/1333)
回答No.4

> If a = 0 Or 6 Then の6というのは、常に6なのでそのif条件には必ず合格(?)します。 正しくは、 If a = 0 Or a = 6 Then 私なら If (a = 0) Or (a = 6) Then としますね。 a = (0 Or 6) というのも無理なんじゃないかなあ。 まあ、VB6にもデバッガがあるので、ifステートメントの条件式の値をウォッチするとよいでしょう。 プリントさせるなら、aだけでなく、条件式の中身も画面上に出すと分かります。

tochanx
質問者

お礼

ありがとうございます。 納得できました。 0 or 6が6になるというのは、 00000000 00000110 をorすると6になるからTrueになる、ということであってるでしょうか?

回答No.3

No1の方の回答どおり、ここはVBAもVB6も同じです。 If (a=0) or (a=6) Then  msgbox a Else  msgbox "a" End If で、 If a=0 or 6 Then は、6はbool値でTrueですから必ずTRUE側に落ちます。 msgbox cbool(6) をやってみるとわかりますよ。

tochanx
質問者

お礼

cboolを使って理解が深められました。 どうもありがとうございました。

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.2

正解は#1の方の書き方で良いと思います。 要は以下のように書いた時、  If [評価式A] Or [評価式B] Then   処理X  ELSE   処理Y  END IF 評価式Aが真 または 評価式Bが真 の時に処理Xが行われます。 質問者さんのような書き方をしてしまうと a=0が偽と判定されてもBの評価式が「6」としか書いてないので常に真となってしまいます。 ※真偽の判断は内部的には 偽が0、真はそれ以外 というようになってます。  その為、0以外の数値などは真と判定されます。

tochanx
質問者

お礼

とてもわかりやすかったです。 納得できました。ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

わたしはVBAしか知りませんが、VBAならこうです。 Sub test() a = 2 If a = 0 Or a = 6 Then MsgBox a Else MsgBox "a" End If End Sub

tochanx
質問者

お礼

なるほど、a=をもうひとつ書かなきゃいけなかったんですね。 どうもありがとうございました。

関連するQ&A

  • 論理演算

    ビットの判定するために次のコードをしました。 if ( A And 2 = 2 ) or ( A And 4 = 4 ) Then ~ Aの論理積の結果が2か4ならばThen以下の処理の中に入っていってもらいたいのです。 ところが上記のコードでは演算式になってしまっているようで、 結果的にAが0以外ならば全てThenに入ってしまうザルコードになってしまいました。 散々つつきまわって以下のように( ) で括ればいいことが分かりました。 if (( A And 2 ) = 2 ) or (( A And 4 ) = 4 ) Then ~ ( )で括ればいいというのは分かりましたが、理由はさっぱり分かりません。 一番最初に書いたコードでも正常に見えるからです。 納得がいきませんので、どなたか説明よろしくお願い致します。

  • 論理演算をつかったインクリメントのしかた

    Public Sub ensyuu_2() Dim RIdx As Long For RIdx = 1 To 40 Cells(RIdx, 1).Value = RIdx If ((RIdx Mod 16) = 0) Then Cells(RIdx, 2).Value = (RIdx / 16) And 15 Cells(RIdx, 3).Value = RIdx And 0 Else Cells(RIdx, 2).Value = Fix(RIdx / 10) Cells(RIdx, 3).Value = RIdx Mod 10 End If Next RIdx End Sub もう一つ変数(たとえばA)を用意して、これと同じ結果になるように その変数(A)にOrやXorなどの演算を使ってインクリメントさせていくには どうしたらよいでしょうか?

  • vbsのFolderExistsで部分一致をさせたい

    VBSで以下のコードを作成しましたが動作しません。 ********動作しない************************** if (objFileSys.FolderExists("200810*")= True) then  msgbox "yes" else  msgbox "no" end if ********動作する************************** if (objFileSys.FolderExists("200810")= True) then  msgbox "yes" else  msgbox "no" end if 部分一致でフォルダが存在するかをしたいのですが、 どうしたらいいのでしょうか。 よろしくお願いします。

  • エクセル・時刻に関する質問

    添付画像のようなエクセルで以下の標準モジュールを作っています。 Sub test001() If Cells(2, 2) = TimeValue("9:00:00") Then MsgBox ("9:00:00認識しました") Else MsgBox ("9:00:00認識しませんでした。") End If If Cells(3, 2) = TimeValue("9:05:00") Then MsgBox ("9:05:00認識しました") Else MsgBox ("9:05:00認識しませんでした。") End If If Cells(3, 2) = 0.378472222222222 Then MsgBox ("2回目9:05:00認識しました") Else MsgBox ("2回目9:05:00認識しませんでした。") End If If Cells(4, 2) = TimeValue("9:10:00") Then MsgBox ("9:10:00認識しました") Else MsgBox ("9:10:00認識しませんでした。") End If If Cells(5, 2) = TimeValue("9:15:00") Then MsgBox ("9:15:00認識しました") Else MsgBox ("9:15:00認識しませんでした。") End If If Cells(6, 2) = TimeValue("9:20:00") Then MsgBox ("9:20:00認識しました") Else MsgBox ("9:20:00認識しませんでした。") End If End Sub 実行すると、9:05:00 だけが、「9:05:00認識しませんでした。」となります。 時刻以外は同じ内容のはずですが 9:05:00 だけ認識されません。 解決策をお願いします。

  • 一致するように思えるのですが。

    不思議でなりません。 以下のようなコードを書いていますが、 間違いなく一致するはずなのに一致しない方にのみ流れます。 (atariのメッセージが出ません) If Cells(n, 4) = Cells(8, 12) Then msgbox "atari" Else MsgBox Cells(n, 4) MsgBox Cells(8, 12) End If ということで、elseに比較する両方を表示してみましたが、 チャンと同じ数字(実際は194)が表示されます。 1ステップずつのトレースでもマウスを宛てると194と表示されます。 どのように調べればよいでしょうか。 考えられるポイントを教えてください。

  • iと言う変数の値が1から10の間にないならば

    「iと言う変数の値が1から10の間にないならば」、としたいのですが どのようなコードを書けばいいのでしょうか? Sub test1() Dim i As Integer i = 11 If 1 < i < 10 Then MsgBox i & "は1から10の間にはありません" End If End Sub だと、メッセージが表示されてしまいます。

  • VBA 加算演算時のトラブル

    事務処理用に準備したVBA処理の数値合計チェックにて本来イコールとなるべきところ、ノットイコールと判定されてしまいます。当該部分を抜き出し、わかりやすくしたものが下記のロジックですが、ここで、test2,test4は結果がイコールとなるものの、test3の場合、ノットイコールとなってしまいます。どなたか、原因につき教えていただけませんか? Dim aaa As Double Dim bbb As Double sub test2() bbb = 16.67 + 16.67 aaa = 33.34 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test3() bbb = 16.67 + 16.67 + 16.67 aaa = 50.01 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test4() bbb = 16.67 + 16.67 + 16.67 + 16.67 aaa = 66.68 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End sub

  • VBSのIF文について

    VBSのIF文の質問です。 OS:XP(SP3) たまたま間違った変数名を使った事ではまってしまった事なのですが 下記がTrueで評価されてしまいました。これは正しい評価なのでしょうか? サンプルコード rcode = 0 a = 0 If rcode = e Then msgbox "「" & rcode & "」 = 「" & e & "」は間違った評価だと思います" else msgbox "「" & rcode & "」 <> 「" & e & "」です" end if

  • Excelのセルの比較について

    Excelのマクロにてセルの比較を行っています。 A1に"123" A2をハイパーリンクに指定して"123"と表示しています。 表示形式はどちらも通貨で表示しています。 If Range(A1).Value <> Range(A2).Value Then   MsgBox "同じではない" Else   MsgBox "同じ" End If と比較しているのですが"同じではない"が表示されてしまいます。 試しに MsgBox Range(A1).Value と MsgBox Range(A2).Value を表示してみたところ、どちらも"123"と表示されました。 セルに表示されている値で比較するにはどうしたらいいのでしょうか?

  • 「Xor」と「Or」の違い(vba)

    こんばんは。 よくわからないので教えてください。 Option Explicit Sub Xorのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Xor フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub '**************************************** Sub Orのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Or フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub 上記のコードなのですが どちらも結果は同じです。 「Xor」と「Or」の違いがよくわからないのですが 何が違うのでしょうか? 調べてみると「Xor」は「排他的理論和」だそうです。 よろしくお願いします。