t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA Debug.Printで改行しない方法

昨日、VBAHaskellのコードを読んではじめて知ったのだが、Debug.Printで改行させずに表示させる方法があるようだ。

※VBAHaskellについては過去記事を参照
thom.hateblo.jp

以下は、VBAHaskellのHaskell_3_printMモジュールからprintVプロシージャの一部を引用したもの。

    For i = SR To ER - 1 Step 1
        If IsError(v(i)) = True Then
            Debug.Print "  Error!";
        ElseIf IsArray(v(i)) = True Then
            Debug.Print "  [" & i & "]";
        ElseIf IsEmpty(v(i)) = True Then
            Debug.Print "  ";
        ElseIf IsNull(v(i)) = True Then
            Debug.Print "  ";
        Else
            Debug.Print Space(2); Trim(v(i));
        End If
    Next i

Debug.Printがセミコロンで終わっている。

セミコロンを使えば、以下のように、連結できることは知っていた。

Debug.Print "a";"b";"c"

しかしセミコロンで終わる表記ははじめて見た。
試してみたところ、以下のコードでは上記のDebug.Printと同じように改行されずにabcと表示される。

Debug.Print "a";
Debug.Print "b";
Debug.Print "c"

また、以下のように単一プロシージャを作ってF5で実行を繰り返しても、改行されずに横にaが伸びていく。

Sub SemiColonTest()
    Debug.Print "a";
End Sub

実に面白い。

これを使ってFizzBuzzを書いてみた。

Sub FizzBuzz()
    Debug.Print vbNullString
    For i = 1 To 100
        If i Mod 15 = 0 Then
            Debug.Print "FizzBuzz "
        ElseIf i Mod 3 = 0 Then
            Debug.Print "Fizz ";
        ElseIf i Mod 5 = 0 Then
            Debug.Print "Buzz ";
        Else
            Debug.Print Format(i, "00") & " ";
        End If
    Next
    Debug.Print vbNullString
End Sub

全体をDebug.Print vbNullStringで挟んでいるのは、前回セミコロンで終わっているとその続きから出力されてしまうためだ。

"FizzBuzz "で改行されるように敢えてセミコロンを外している。


結果はこうなった。

01 02 Fizz 04 Buzz Fizz 07 08 Fizz Buzz 11 Fizz 13 14 FizzBuzz 
16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 
31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 
46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 
61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 
76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 
91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz 

イミディエイトウインドウは通常200行程度しか表示させられないが、このテクニックを使えば1000までのFizzBuzzでも問題なく表示させることができた。素晴らしい。

あ、ひょっとしてカンマでも使える?
Debug.Printでカンマ連結すると、タブが入る。

Debug.Print "a", "b", "c"

上記の結果はこうなる。

a     b    c

実際にやってみた。

Debug.Print "a",
Debug.Print "b",
Debug.Print "c"

やっぱり同じ結果になった。すばらしい。

自信のレベルアップを図るには、やはり人の書いたコードを読むのが一番だ。
色々と気づきを得られる。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。