VBAでセルの文字数をチェックするには、Len関数を使います。指定した文字数以上のセルに背景色をつけるだけなら数行で書けます。入力後に自動チェックしたい場合は、Worksheet_Changeイベントと組み合わせると、セルを編集した瞬間にリアルタイムで判定できます。
この記事では、次の内容を順番に解説します。
- Len関数で文字数を取得する基本
- 範囲内の全セルを一括チェックするマクロ
- 入力のたびに自動チェックするイベントの書き方
- 複数列・複数条件に対応する応用パターン
- よくある質問(空白セルの扱い・全角半角の違い等)
Len関数で文字数を取得するには?
Len関数はセルの値の文字数を整数で返します。全角・半角を区別せず、どちらも1文字として数えます。
MsgBox Len(Cells(2, 1).Value) ' A2の文字数を表示
全角と半角を区別して数えたい場合は LenB と StrConv を組み合わせます。
' 全角=2バイト、半角=1バイトで数える
Dim byteLen As Long
byteLen = LenB(StrConv(Cells(2, 1).Value, vbFromUnicode))
MsgBox byteLen
通常の文字数チェックには Len で十分です。バイト数での管理が必要な場合(データベース登録の上限チェックなど)は LenB を使いましょう。
範囲内の全セルを一括チェックするには?
ボタンを押したタイミングで全セルをチェックしたい場合は、Forループで対象範囲を回します。
Sub CheckTextLength()
Dim i As Long
Dim lastRow As Long
Dim maxLen As Long
maxLen = 20 ' 何文字以上を警告するか
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If Len(Cells(i, 1).Value) >= maxLen Then
Cells(i, 1).Interior.Color = RGB(255, 255, 0) ' 黄色
Else
Cells(i, 1).Interior.ColorIndex = xlNone ' 背景をクリア
End If
Next i
MsgBox "チェック完了しました。"
End Sub
このコードのポイントは次の通りです。
maxLenを変数にしているので、文字数の基準を1か所だけ変えれば全体に反映されるlastRowで最終行を自動取得するので、行数が変わっても修正不要- 条件を満たさないセルの背景も
xlNoneでクリアするため、再実行しても正しい状態になる
入力のたびに自動チェックするには?
セルに入力した瞬間にチェックを走らせたい場合は、Worksheet_Changeイベントを使います。このコードはシートのコードモジュール(シートタブを右クリック→「コードの表示」)に書きます。
Private Sub Worksheet_Change(ByVal Target As Range)
' 対象範囲外の変更は無視
If Intersect(Target, Range("A2:A100")) Is Nothing Then Exit Sub
' 複数セルが同時に変更された場合も対応
Dim cell As Range
For Each cell In Intersect(Target, Range("A2:A100"))
If Len(cell.Value) >= 20 Then
cell.Interior.Color = RGB(255, 255, 0)
Else
cell.Interior.ColorIndex = xlNone
End If
Next cell
End Sub
Intersectで対象範囲外の変更を弾いているため、他のセルを編集しても無駄に処理が走りません。また、コピー&ペーストで複数セルが一度に変更された場合も For Each で正しく対応できます。
複数列・複数条件に対応するには?
列ごとに文字数の基準を変えたい場合は、列番号で条件を分岐させます。
Sub CheckMultiColumn()
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
' A列:20文字以上で黄色
If Len(Cells(i, 1).Value) >= 20 Then
Cells(i, 1).Interior.Color = RGB(255, 255, 0)
Else
Cells(i, 1).Interior.ColorIndex = xlNone
End If
' B列:10文字以上でオレンジ
If Len(Cells(i, 2).Value) >= 10 Then
Cells(i, 2).Interior.Color = RGB(255, 180, 0)
Else
Cells(i, 2).Interior.ColorIndex = xlNone
End If
Next i
MsgBox "チェック完了しました。"
End Sub
このように列ごとに閾値を変えることで、列の性質に合ったチェックが可能になります。
まとめ
- 文字数の取得には
Len(セル.Value)を使う - 背景色の変更には
Interior.Color = RGB(...)、クリアにはInterior.ColorIndex = xlNone - ボタン実行なら
Forループ、入力時に自動実行ならWorksheet_Changeイベント - 基準文字数を変数にしておくと、修正箇所が1か所で済む
- 複数列に対応する場合は列番号で条件を分岐する
よくある質問
空白セルもLen関数でチェックできる?
できます。空白セルの場合、Len(Cells(i,1).Value) は 0 を返すので、条件に引っかからずそのままスルーされます。空白セルを別扱いしたい場合は If Cells(i,1).Value = "" Then で事前に判定してください。
全角と半角を区別して文字数を数えるには?
全角を2、半角を1として数えたい場合は LenB(StrConv(文字列, vbFromUnicode)) を使います。通常の Len は全角・半角を区別せずどちらも1文字として数えます。
Worksheet_Changeイベントが無限ループになる場合は?
イベント内でセルの値を変更すると、その変更がまた「Changeイベント」を呼び出し、それがまた変更を起こし…という無限ループになることがあります。今回のコードは背景色を変えるだけなので通常は問題ありませんが、値を書き換える処理が入っている場合は Application.EnableEvents = False で一時的にイベントを無効化してから処理し、最後に True に戻してください。
条件付き書式ではなくVBAを使うメリットは?
条件付き書式はルール数が増えると管理が煩雑になり、ファイルを重くする原因にもなります。VBAを使えば複雑な条件でも柔軟に対応でき、複数列・複数条件を1つのマクロでまとめて制御できます。特に繰り返し実行するバッチ処理や、動的に変わる条件に対してはVBAの方が向いています。
文字数が少なすぎるセルも色で警告したい場合は?
条件を追加するだけで対応できます。たとえば「5文字未満は赤、20文字以上は黄色」のように複数の閾値を設定する場合は ElseIf を使って条件を分岐させてください。
If Len(Cells(i, 1).Value) >= 20 Then
Cells(i, 1).Interior.Color = RGB(255, 255, 0) ' 黄色(長すぎ)
ElseIf Len(Cells(i, 1).Value) < 5 And Cells(i, 1).Value <> "" Then
Cells(i, 1).Interior.Color = RGB(255, 100, 100) ' 赤(短すぎ)
Else
Cells(i, 1).Interior.ColorIndex = xlNone
End If
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



