InStr関数で文字列内を検索
文字列内に改行コードが含まれているかを判定するには、InStr関数を使用します。ただし、改行コードには複数の種類があるため、適切な判定方法を理解しておく必要があります。
InStr関数による改行コードの検索
InStr関数は文字列内に指定した文字列が含まれるかを検索し、見つかった位置を返します。見つからない場合は0、見つかった場合は1以上の値を返すため、改行コードの有無を判定できます。
|
1 2 3 |
If InStr(myString, vbLf) > 0 Then Debug.Print "改行コードあり" End If |
3種類の改行コード
改行コードにはCR、LF、CRLFの3種類があります。
- CR(Carriage Return):文字コード
0x0D(10進:13)。 VBA 定数vbCr。古いMacで使用 - LF(LineFeed):文字コード
0x0A(10進:10)。VBA 定数vbLf。Unix/Linux、Excelセル内の改行 - CRLF:CR と LF の組み合わせ。Windows の標準。VBA 定数
vbCrLf vbNewLine:実行環境に依存(Windows ならvbCrLf、macOS ならvbCr)
文字コードではCRは0x0D(13)、LFは0x0A(10)で、いずれも1バイトです。
CRLFはCRとLFをつなげた2バイトです。LF + CRを繋げたLFCRという改行コードはありません。
VBAでは改行コード用の定数が定義されており、vbCr、vbLf、vbCrLf、vbNewLineの4つがあります。
vbNewLineは実行するOSに合わせて設定値が変わる定数で、Windowsの場合はvbCrLfと同じで、MaxOSXの場合はvbCrと同じになります。
改行コードの判定
改行コードを確実に判定するには、CR、LF、CRLFのすべてをチェックする必要があります。以下は実用的な判定関数の例です。
改行コードの有無を判定する関数
引数文字列に改行コードが含まれているかを判定します。改行コードがあればTrue、なければFalseを返します。
|
1 2 3 4 |
'// 改行コードの有無を判定する関数 Function HasLineBreak(ByVal text As String) As Boolean HasLineBreak = (InStr(text, vbCr) > 0) Or (InStr(text, vbLf) > 0) End Function |
改行コードの種類を判定する関数
引数文字列に改行コードが含まれている場合、その改行コードの種類を文字列で返します。(”CRLF”、”CR”、”LF”、”なし”のいずれかを返す)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'// 改行コードの種類を判定する関数 Function GetLineBreakType(ByVal text As String) As String Dim hasCR As Boolean Dim hasLF As Boolean hasCR = (InStr(text, vbCr) > 0) hasLF = (InStr(text, vbLf) > 0) If hasCR And hasLF Then GetLineBreakType = "CRLF" ElseIf hasCR Then GetLineBreakType = "CR" ElseIf hasLF Then GetLineBreakType = "LF" Else GetLineBreakType = "なし" End If End Function |
使用例
上の「改行コードの有無の判定する関数(HasLineBreak)」と「改行コードの種類を判定する関数(GetLineBreakType)」の使用例です。
文字列変数のtestStrにvbCrLfを含めた状態で、改行コードの有無判定と、改行コードがあった場合に改行コードの種類を出力しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub TestLineBreak() Dim testStr As String testStr = "あいうえお" & vbCrLf & "かきくけこ" '// 改行コードがある場合 If HasLineBreak(testStr) Then '// 改行コードの種類を出力 Debug.Print "改行コードあり: " & GetLineBreakType(testStr) Else Debug.Print "改行コードなし" End If End Sub |
実行結果
改行コードあり: CRLF
LFだけのチェックは危険
改行コードのチェック処理でLFが含まれるかで判定するサイトがありますが、私はおすすめしません。CRの判定も含める方がよいでしょう。
LFだけの判定にしている理由はセルの文字列を判定することを前提としていると思われますが、これには問題があります。
確かにセル内でAlt+Enterキーで改行した場合の改行コードはLFですが、手入力ではなくVBAの処理でセルの値にCRを設定することは可能です。
以下のコードはセルにCRとLFの両方を設定しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub CellCRLFTest() Dim s Dim i ActiveCell.Value = "a" & vbLf & "b" & vbCr s = ActiveCell.Value For i = 1 To Len(s) Debug.Print Asc(Mid(s, i, 1)) Next End Sub |
実行結果
97
10
98
13
このような場合にはLFだけでは当然判定できませんし、また、LFだけのチェックではCRが埋められていることを見つけられません。
データの不整合や予期しない動作の原因となるため、CRとLFの両方をチェックすることを強く推奨します。
まとめ
改行コードを確実に判定するには:
- CRとLFの両方をチェックする。
- 用途に応じて判定関数を作成する。
- LF単独判定は避ける。
特にセルデータを扱う場合や外部ファイルから読み込んだデータを処理する場合は、すべての改行コード種類に対応した判定を行いましょう。