昨日、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"
やっぱり同じ結果になった。すばらしい。
自信のレベルアップを図るには、やはり人の書いたコードを読むのが一番だ。
色々と気づきを得られる。