【vbCrLfの注意点】String関数で繰り返してはいけない(VBA)
今回は、String関数でvbCrLF(改行)を繰り返すと何が起こるのかを紹介します。
- String(回数, 文字)
- String関数は文字を指定回数繰り返した文字列を返します。
- ただし、文字が複数の場合は先頭の文字列のみを繰り返します。
今回説明するのは、String関数を次のように使う場合です。
String(回数, vbCrLf)
結論からいうと、この関数はvbCrLfを繰り返した文字列を返しません。
この使い方はやめましょう。
そもそもvbCrLfとはどのようなものか、vbCrLfをString関数で繰り返すと何が起こるのかを説明します。
vbCrLfはどのようなものか?
vbCrLfは改行を行うための定数です。
MsgBox “1行目" & vbCrLf & “2行目"
このように書くと1行目と2行目の間で改行されたメッセージが表示されます。
普段は改行に使うものとしか意識しないのですが、このvbCrLfは2つの定数を組み合わせたものです。
それはvbCrとvbLfです。簡単な確認用のコードも書いてみました。
このように、vbCrLfはvbCrとvbLfという2つの定数を繋げたものです。
この2つの定数の役割については後述します。
String関数でvbCrLfを繰り返すとどうなるか?
String関数は、文字が複数の場合は先頭の文字列のみを繰り返します。
ではvbCrLfを繰り返すとどうなるか見てみましょう。確認用のコードを紹介します。
String関数の返り値にvbCrとvbLfが含まれるかを、2つのIf文で判定しています。
イミディエイトウィンドウで結果を確認すると、vbCrは含まれますがvbLfは含まれないことが分かります。
つまり、String関数はvbCrLfの先頭の文字であるvbCrのみを繰り返しています。
vbCrLfを繰り返すという意図した動作となっていないので、この使い方はやめておきましょう。
vbCrとvbLfの違い
説明 | vbCrLf | vbCr | vbLf |
概要 | ラインフィード + キャリッジリターン | キャリッジリターン (カーソルを先頭に) | ラインフィード (次の行へ) |
文字コード | chr(13)+chr(10) | chr(13) | chr(10) |
改行コード | Windows で一般的な改行コード | MacOS で一般的な改行コード | Linux では一般的な改行コード |
例: | Windows のメモ帳で改行を入力した場合。 | – | ・Excel のセル内での改行。 ・Linuxのテキストエディタでの改行。 |
参考:vbCrLf、vbLf、vbCr、vbNewLineの違いに関して | VBA
MacOSではvbCr、LinuxではvbLf、Windowsでは両方を合わせたvbCrLfで改行をします。
このような違いから、WindowsでMsgBoxを使う場合はvbCrLfを使って文字列を改行します。
ちなみに、vbCrのみだとどうなるか2つのケースを確認してみました。
- MsgBox:改行される
- セル内改行:改行されない
MsgBoxでは一応改行されるようですが、他のWindowsアプリケーションなどを使う場合は想定外の動作をする可能性があります。
余計なデバッグをしないためにも、vbCrLfを使用しましょう。
vbCrLfを複数回改行したいなら自作関数を
さて、ここまでvbCrLfはString関数で繰り返すことができないことを説明してきました。(vbCr、vbLfの繰り返しならばString関数で問題ありません)
とはいえ、vbCrLFを何回も文字列として結合するのは手間ですし、可読性もメンテナンスにも不向きです。
次のような簡単な自作関数を作ってはいかがでしょうか。
Function fncCrLf(ByVal repeatNum As Long) As String: fncCrLf = ""
Dim count As Long
For count = 1 To repeatNum
fncCrLf = fncCrLf & vbCrLf
Next
End Function