InStr関数で文字列内を検索
文字列の中に検索した文字列があるか探すには、InStr関数を利用します。
InStr関数で検索文字列があった場合は、文字列のどこで見つかったのかを返します。見つかった場合は必ず1以上になります。
改行コードの場合も同様です。
ただし、改行コードには3種類あるため判定には注意が必要です。
3種類の改行コード
改行コードにはCR、LF、CRLFの3種類があります。
文字コードではCRは0x0D(13)、LFは0x0A(10)で、いずれも1バイトです。
CRLFはCRとLFをつなげた2バイトです。たまに聞かれるのですがLFCRという改行コードはありません。
VBAでは改行コード用の定数が定義されており、vbCr、vbLf、vbCrLf、vbNewLineの4つがあります。
vbNewLineは実行するOSに合わせて設定値が変わる定数で、Windowsの場合はvbCrLfと同じで、MaxOSXの場合はvbCrと同じになります。
改行コードの判定
以下のコードは文字列中に各改行コードが含まれるかを判定する例です。
21行目と26行目の判定では同じCRLFを含む文字列を検索していますが、21行目のCRLFを検索した場合と26行目のCRとLFをそれぞれ検索した場合ではどちらも「含まれる」と判定されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub CRLFTest() Dim sCR As String Dim sLF As String Dim sCRLF As String sCR = "abc" & vbCr sLF = "abc" & vbLf sCRLF = "abc" & vbCrLf '// CRが含まれるかチェック If InStr(sCR, vbCr) > 0 Then Debug.Print "CRあり" End If '// LFが含まれるかチェック If InStr(sLF, vbLf) > 0 Then Debug.Print "LFあり" End If '// CRLFが含まれるかチェック If InStr(sCRLF, vbCrLf) > 0 Then Debug.Print "CRLFあり" End If '// CRとLFが含まれるかチェック If InStr(sCRLF, vbCr) > 0 And InStr(sCRLF, vbLf) > 0 Then Debug.Print "CRとLFあり" End If End Sub |
実行結果
CRあり
LFあり
CRLFあり
CRとLFあり
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が埋められていることを見つけられません。
そのあたりを注意して改行コードのチェックを行うようにしましょう。