VBAで文字列を改行したり、改行を操作する方法を解説します。
改行コードについて
文中の改行を文字列として表現する文字コード、
いわゆる「改行コード」には以下の3種類があります。
| 改行コード | VBA定数 | 文字コード |
|---|---|---|
| CRLF | vbCrLf | Chr(13) + Chr(10) |
| CR(キャリッジリターン) | vbCr | Chr(13) |
| LF(ラインフィード) | vbLf | Chr(10) |
基本的にどの改行コードを使っても割と動いてくれますが、
システムによってはしっかりと使い分けないと表示が崩れることがあります。
主な使い分けは
- WindowsはCRLFが標準
- MacはLFが標準
- ただしExcel(セルや図形内テキスト)の改行はLFが標準
- システムと入出力するCSVはそのシステムによる
こういった位置付けになっています。
目的に応じて使い分けてください。
また、改行コードは上記の他にvbNewLineという定数も存在し、
これはOSやプラットフォームによって上記3つのいずれかが出力されます。
あまり使う必要はありませんが、使われたコードを読むために覚えておきましょう。
セルやシェイプに出力する文字列を改行する
セルに出力する文字列を改行する場合は、
ラインフィード(vbLf)を使用します。
使用する場合は以下のコードのように、
改行したい文字列の間に&を使って改行コードを文字列結合すればOKです。
Range("A1") = "1行目" & vbLf & "2行目"
Excel上の改行はすべてこの改行コードに統一されているようで、
図形(シェイプ)やブラフの凡例などで改行してもvbLfが挿入されます。
Excel上であればどこで使用する文字列もvbLfにしておけばよいということですね。
ちなみにExcelの数式上ではChar(13)を改行として文字列結合しますが、
このChar(13)とvbLfは全く同じものです。
逆にVBA上で「Chr」関数を使って同じこともできますが、
定数でできるものを関数でやる意味はありませんので定数を使って下さい。
Range("A1") = "1行目" & Chr(13) & "2行目"
MsgBoxなどセル以外に表示する文字列
MsgBoxに出力する文字列を改行する場合は、
Windowsの標準改行コードである「CRLF」を使用します。
MsgBox "1行目" & vbCrLf & "2行目"
Windowsの標準以外のシステム(業務システムなど)で扱う改行は、
どの改行コードを使っているかを調べて使用してください。
誤った改行コードを使用した場合
使い分けといいましたが、誤った改行コードを使っても、
Excel上では意外とうまくいくことが多いです。
' すべて正常に(一度だけ)改行される Range("A1") = "1行目" & vbLf & "2行目" Range("A1") = "1行目" & vbCr & "2行目" Range("A1") = "1行目" & vbCrLf & "2行目"
MsgBoxやテキストボックスも同様にしっかり改行されます。
問題が起きるのは
- 改行コードが限定されたシステムと入出力するとき
- 改行を消すために改行コードを置換するとき
が多いですので、後者については以下を読み進めてください。
文字列内の改行を消去する
文字列内の改行を消去する場合は、
Replace関数またはReplaceメソッドで置換をします。
Range("A1") = Replace(Range("A1"), vbLf, "") ' または Range("A1").Replace vbLf, ""
問題はテキスト内の改行がどの改行で作られているかわからない点で、
別システムからコピーされたセルにはCRLFが入ってる可能性があります。
この時「LF」だけを消しても「CR」が残ってしまい、
先ほどの解説の通り3種類すべてちゃんと改行として動いてしまうため、
結果としてLFを消しても改行が残ってしまうことがあります。
よって、しっかりと改行を消したい場合は、
以下のようにCRとLFをどちらも削除する必要があります。
Range("A1").Replace vbCr, "" Range("A1").Replace vbLf, ""
ちなみにvbCrLfはCRとLFが単純に連続しているだけですので、
CRとLFを消せばCRLFを消す必要はありません。
改行を別の文字に置換する
改行できない表示箇所に改行入りの文字列を出力するために、
半角スペースに置き換えたいときがあります。
HTMLなどのWEBテキストにする際に、
<br>などに置き換えるときも同様ですね。
この時も改行コードを消したときと同様置換を行うことになりますが、
注意点として「まずCRLFを置換してからCRとLFを置換する」必要があります。
' 改行を半角スペースに置き換える Range("A1").Replace vbCrLf, " " Range("A1").Replace vbCr, " " Range("A1").Replace vbLf, " "
先ほどのように消すだけならCRとLFをそれぞれ置換すればいいのですが、
別文字に置き換える場合はCRLFが2改行分になってしまいます。
これを防ぐために、先にCRLFを置換して置くわけですね。
改行コードを別の文字列に置き換える場合は、
上記のように3行のコードを実行する必要がありますので覚えておいてください。
汎用関数化
この処理をよく書く方は汎用関数にしておくのもおすすめです。
' 改行文字の置き換え Function 文中改行を指定文字に置き換える(元テキスト As String, Optional 置換テキスト As String = " ") As String Dim 結果テキスト As String 結果テキスト = Replace(元テキスト, vbCrLf, 置換テキスト) 結果テキスト = Replace(結果テキスト, vbCr, 置換テキスト) 結果テキスト = Replace(結果テキスト, vbLf, 置換テキスト) 文中改行を指定文字に置き換える = 結果テキスト End Function ' 使用例 Range("A1") = 文中改行を指定文字に置き換える(Range("A1"), " ")
このくらいの関数であれば作るのは簡単ですし、
大量に実行する場合はすべての箇所で3行を1行にできるため効果が大きいです。
こういった「簡単だけど書くのが面倒なコード」は、
汎用関数にして持っておきましょう。
詳しくはこちらの記事をどうぞ
www.limecode.jp