VBAでセルの表示形式を自動変更するには、NumberFormat プロパティと条件分岐を組み合わせるだけで実現できます。数値・日付・パーセントなどの書式統一から、マイナス値の赤字化まで、入力内容に応じて自動で見た目を整える仕組みを作れます。
この記事では、次の内容を順番に解説します。
- NumberFormatの基本とよく使う書式文字列
- 値の種類(数値・日付・文字列)に応じて書式を切り替える方法
- 条件によって色・太字・斜体を変える方法
- 入力と同時に書式が変わる自動化パターン
NumberFormatで表示形式を変えるには?
NumberFormat プロパティにExcelの書式文字列を代入すると、セルの表示形式を変更できます。Excelの「セルの書式設定」ダイアログで確認できる書式コードをそのまま使えます。
| 目的 | NumberFormatの値 | 表示例 |
|---|---|---|
| カンマ区切り(整数) | "#,##0" | 1,234,567 |
| カンマ区切り(小数2桁) | "#,##0.00" | 1,234,567.89 |
| パーセント表示 | "0.0%" | 12.3% |
| 日付(スラッシュ区切り) | "yyyy/mm/dd" | 2026/04/16 |
| 日付(日本語表示) | "yyyy年m月d日" | 2026年4月16日 |
| 円マーク付き | "¥#,##0" | ¥1,234,567 |
| 標準(書式なし) | "General" | 入力値そのまま |
値の種類に応じて書式を自動で切り替えるには?
セルの値が日付・数値・文字列のどれかを IsDate・IsNumeric で判定し、それぞれに適した書式を設定します。
Sub FormatByValueType()
Dim ws As Worksheet
Dim i As Long
Dim val As Variant
Set ws = ActiveSheet
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
val = ws.Cells(i, 1).Value
If IsDate(val) Then
'日付ならyyyy/mm/dd形式に
ws.Cells(i, 1).NumberFormat = "yyyy/mm/dd"
ElseIf IsNumeric(val) Then
'数値ならカンマ区切りに
ws.Cells(i, 1).NumberFormat = "#,##0"
Else
'文字列や空欄は標準に戻す
ws.Cells(i, 1).NumberFormat = "General"
End If
Next i
MsgBox "表示形式を自動で変更しました。"
End Sub
条件に応じてフォント色や書式を変えるには?
数値のプラス・マイナスや特定のしきい値を超えたかどうかに応じて、フォント色・太字・背景色を変えることができます。
マイナス値を赤字にする例:
Sub FormatBySign()
Dim ws As Worksheet
Dim i As Long
Dim v As Variant
Set ws = ActiveSheet
For i = 2 To ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
v = ws.Cells(i, 2).Value
If Not IsNumeric(v) Then GoTo NextRow
With ws.Cells(i, 2)
.NumberFormat = "#,##0"
If CDbl(v) < 0 Then
.Font.Color = RGB(255, 0, 0) '赤
.Font.Bold = True
Else
.Font.Color = RGB(0, 0, 0) '黒
.Font.Bold = False
End If
End With
NextRow:
Next i
MsgBox "書式の変更が完了しました。"
End Sub
フォント色・背景色・太字・斜体などを変えるプロパティは次のとおりです。
| プロパティ | 内容 | 例 |
|---|---|---|
Font.Color | 文字色(RGB値) | RGB(255, 0, 0) → 赤 |
Font.Bold | 太字(True/False) | True で太字 |
Font.Italic | 斜体(True/False) | True で斜体 |
Interior.Color | セルの背景色(RGB値) | RGB(255, 255, 0) → 黄色 |
Interior.ColorIndex | 背景色(カラーインデックス番号) | xlNone で塗りつぶしなし |
入力と同時に書式を変えるには?
Worksheet_Change イベントと組み合わせると、セルに値を入力した瞬間に書式が自動で変わります。シートモジュールに記述します。
'シートモジュール(Sheet1など)に記述する
Private Sub Worksheet_Change(ByVal Target As Range)
'B列への入力だけを対象にする
If Not Intersect(Target, Range("B:B")) Is Nothing Then
Application.EnableEvents = False
Dim v As Variant
v = Target.Value
If IsNumeric(v) And v <> "" Then
With Target
.NumberFormat = "#,##0"
If CDbl(v) < 0 Then
.Font.Color = RGB(255, 0, 0)
Else
.Font.Color = RGB(0, 0, 0)
End If
End With
End If
Application.EnableEvents = True
End If
End Sub
まとめ
NumberFormatプロパティに書式文字列を代入するだけで表示形式を変更できるIsDate・IsNumericで値の種類を判定し、ElseIfで書式を切り替えるのが基本パターンFont.Color・Font.Bold・Interior.Colorで文字色・太字・背景色を条件に応じて変えられるWorksheet_Changeと組み合わせると、入力した瞬間に書式が自動で変わる仕組みになる- 書式変更マクロを使いたい範囲だけに絞ることで、不要な処理を省いてパフォーマンスを維持できる
よくある質問
NumberFormatの書式文字列はどこで調べればいいですか?
Excelの「セルの書式設定」ダイアログ(Ctrl+1)→「表示形式」タブ→「ユーザー定義」に表示されている書式コードをそのまま NumberFormat に使えます。目的の見た目を手動で設定してから確認すると、そのコードをVBAに転用できます。
書式を変えても値が変わってしまいます
NumberFormat は表示形式のみを変更し、セルの値そのものは変えません。ただし日付の場合、内部ではシリアル値(数値)として保存されているため、NumberFormat を変えると見え方が変わります。値を変えたい場合は .Value プロパティを使います。
条件付き書式(ホームタブ)との違いは何ですか?
Excelの条件付き書式は設定が画面で視覚的に確認でき、ルールの追加・変更も容易です。VBAの書式変更は、より複雑な条件や動的なデータに応じた柔軟な制御が必要な場合に向いています。シンプルな色分けなら条件付き書式で十分な場合が多く、複雑なロジックが必要なときにVBAを使うという使い分けがおすすめです。
背景色を元に戻すにはどう書きますか?
Interior.ColorIndex = xlNone または Interior.Color = xlNone で塗りつぶしなしに戻せます。Interior.ColorIndex = 0 は黒になるので注意してください。
複数のセル範囲にまとめて書式を適用するには?
Range("B2:B100").NumberFormat = "#,##0" のように範囲指定で一括適用できます。ループを使わなくても範囲全体に同じ書式を設定できるため、同じ書式を適用したい場合は範囲指定の方が効率的です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



