やろまい

国立院卒の理系君。仕事でマクロ(VBA)の開発請負をやってます。金融と投資の事も。引用はご自由に。

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です。簡単な確認用のコードも書いてみました。

f:id:hamahiro881477:20201227071006p:plain

このように、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の違い

 

説明 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つのケースを確認してみました。

  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