VBAで自動化 VBA一覧 セル・見た目の操作 ビジュアル操作

【VBA】セルの書式設定を変更する方法|数値形式・フォント・背景色を一括設定する実務テクニック

Excel VBAでは、セルへ値を書き込くだけでなく、数値の表示形式やフォント、背景色などの書式も自由に変更できます。

たとえば、売上データを通貨表示にしたり、見出し行だけ背景色を付けたり、条件に応じて文字色を変更したりといった処理を自動化できます。

手作業で書式を整えていると、データ量が増えるほど時間がかかり、設定漏れも発生しやすくなります。

VBAで書式設定まで自動化すれば、誰が実行しても同じ見た目を維持できるため、実務では非常に利用頻度の高い処理の一つです。

この記事では、数値形式・フォント・背景色の基本から、一括設定や条件付きで書式を変更する方法まで、実務で使いやすいコードを交えながら解説します。

✅ VBAでセルの書式設定を変更する基本

Excel VBAでは、セルの表示内容と書式は別々に管理されています。

そのため、セルへ値を書き込んだあとに書式を設定することで、同じデータでも見やすい表へ整えることができます。

代表的な書式設定には、次のようなものがあります。

  • 数値形式
  • フォント
  • フォントサイズ
  • 太字
  • 文字色
  • 背景色
  • 配置
  • 罫線

これらはそれぞれ専用のプロパティを持っており、必要なものだけ変更できます。

書式だけを変更する場合はセルの値には影響しないため、既存データを安全に装飾できます。

VBAでは、セルの見た目だけでなく、文字列・日付・数値の表示形式を用途に合わせて整えることも重要です。データ種類ごとの書式設定について詳しく知りたい方は、【VBA】書式設定をする方法|文字列・日付・数値を整える実務設計も参考にしてください。


数値形式はNumberFormatプロパティで設定する

数値の表示形式は、NumberFormatプロパティで変更します。

例えば、売上金額を3桁区切りで表示する場合は次のように記述します。

Worksheets("売上").Range("B2:B100").NumberFormat = "#,##0"

主な書式には次のようなものがあります。

表示形式設定内容
#,##03桁区切り
¥#,##0通貨
0.00小数点2桁
0%パーセント
yyyy/mm/dd日付

セルの値そのものは変更せず、表示だけを変えられる点が特徴です。

NumberFormatFontInteriorは、セルの状態を取得・変更するためのプロパティです。プロパティとメソッドの違いを整理したい方は、【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セルずつ設定してしまうことがあります。

もちろん動作しますが、この書き方では修正箇所が増え、保守もしにくくなります。

実務では対象範囲をまとめて取得し、一括で書式を設定できる構成にする方が、後から変更しやすくなります。

また、対象範囲を変えるだけで別の帳票にも流用できるため、再利用性も高くなります。

書式を一括設定するには、対象範囲を正しく指定することが重要です。RangeCellsRowsColumnsの違いや使い分けは、【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つずつ指定する方法と比べて、

  • 修正箇所が少ない
  • 保守しやすい
  • 処理対象が分かりやすい

というメリットがあります。

実務では帳票の列数や行数が変わることも珍しくないため、「対象範囲をまとめて扱う」という設計を意識すると、後から流用しやすいコードになります。

FontInteriorBordersNumberFormatなどの書式設定は、いずれも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

罫線を細かく設定しすぎると、コードが長くなりやすいため、表全体と重要行に分けて設定するのが実務では扱いやすい方法です。


・文字の配置を揃えて読みやすくする

文字の配置は、HorizontalAlignmentVerticalAlignmentで指定します。

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を使うと意図が分かりやすい
  • 共通の書式は範囲全体へ一括設定する
  • 条件ごとに色を変える場合はIfSelect Caseを使う
  • 条件値は定数にすると変更しやすい
  • 書式設定前に古い装飾を初期化すると再実行に強くなる
  • 処理を役割ごとに分けると保守・流用しやすい
  • 書式だけを削除するときはClearFormatsを使う
  • SelectActivateに依存せず、対象を直接指定する
  • データ変更へ追従させる場合は条件付き書式も検討する

書式設定の自動化では、単にセルへ色を付けるだけでなく、誰が実行しても同じ結果になり、後から条件を変更しやすい構成にすることが重要です。

対象範囲、色、判定基準を分かりやすく整理しておけば、売上表だけでなく、在庫表、進捗管理表、請求書、集計表など、さまざまな業務へ応用できます。

    -VBAで自動化, VBA一覧, セル・見た目の操作, ビジュアル操作