String関数でvbCrLf(改行)を繰り返してはいけない(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を繰り返すとどうなるか見てみましょう。確認用のコードを紹介します。

f:id:hamahiro881477:20201227071313p:plain

String関数の返り値にvbCrとvbLfが含まれるかを、2つのIf文で判定しています。

イミディエイトウィンドウで結果を確認すると、vbCrは含まれますがvbLfは含まれないことが分かります。

つまり、String関数はvbCrLfの先頭の文字であるvbCrのみを繰り返しています。

vbCrLfを繰り返すという意図した動作となっていないので、この使い方はやめておきましょう。

vbCrとvbLfの違い

説明vbCrLfvbCrvbLf
概要ラインフィード + キャリッジリターンキャリッジリターン
(カーソルを先頭に)
ラインフィード
(次の行へ)
文字コード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つのケースを確認してみました。

  1. MsgBox:改行される
  2. セル内改行:改行されない

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

他の「VBA」の記事はこちらからどうぞ

VBA

Posted by やろまい