InStr関数で文字列内を検索

文字列内に改行コードが含まれているかを判定するには、InStr関数を使用します。ただし、改行コードには複数の種類があるため、適切な判定方法を理解しておく必要があります。

InStr関数による改行コードの検索

InStr関数は文字列内に指定した文字列が含まれるかを検索し、見つかった位置を返します。見つからない場合は0、見つかった場合は1以上の値を返すため、改行コードの有無を判定できます。

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と同じになります。

改行コードの判定

改行コードを確実に判定するには、CRLFCRLFのすべてをチェックする必要があります。以下は実用的な判定関数の例です。

改行コードの有無を判定する関数

引数文字列に改行コードが含まれているかを判定します。改行コードがあればTrue、なければFalseを返します。

改行コードの種類を判定する関数

引数文字列に改行コードが含まれている場合、その改行コードの種類を文字列で返します。(”CRLF”、”CR”、”LF”、”なし”のいずれかを返す)

使用例

上の「改行コードの有無の判定する関数(HasLineBreak)」と「改行コードの種類を判定する関数(GetLineBreakType)」の使用例です。

文字列変数のtestStrにvbCrLfを含めた状態で、改行コードの有無判定と、改行コードがあった場合に改行コードの種類を出力しています。

実行結果
改行コードあり: CRLF

LFだけのチェックは危険

改行コードのチェック処理でLFが含まれるかで判定するサイトがありますが、私はおすすめしません。CRの判定も含める方がよいでしょう。

LFだけの判定にしている理由はセルの文字列を判定することを前提としていると思われますが、これには問題があります。

確かにセル内でAlt+Enterキーで改行した場合の改行コードはLFですが、手入力ではなくVBAの処理でセルの値にCRを設定することは可能です。

以下のコードはセルにCRとLFの両方を設定しています。

実行結果
97
10
98
13

このような場合にはLFだけでは当然判定できませんし、また、LFだけのチェックではCRが埋められていることを見つけられません。

データの不整合や予期しない動作の原因となるため、CRとLFの両方をチェックすることを強く推奨します。

まとめ

改行コードを確実に判定するには:

  1. CRとLFの両方をチェックする。
  2. 用途に応じて判定関数を作成する。
  3. LF単独判定は避ける。

特にセルデータを扱う場合や外部ファイルから読み込んだデータを処理する場合は、すべての改行コード種類に対応した判定を行いましょう。