- ベストアンサー
「Debug.Print i = i + 1」がFalseになる。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Printステートメントの outputlist並びの=が、代入式ではなく比較式と評価、実行されるためでしょうね。 演算子は式のリストに含められ、算術演算子、比較演算子、論理演算子等色々ありますが、代入記号はリスト項目にはありませんので、エラーとならないのは演算子とみなしているからですね。 Print i = i + 1 の結果は、0と1の比較なのでFalse Print i = i とすると、0と0の比較なのでTrue Print i, i + 1の場合は、変数と数式なので 0と1 という結果になるはずです。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17068)
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の変数の型によってエラーになるので、エラーになる場合が多いかも。
お礼
どうもありがとうございました。
- tomo00223
- ベストアンサー率34% (12/35)
Debug.Printの中に等式があります。これが問題なのでは? Debug.Print i + 1 なら動作するのではないでしょうか? もしくは、iの値に+1したものを保持したければ、 i = i + 1 Debug.Print i でも良いと思います。
お礼
等式にするとこうなるのですか。参考になりました。
関連する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)です。 初歩的な質問で恥ずかしいのですがよろしくお願いいたします。
- ベストアンサー
- Visual Basic
- なぜ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 ではダメなのでしょうか? 理由を教えてください。
- ベストアンサー
- Visual Basic
- エクセルでセルの値が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
- ベストアンサー
- Excel(エクセル)
- プロシージャーの外で宣言した変数の値の破棄の仕
プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ 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 ++++++++++++++++++ としたら、エラーになりました。
- ベストアンサー
- Visual Basic
- 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が返らない理由を教えてください。よろしくお願いします。
- ベストアンサー
- Visual Basic
お礼
すごくわかりやすいです。どうもありがとうございました。