このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【vbCrLfの注意点】String関数で繰り返してはいけない(VBA)

2024年4月16日

今回は、String関数でvbCrLF(改行)を繰り返すと何が起こるのかを紹介します。

  • String(回数, 文字)
  • String関数は文字を指定回数繰り返した文字列を返します。
  • ただし、文字が複数の場合は先頭の文字列のみを繰り返します。


今回説明するのは、String関数を次のように使う場合です。

String(回数, vbCrLf)

結論からいうと、この関数はvbCrLfを繰り返した文字列を返しません。
この使い方はやめましょう。 

そもそもvbCrLfとはどのようなものか、vbCrLfをString関数で繰り返すと何が起こるのかを説明します。

VBAが難しいと感じたら
VBAのプロに代わりに作ってもらうのはいかがでしょうか?
ココナラでVBAの作成請負を受け付けています。お気軽にご相談ください。

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のプロに代わりに作ってもらうのはいかがでしょうか?
ココナラでVBAの作成請負を受け付けています。お気軽にご相談ください。

VBA

Posted by やろまい