• ベストアンサー

「Debug.Print i = i + 1」がFalseになる。

Sub test() Dim i As Long i = 0 Debug.Print i = i + 1 End Sub を実行すると False がイミディエイトウインドウに表示されます。 理由が知りたいです。 よろしくお願いします。

  • zxdaeg
  • お礼率98% (546/553)

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

  • ベストアンサー
  • s-uzen
  • ベストアンサー率65% (2051/3118)
回答No.2

Printステートメントの outputlist並びの=が、代入式ではなく比較式と評価、実行されるためでしょうね。 演算子は式のリストに含められ、算術演算子、比較演算子、論理演算子等色々ありますが、代入記号はリスト項目にはありませんので、エラーとならないのは演算子とみなしているからですね。 Print i = i + 1 の結果は、0と1の比較なのでFalse Print i = i とすると、0と0の比較なのでTrue Print i, i + 1の場合は、変数と数式なので 0と1 という結果になるはずです。  

zxdaeg
質問者

お礼

すごくわかりやすいです。どうもありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

i = i + 1 演算(その後の結果の代入)を優先して、その結果を、出してほしいのでしょうが、そうはなりません。 VB以外でも多くはそうだと思います iと i+1が等しいか、評価されて、FALSEかTRUEが返り、(この場合はいつも(iに関係なく)等しく無いから、いつもFALSE)、それが表示される。 結果を表示するdebugやMsgboxと使うと、=は真か偽かの判定の演算子の扱いです。Javaの場合=、==の代入と判定機能で記号が分かれているので、どうなるんだったかな。 http://www5c.biglobe.ne.jp/~ecb/java/01_06.html iの変数の型によってエラーになるので、エラーになる場合が多いかも。

zxdaeg
質問者

お礼

どうもありがとうございました。

  • tomo00223
  • ベストアンサー率34% (12/35)
回答No.1

Debug.Printの中に等式があります。これが問題なのでは? Debug.Print i + 1 なら動作するのではないでしょうか? もしくは、iの値に+1したものを保持したければ、 i = i + 1 Debug.Print i でも良いと思います。

zxdaeg
質問者

お礼

等式にするとこうなるのですか。参考になりました。

関連するQ&A

  • 変数を続けて宣言した場合はEmpty型になる?

    Sub test1() Dim Int1, Int2 As Long Debug.Print "---------- test1の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub Sub test2() Dim Int1 As Long Dim Int2 As Long Debug.Print "---------- test2の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub を実行すると、 ---------- test1の実行結果 ---------- Empty Long ---------- test2の実行結果 ---------- Long Long の結果が得られます。 test1のInt1がEmpty型になりますが、変数の型にEmptyはないですよね? どういうことなのでしょう???

  • イミディエイトウインドウの最高表示数は199行?

    当方XP&Office2003です。 Sub test() Dim i As Long For i = 1 To 200 Debug.Print i Next i End Sub を実行すると、 2 3 ・ ・ ・ 200 と、表示され、最初の1が消えてしまいます。 イミディエイトウインドウでは、199行までしか表示できないのでしょうか? 私がoffice2003だからですか?

  • lenは文字数を取得する関数ですよね?

    vbaで Sub test() Dim i As Long Debug.Print Len(i) End Sub とすると、4が返るのですが、なぜなのかまったくわかりません。 iには0が入っているので、一文字だから1が返ると思うのですが・・・

  • Publicで宣言しているから起きる現象?

    Option Explicit Public i As Long Sub test1() i = i + 1 Debug.Print i End Sub これを数回実行すると イミディエイトウインドウには 1 2 3 4 5 と記載されていきます。 なぜEnd Subで終わっているのにiの値がリセットされないのでしょうか? 「Public」で宣言しているからですか? Publicで宣言しつつ、1から開始したい場合は Sub test2() i=0 i = i + 1 Debug.Print i End Sub とするべきなのでしょうか? またtest1のiの値はどこかに保存されているのでしょうか? よろしくお願いします。

  • 変数iもjも同じく値を保持できるからどちらを使って

    このサンプルコードは、 変数iもjも同じく値を保持できるから、test1を使ってもtest2を使っても一緒なのでしょうか? Option Explicit Dim i As Integer Sub test1() Static j As Integer j = j + 1 Debug.Print j End Sub Sub test2() i = i + 1 Debug.Print i End Sub ご回答よろしくお願いします。

  • Debug.Writeで困っています(VB2008)

    お世話になります。 VB2008ExpressEditionの勉強を始めました。 本を読みながら進めているのですが、 Debug.Write "テスト" でイミディエイトウインドウに"テスト"と表示されるはずですが なにも表示されません。実際のテストコードは以下です。 Private Sub BUTTON1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUTTON1.Click  Debug.Write("テストWrite")  Debug.Write("")  Debug.Print("Printテスト")  MessageBox.Show("テスト") End Sub メッセージボックスは表示されますが、イミディウィトウインドウにはなにも表示されません。何か特別な設定が必要なのでしょうか? OSはVista HomePremium(64bit)です。 初歩的な質問で恥ずかしいのですがよろしくお願いいたします。

  • なぜrs.Move i ではダメなのでしょうか?

    access2003です。 テーブル1には、 フィールド1 あ い う え お が入っています。 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic For i = 0 To rs.RecordCount rs.Move i Debug.Print rs.Fields(0).Value Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub をすると、 あ い え とイミディエイトウインドウに表示されるのですが Debug.Print rs.Fields(0).Value の部分で 「実行時エラー'3021' BOFとEOFのいずれかTRUEになっていか、または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 となります。 その時のiの値は、3です。 rs.MoveFirst For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next にすると、 あ い う え お が取得されます。 なぜrs.Move i ではダメなのでしょうか? 理由を教えてください。

  • エクセルでセルの値がTRUEかFALSEか判定

    Q3:R19の表があります。 Q列にはTRUEかFALSEが入りますが、空白や文字列の場合もあります。 R列には文字列です。 Q列でFALSEのセルだけ、同じ行のとなりのR列の文字列を順に抜き出し、メッセージボックスに表示したいのです。 下記のようなVBAを書いてみましたが、Q列が空白や文字列の場合まで抽出されてしまいます。 これを排除するいい方法はないでしょうか? Sub test01()   Dim msg As String   Dim i As Long   With Sheets("LOG")     For i = 3 To 19       If .Range("Q" & i).Value = False Then '        Debug.Print  i & "-" & .Range("R" & i).Value         msg = msg & .Range("R" & i).Value & vbCrLf       End If     Next i   End With   If msg <> "" Then     MsgBox msg & vbCrLf & "上記により不可です。", vbCritical   End If End Sub

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • Variant型で宣言してるのにEmptyになる

    エクセルVBA2003について質問です。 Sub aaa1() Dim a As Variant Debug.Print TypeName(a) End Sub を実行してイミディエイトウインドウで確認すると Emptyが返ってきます。 Variantが返ってこない理由は何でしょうか? また、変数の方の宣言をしない場合は Variant型になるはずなのに Sub aaa2() Dim a Debug.Print TypeName(a) End Sub を実行すると、同じくEmptyが返ってきます。 Variantが返らない理由を教えてください。よろしくお願いします。

専門家に質問してみよう