Excel VBAでは、セルへ値を書き込くだけでなく、数値の表示形式やフォント、背景色などの書式も自由に変更できます。
たとえば、売上データを通貨表示にしたり、見出し行だけ背景色を付けたり、条件に応じて文字色を変更したりといった処理を自動化できます。
手作業で書式を整えていると、データ量が増えるほど時間がかかり、設定漏れも発生しやすくなります。
VBAで書式設定まで自動化すれば、誰が実行しても同じ見た目を維持できるため、実務では非常に利用頻度の高い処理の一つです。
この記事では、数値形式・フォント・背景色の基本から、一括設定や条件付きで書式を変更する方法まで、実務で使いやすいコードを交えながら解説します。
✅ VBAでセルの書式設定を変更する基本
Excel VBAでは、セルの表示内容と書式は別々に管理されています。
そのため、セルへ値を書き込んだあとに書式を設定することで、同じデータでも見やすい表へ整えることができます。
代表的な書式設定には、次のようなものがあります。
- 数値形式
- フォント
- フォントサイズ
- 太字
- 文字色
- 背景色
- 配置
- 罫線
これらはそれぞれ専用のプロパティを持っており、必要なものだけ変更できます。
書式だけを変更する場合はセルの値には影響しないため、既存データを安全に装飾できます。
VBAでは、セルの見た目だけでなく、文字列・日付・数値の表示形式を用途に合わせて整えることも重要です。データ種類ごとの書式設定について詳しく知りたい方は、【VBA】書式設定をする方法|文字列・日付・数値を整える実務設計も参考にしてください。
数値形式はNumberFormatプロパティで設定する
数値の表示形式は、NumberFormatプロパティで変更します。
例えば、売上金額を3桁区切りで表示する場合は次のように記述します。
Worksheets("売上").Range("B2:B100").NumberFormat = "#,##0"
主な書式には次のようなものがあります。
| 表示形式 | 設定内容 |
|---|---|
| #,##0 | 3桁区切り |
| ¥#,##0 | 通貨 |
| 0.00 | 小数点2桁 |
| 0% | パーセント |
| yyyy/mm/dd | 日付 |
セルの値そのものは変更せず、表示だけを変えられる点が特徴です。
NumberFormatやFont、Interiorは、セルの状態を取得・変更するためのプロパティです。プロパティとメソッドの違いを整理したい方は、【VBA】プロパティとメソッド一覧|違い・使い方・実務で覚える操作まとめも参考にしてください。
Fontプロパティで文字の見た目を変更する
文字の装飾はFontプロパティから設定します。
例えば見出しを太字にする場合です。
Worksheets("売上").Range("A1:E1").Font.Bold = True
フォントサイズを変更する場合は
Worksheets("売上").Range("A1:E1").Font.Size = 12
フォント名を変更する場合は
Worksheets("売上").Range("A1:E1").Font.Name = "Meiryo UI"
のように指定します。
Fontプロパティには
- 太字
- 斜体
- 下線
- フォント名
- サイズ
- 色
などがまとめられています。
背景色はInterior.Colorで設定する
セルの背景色はInteriorオブジェクトを利用します。
例えば黄色にする場合です。
Worksheets("売上").Range("A1:E1").Interior.Color = RGB(255, 255, 0)
RGBを使うことで好きな色を指定できます。
例えば
RGB(255,0,0)
は赤、
RGB(0,176,80)
は緑になります。
ColorIndexでも設定できますが、テーマカラーによって変わる場合があるため、実務ではRGBを利用する方が管理しやすくなります。
背景色には、RGBによる指定だけでなく、ColorIndexやテーマカラーを使う方法もあります。色の指定方法や背景色の一覧を確認したい方は、【VBA】背景色の一覧と設定方法:Interiorオブジェクトの使用方法をご覧ください。
✅ 実務では書式設定をまとめて行う設計がおすすめ
VBA初心者の頃は、
Range("A1").Font.Bold=True
Range("A2").Font.Bold=True
Range("A3").Font.Bold=True
のように1セルずつ設定してしまうことがあります。
もちろん動作しますが、この書き方では修正箇所が増え、保守もしにくくなります。
実務では対象範囲をまとめて取得し、一括で書式を設定できる構成にする方が、後から変更しやすくなります。
また、対象範囲を変えるだけで別の帳票にも流用できるため、再利用性も高くなります。
書式を一括設定するには、対象範囲を正しく指定することが重要です。Range・Cells・Rows・Columnsの違いや使い分けは、【VBA】Range・Cells・Rows・Columnsの指定方法を徹底解説【基本と使い分け】で詳しく解説しています。
範囲全体へ書式をまとめて設定するコード
次のコードは、売上表全体へ実務でよく利用する書式を一括設定する例です。
Sub FormatSalesTable()
Dim targetRange As Range
' 書式を設定する範囲
Set targetRange = Worksheets("売上").Range("A1:E100")
With targetRange
' フォント設定
.Font.Name = "Meiryo UI"
.Font.Size = 10
' 数値形式
.Columns(2).NumberFormat = "#,##0"
' 背景色
.Rows(1).Interior.Color = RGB(217, 225, 242)
End With
End Sub
なぜこの書き方が実務で使いやすいのか
このコードでは、最初に対象範囲をtargetRangeへまとめています。
そのため、帳票が変更になっても
Set targetRange = ...
だけ変更すれば済みます。
また、Withを利用しているため
targetRange.Font
targetRange.Rows
targetRange.Columns
を何度も書く必要がなく、コード全体も読みやすくなります。
セルを1つずつ指定する方法と比べて、
- 修正箇所が少ない
- 保守しやすい
- 処理対象が分かりやすい
というメリットがあります。
実務では帳票の列数や行数が変わることも珍しくないため、「対象範囲をまとめて扱う」という設計を意識すると、後から流用しやすいコードになります。
Font・Interior・Borders・NumberFormatなどの書式設定は、いずれもRangeオブジェクトを通じて操作します。Rangeオブジェクトで利用できる主要なプロパティは、【VBA】Rangeオブジェクトの主要プロパティを徹底解説|セル操作の基本をマスターしようでまとめています。
✅ 条件に応じて書式を変更する方法
実務では、すべてのセルへ同じ書式を設定するだけではありません。
例えば、
- 売上が100万円以上なら背景を黄色にする
- エラー行だけ赤色にする
- 空白セルだけグレーにする
など、データの内容に応じて見た目を変える場面も多くあります。
このような場合は、条件分岐と書式設定を組み合わせることで、視認性の高い帳票を自動作成できます。
金額だけでなく、「売上が基準以上、かつ在庫が不足している場合」のように複数条件で書式を変える場合は、条件の整理が重要です。Select CaseでAND条件を扱う方法は、【VBA】Select Case文でAND条件を使う方法|複数条件を見やすく分岐する実務テクニックで詳しく解説しています。
条件に応じて背景色を変更するコード
Sub HighlightHighSales()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim currentRow As Long
Set targetWorksheet = Worksheets("売上")
lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "B").End(xlUp).Row
For currentRow = 2 To lastRow
If targetWorksheet.Cells(currentRow, "B").Value >= 1000000 Then
targetWorksheet.Cells(currentRow, "B").Interior.Color = RGB(255, 255, 153)
End If
Next currentRow
End Sub
このように、データの判定と書式設定を分離した構成にしておくことで、条件が変更になった場合も修正箇所が分かりやすくなります。
✅ 文字色・罫線・配置もまとめて整える
数値形式や背景色だけでなく、文字色・罫線・配置まで設定すると、表全体の見やすさを統一できます。
特に実務では、見出し行、入力欄、計算結果、注意が必要なセルなど、役割ごとに書式を分けることが重要です。
VBAで書式を設定する場合は、単に色を付けるのではなく、「どの情報を目立たせたいのか」を決めてから装飾すると、過度に派手な表になるのを防げます。
・重要な数値だけ文字色を変更する
文字色は、Font.Colorプロパティで設定します。
たとえば、赤字で表示する場合は次のように記述します。
Worksheets("売上").Range("B2:B100").Font.Color = RGB(255, 0, 0)
ただし、列全体を赤字にすると、どの値が重要なのか分かりにくくなります。
実務では、条件に一致したセルだけ文字色を変える方法が使いやすくなります。
Sub HighlightNegativeAmounts()
Dim targetWorksheet As Worksheet
Dim amountRange As Range
Dim amountCell As Range
Set targetWorksheet = ThisWorkbook.Worksheets("売上")
Set amountRange = targetWorksheet.Range("B2:B100")
For Each amountCell In amountRange.Cells
If IsNumeric(amountCell.Value) And amountCell.Value < 0 Then
amountCell.Font.Color = RGB(192, 0, 0)
amountCell.Font.Bold = True
End If
Next amountCell
End Sub
このコードでは、対象セルが数値かどうかを確認してから、マイナス値だけを赤字・太字にしています。
空白や文字列が含まれる可能性を考慮してIsNumericを使用しているため、単純に値だけを比較する方法よりも安全です。
・表の区切りを分かりやすくする罫線設定
罫線は、Bordersプロパティで設定します。
次のコードでは、表全体に細い罫線を設定しています。
Sub ApplyTableBorders()
Dim targetWorksheet As Worksheet
Dim tableRange As Range
Set targetWorksheet = ThisWorkbook.Worksheets("売上")
Set tableRange = targetWorksheet.Range("A1:E100")
With tableRange.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.Color = RGB(191, 191, 191)
End With
End Sub
罫線を設定するときは、すべてを太線にするよりも、表全体は細線、見出しや合計行だけ太線にすると見やすくなります。
たとえば、合計行だけ上罫線を太くする場合は、次のように設定できます。
With Worksheets("売上").Range("A101:E101").Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
罫線を細かく設定しすぎると、コードが長くなりやすいため、表全体と重要行に分けて設定するのが実務では扱いやすい方法です。
・文字の配置を揃えて読みやすくする
文字の配置は、HorizontalAlignmentとVerticalAlignmentで指定します。
With Worksheets("売上").Range("A1:E1")
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
見出し行は中央揃え、文字列は左揃え、数値は右揃えにすると、一般的な表として読みやすくなります。
ただし、Excelでは数値や文字列の配置が自動で調整されるため、すべてのセルへ無理に配置を指定する必要はありません。
見出しや備考欄など、配置を統一したい範囲だけ設定すると、コードを簡潔に保てます。
✅ 複数条件で書式を切り替える実務向けコード
実務では、売上金額や進捗状況に応じて、複数の色を使い分けることがあります。
たとえば、売上金額が次の条件になっているとします。
- 100万円以上:緑色
- 50万円以上100万円未満:黄色
- 50万円未満:赤色
このような処理では、条件の優先順位が重要です。
100万円以上の判定から順番に処理しないと、意図しない条件に一致する場合があります。
・条件の順番が伝わる構成にする
次のコードでは、判定基準を定数としてまとめ、条件設定を変更しやすくしています。
Sub FormatSalesByAmount()
Const HIGH_SALES_THRESHOLD As Currency = 1000000
Const MIDDLE_SALES_THRESHOLD As Currency = 500000
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim salesRange As Range
Dim salesCell As Range
Dim salesAmount As Variant
Set targetWorksheet = ThisWorkbook.Worksheets("売上")
lastRow = targetWorksheet.Cells( _
targetWorksheet.Rows.Count, "B" _
).End(xlUp).Row
If lastRow < 2 Then Exit Sub
Set salesRange = targetWorksheet.Range("B2:B" & lastRow)
For Each salesCell In salesRange.Cells
salesAmount = salesCell.Value
' 前回の書式を残さないよう、判定前に初期状態へ戻す
salesCell.Interior.Pattern = xlNone
salesCell.Font.Color = RGB(0, 0, 0)
salesCell.Font.Bold = False
If IsNumeric(salesAmount) Then
Select Case CDbl(salesAmount)
Case Is >= HIGH_SALES_THRESHOLD
salesCell.Interior.Color = RGB(198, 239, 206)
salesCell.Font.Color = RGB(0, 97, 0)
salesCell.Font.Bold = True
Case Is >= MIDDLE_SALES_THRESHOLD
salesCell.Interior.Color = RGB(255, 235, 156)
salesCell.Font.Color = RGB(156, 101, 0)
Case Else
salesCell.Interior.Color = RGB(255, 199, 206)
salesCell.Font.Color = RGB(156, 0, 6)
End Select
End If
Next salesCell
End Sub
・条件と装飾を分けて考えられる設計が強い
このコードでは、条件値を直接If文へ書かず、定数として定義しています。
たとえば基準額が100万円から120万円へ変更された場合でも、定数部分だけを修正すれば対応できます。
また、Select Caseを利用することで、複数条件の順番が見やすくなっています。
If~ElseIfでも同じ処理は可能ですが、金額帯のように1つの値を複数段階で判定する場合は、Select Caseの方が条件構造を把握しやすくなります。
さらに、判定前に書式を初期化している点も重要です。
以前は100万円以上だったセルが、データ更新後に50万円未満へ変わった場合、初期化しないと前回の太字設定などが残る可能性があります。
実務ではデータが繰り返し更新されるため、「実行するたびに同じ結果になるコード」を意識する必要があります。
複数の列や項目を組み合わせて書式を変更したい場合は、1つの金額だけでなく、複数の変数を使った判定が必要になります。複数項目を整理して分岐する方法は、【VBA】Select Case文で複数の変数を判定する方法|実務で使える条件分岐の書き方も参考になります。
✅ 書式設定を一括で行う完成形
ここまでの内容を組み合わせると、売上表全体の書式を整える処理を1つにまとめられます。
ただし、1つのSubにすべて詰め込むと、後から修正しにくくなります。
実務では、全体を制御する処理と、見出し・データ・条件色を設定する処理に分けると、再利用しやすくなります。
・役割ごとに処理を分けて保守しやすくする
Option Explicit
Private Const SALES_SHEET_NAME As String = "売上"
Private Const HEADER_ROW As Long = 1
Private Const FIRST_DATA_ROW As Long = 2
Private Const SALES_COLUMN As String = "B"
Public Sub FormatSalesReport()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Set targetWorksheet = ThisWorkbook.Worksheets(SALES_SHEET_NAME)
lastRow = targetWorksheet.Cells( _
targetWorksheet.Rows.Count, SALES_COLUMN _
).End(xlUp).Row
If lastRow < FIRST_DATA_ROW Then
MsgBox "書式設定の対象データがありません。", vbInformation
Exit Sub
End If
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
ApplyBaseFormat targetWorksheet, lastRow
ApplyHeaderFormat targetWorksheet
ApplySalesFormat targetWorksheet, lastRow
Application.ScreenUpdating = True
MsgBox "売上表の書式設定が完了しました。", vbInformation
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
MsgBox _
"書式設定中にエラーが発生しました。" & vbCrLf & _
"詳細:" & Err.Description, _
vbExclamation
End Sub
Private Sub ApplyBaseFormat( _
ByVal targetWorksheet As Worksheet, _
ByVal lastRow As Long _
)
Dim tableRange As Range
Set tableRange = targetWorksheet.Range( _
"A1:E" & lastRow _
)
With tableRange
.Font.Name = "Meiryo UI"
.Font.Size = 10
.VerticalAlignment = xlCenter
End With
targetWorksheet.Range( _
"B" & FIRST_DATA_ROW & ":B" & lastRow _
).NumberFormat = "#,##0"
With tableRange.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.Color = RGB(217, 217, 217)
End With
End Sub
Private Sub ApplyHeaderFormat( _
ByVal targetWorksheet As Worksheet _
)
Dim headerRange As Range
Set headerRange = targetWorksheet.Range("A1:E1")
With headerRange
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Interior.Color = RGB(68, 114, 196)
.HorizontalAlignment = xlCenter
End With
End Sub
Private Sub ApplySalesFormat( _
ByVal targetWorksheet As Worksheet, _
ByVal lastRow As Long _
)
Const HIGH_SALES_THRESHOLD As Currency = 1000000
Const MIDDLE_SALES_THRESHOLD As Currency = 500000
Dim salesRange As Range
Dim salesCell As Range
Set salesRange = targetWorksheet.Range( _
SALES_COLUMN & FIRST_DATA_ROW & ":" & _
SALES_COLUMN & lastRow _
)
For Each salesCell In salesRange.Cells
ResetSalesCellFormat salesCell
If IsNumeric(salesCell.Value) Then
Select Case CDbl(salesCell.Value)
Case Is >= HIGH_SALES_THRESHOLD
salesCell.Interior.Color = RGB(198, 239, 206)
salesCell.Font.Color = RGB(0, 97, 0)
salesCell.Font.Bold = True
Case Is >= MIDDLE_SALES_THRESHOLD
salesCell.Interior.Color = RGB(255, 235, 156)
salesCell.Font.Color = RGB(156, 101, 0)
Case Else
salesCell.Interior.Color = RGB(255, 199, 206)
salesCell.Font.Color = RGB(156, 0, 6)
End Select
End If
Next salesCell
End Sub
Private Sub ResetSalesCellFormat( _
ByVal targetCell As Range _
)
With targetCell
.Interior.Pattern = xlNone
.Font.Color = RGB(0, 0, 0)
.Font.Bold = False
End With
End Sub
・変更箇所が見つけやすいコードは長く使える
このコードでは、処理を次の役割に分けています。
FormatSalesReport:処理全体の進行を管理ApplyBaseFormat:表全体の基本書式を設定ApplyHeaderFormat:見出し行を設定ApplySalesFormat:売上金額に応じた条件書式を設定ResetSalesCellFormat:条件書式を初期状態へ戻す
一見すると、1つのSubにまとめるよりコード量は増えています。
しかし、見出し色だけ変えたい場合はApplyHeaderFormat、金額条件だけ変更したい場合はApplySalesFormatを確認すればよいため、修正範囲が明確です。
同じレイアウトの別帳票へ流用するときも、必要な処理だけ使い回せます。
実務では「短いコード」よりも、「変更箇所がすぐ分かるコード」の方が保守しやすくなります。
✅ VBAで設定した書式を解除する方法
VBAで書式を付けたあと、元の状態へ戻したい場合もあります。
書式解除には、主に次の方法があります。
| 方法 | 内容 |
|---|---|
| ClearFormats | 書式だけをすべて削除 |
| Clear | 値・数式・書式などを削除 |
| 個別プロパティの初期化 | 特定の書式だけを解除 |
書式だけを削除する場合は、ClearFormatsを使用します。
Worksheets("売上").Range("A1:E100").ClearFormats
ただし、ClearFormatsを使用すると、数値形式、罫線、背景色、フォントなどがすべて解除されます。
一部の設定だけ戻したい場合は、個別に初期化した方が安全です。
With Worksheets("売上").Range("B2:B100")
.Interior.Pattern = xlNone
.Font.Color = RGB(0, 0, 0)
.Font.Bold = False
End With
実務では、表全体の書式をすべて削除する場面はそれほど多くありません。
既存の帳票へ処理を追加する場合は、必要な書式だけを変更・解除する方が、元のレイアウトを壊しにくくなります。
✅ VBAで書式設定するときの注意点
VBAでセルの書式を変更する処理は便利ですが、対象範囲や実行回数によっては、処理速度や既存書式へ影響します。
安定して利用するために、次の点を確認しましょう。
・セルを1つずつ処理しすぎない
すべてのセルをループして同じ書式を設定すると、データ量が多い場合に処理が遅くなります。
同じ設定を適用する場合は、範囲全体へ一括設定する方が効率的です。
targetWorksheet.Range("B2:B1000").NumberFormat = "#,##0"
一方、セルごとに条件が異なる場合はループが必要です。
「共通書式は範囲へ一括設定し、条件書式だけループする」という分け方が、処理速度と読みやすさのバランスを取りやすくなります。
・SelectやActivateに依存しない
次のような書き方でも動作します。
Worksheets("売上").Activate
Range("B2:B100").Select
Selection.NumberFormat = "#,##0"
しかし、別のシートがアクティブになった場合や、ユーザーが途中で操作した場合に、意図しない範囲へ書式を設定する危険があります。
実務では、次のように対象を直接指定する方が安全です。
ThisWorkbook.Worksheets("売上").Range("B2:B100").NumberFormat = "#,##0"
対象ブック・シート・範囲がコード上で明確になるため、処理内容も理解しやすくなります。
・条件付き書式との使い分けを考える
データ変更のたびに見た目を自動更新したい場合は、VBAで直接色を付けるより、Excelの条件付き書式を設定した方が適していることがあります。
VBAによる直接設定は、マクロを実行した時点の値を基準に書式を変更します。
その後セルの値が変わっても、再度マクロを実行しない限り、色は自動更新されません。
一方、条件付き書式は、セルの値が変わると自動的に表示も変わります。
次のように使い分けるとよいでしょう。
- 表を作成するときに一度だけ整える:VBAで直接設定
- 値の変更へ常に追従させる:条件付き書式
- 複数シートへ同じルールを設定する:VBAで条件付き書式を作成
- 出力前に書式を確定する:VBAで直接設定
見た目を変える目的だけでなく、その後データが更新されるかどうかも考えて方法を選ぶことが大切です。
行ごとに条件判定しながら書式を変更する場合は、Cellsを使ったセル指定が便利です。Cellsで利用できる操作や実務での使い方は、【VBA】Cellsメソッド一覧|できること・よく使うプロパティ・実務で役立つ使い方でまとめています。
✅ まとめ
VBAを使えば、セルの数値形式・フォント・文字色・背景色・罫線・配置などを自動で設定できます。
手作業で表を整える場合と比べて、設定漏れを防ぎやすく、複数の帳票へ同じ書式を適用できる点がメリットです。
この記事のポイントは次のとおりです。
- 数値形式は
NumberFormatで設定する - フォントは
Fontプロパティで変更する - 背景色は
Interior.Colorで指定する - 色指定は
RGBを使うと意図が分かりやすい - 共通の書式は範囲全体へ一括設定する
- 条件ごとに色を変える場合は
IfやSelect Caseを使う - 条件値は定数にすると変更しやすい
- 書式設定前に古い装飾を初期化すると再実行に強くなる
- 処理を役割ごとに分けると保守・流用しやすい
- 書式だけを削除するときは
ClearFormatsを使う SelectやActivateに依存せず、対象を直接指定する- データ変更へ追従させる場合は条件付き書式も検討する
書式設定の自動化では、単にセルへ色を付けるだけでなく、誰が実行しても同じ結果になり、後から条件を変更しやすい構成にすることが重要です。
対象範囲、色、判定基準を分かりやすく整理しておけば、売上表だけでなく、在庫表、進捗管理表、請求書、集計表など、さまざまな業務へ応用できます。