【VBA】セルの書式を一括変更する方法|日付・金額・表示形式を一発統一(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

  • VBAでセルの表示形式(NumberFormat)を一括変更できる
  • 日付は yyyy/mm/dd、金額は #,##0 のように列ごとに書式を統一できる
  • 空白行をスキップしながら条件付きで書式を適用できる(実務版)

対象: Excel 2016以降 / Microsoft 365、Windows 10/11


完成イメージ(Before / After)

Before(手動で書式修正):

  • 日付列が「44927」のようなシリアル値で表示されている
  • 金額列にカンマがなく「1234567」のまま
  • 小数点の桁数がバラバラ
  • 1列ずつ選択 → 右クリック →「セルの書式設定」→ 表示形式を変更
  • 列が5つあれば5回繰り返し。毎月20分

After(VBAで書式一括変更):

  • マクロを実行(またはボタンをクリック)
  • 日付列は 2026/03/08 形式に統一
  • 金額列は 1,234,567 のカンマ区切りに統一
  • 完了メッセージが表示される

自分も月次報告書を作るたびに、日付列が「44927」のような数値で表示されていて、上司に「これ何?」と聞かれたことがある。Excelが日付をシリアル値で保持しているなんて知らなかった。手動で1列ずつ書式を変えていたが、毎月20分は無駄にしていた。NumberFormatを覚えてからは、マクロ実行1回で報告書の書式が整うようになった。20分が3秒になった。書式のバラつきで毎月消耗している人に、NumberFormat一発で解決する体験をしてほしい。

書式がバラバラな報告書は、中身が正しくても「雑に見える」。NumberFormatで統一すれば、見た目も信頼感も一気に変わる。

なお、セルの「色分け」で見た目を変えたい場合は別のテーマ。セルの値に応じて行を自動色分け を参照。本記事は「表示形式」の統一に特化している。


実行前の準備

バックアップを取る

NumberFormatの設定ミスで表示が崩れる可能性がある。 特に “0” と “0.00” を間違えると小数点以下が見えなくなる。必ずファイルのコピーを別フォルダに保存してから実行する。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  • 「ファイル」→「名前を付けて保存」
  • ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  • 保存

シート構成を確認する

このコードは以下のシート構成を前提としている:

  • 報告シート: シート名「報告」— 書式を変更する対象
  • B列: 日付データ
  • C列: 金額データ

自分のシート名や列構成が異なる場合は、コード内の値を書き換える。


手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  • Excelで Alt + F11 を押す
  • VBE(Visual Basic Editor)が開く

標準モジュールを挿入する

  • VBEのメニュー →「挿入」→「標準モジュール」
  • 白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  • コードウィンドウに、下のコードをそのままコピペする
  • Alt + F8 → マクロ名を選んで「実行」

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。


コード(最小版)– 指定範囲のNumberFormatを一括変更


'============================================================
' ■ セルの書式を一括変更(最小版)
'   → 日付列を yyyy/mm/dd、金額列を #,##0 に統一
'============================================================
Sub FormatCellsMinimal()

    '--- ★書き換えポイント ---
    Dim targetSheet As String
    targetSheet = "報告"           '← 書式を変更するシート名

    Dim dateCol As String
    dateCol = "B"                  '← 日付が入っている列
    Dim dateFormat As String
    dateFormat = "yyyy/mm/dd"      '← 日付の表示形式

    Dim moneyCol As String
    moneyCol = "C"                 '← 金額が入っている列
    Dim moneyFormat As String
    moneyFormat = "#,##0"          '← 金額の表示形式

    Dim startRow As Long
    startRow = 2                   '← データ開始行(ヘッダーの次)

    Dim endRow As Long
    endRow = 100                   '← データ終了行(多めでOK)
    '--- ★ここまで ---

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(targetSheet)

    '--- 日付列の書式を変更
    ws.Range(dateCol & startRow & ":" & dateCol & endRow).NumberFormat = dateFormat

    '--- 金額列の書式を変更
    ws.Range(moneyCol & startRow & ":" & moneyCol & endRow).NumberFormat = moneyFormat

    MsgBox "書式の変更が完了しました。", vbInformation

End Sub

書き換えポイント

変数 説明 初期値
`targetSheet` 書式を変更するシート名 `”報告”`
`dateCol` 日付が入っている列 `”B”`
`dateFormat` 日付の表示形式 `”yyyy/mm/dd”`
`moneyCol` 金額が入っている列 `”C”`
`moneyFormat` 金額の表示形式 `”#,##0″`
`startRow` データ開始行 `2`
`endRow` データ終了行 `100`

コードの流れ

  • 対象シートと列・書式の設定を定義
  • Range(...).NumberFormat = "書式文字列" で日付列の表示形式を変更
  • 同様に金額列の表示形式を変更
  • 完了メッセージを表示

重要: NumberFormatは「表示形式」を変えるだけで、セルの値自体は変わらない。ただし “0” にすると小数点以下が表示されなくなるので、意図した書式文字列か必ず確認する。


コード(実務版)– 列ごとに異なる書式を配列で一括適用 + 空白行スキップ

実務では「日付・金額・パーセント・小数」など列ごとに書式が違う。さらに空白行に日付書式を適用すると「1900/01/00」が表示される問題もある。配列で列と書式の組み合わせを管理し、空白行はスキップする。

以前、NumberFormatを “0” にしたら小数点以下が全部消えて、品質データが台無しになったことがある。提出後に気づいて青ざめた。実務版では書式文字列を配列で明確に管理するので、こうしたミスを防ぎやすい。

転記(セルの転記を自動化する方法)で別シートから集めたデータに書式を適用するパターンが多い。転記→書式統一の流れで使うと効率的。


'============================================================
' ■ 列ごとに異なる書式を配列で一括適用(実務版)
'   → 列名と書式文字列を配列で管理
'   → 空白行はスキップして書式を適用
'============================================================
Sub FormatCellsAdvanced()

    '--- ★書き換えポイント ---
    Dim targetSheet As String
    targetSheet = "報告"           '← 書式を変更するシート名

    Dim startRow As Long
    startRow = 2                   '← データ開始行(ヘッダーの次)

    '--- 列と書式の組み合わせ(必要に応じて追加・変更)
    Dim cols As Variant
    cols = Array("B", "C", "D", "E")

    Dim fmts As Variant
    fmts = Array("yyyy/mm/dd", "#,##0", "0.00", "0.0%")
    '--- ★ここまで ---

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(targetSheet)

    '--- 最終行を取得(A列で判定)
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    '--- データがあるか確認
    If lastRow < startRow Then
        MsgBox "書式を変更するデータがありません。", vbExclamation
        Exit Sub
    End If

    '--- 列ごとに書式を適用(空白セルはスキップ)
    Dim i As Long
    Dim r As Long
    Dim targetCell As Range

    For i = LBound(cols) To UBound(cols)
        For r = startRow To lastRow
            Set targetCell = ws.Range(cols(i) & r)

            '--- 空白セルはスキップ(書式適用しない)
            If targetCell.Value <> "" Then
                targetCell.NumberFormat = fmts(i)
            End If
        Next r
    Next i

    MsgBox lastRow - startRow + 1 & " 行の書式を変更しました。" & vbCrLf & _
           "対象シート: " & targetSheet, vbInformation

End Sub

書き換えポイント

変数 説明 初期値
`targetSheet` 書式を変更するシート名 `”報告”`
`startRow` データ開始行 `2`
`cols` 書式を変更する列の配列 `Array(“B”, “C”, “D”, “E”)`
`fmts` 各列に適用する書式文字列の配列 `Array(“yyyy/mm/dd”, “#,##0”, “0.00”, “0.0%”)`

コードの流れ

  • 列と書式の定義: cols 配列に列名、fmts 配列に対応する書式文字列を設定
  • 最終行の取得: Cells(Rows.Count, "A").End(xlUp).Row でデータの最終行を特定
  • データ有無チェック: データがない場合はメッセージを出して終了
  • 列ごとにループ: 外側のループで列、内側のループで行を処理
  • 空白セルスキップ: If targetCell.Value <> "" で空白セルには書式を適用しない
  • 完了メッセージ: 処理した行数と対象シートを表示

ポイント: colsfmts の要素数は必ず一致させる。列が増えたら両方の配列に同じ位置で追加する。

全シートに同じ書式を一括適用したい場合は 複数シートに同じ処理を一括実行 と組み合わせる。For Each ws In ThisWorkbook.Worksheets でシートをループすればOK。


よくある落とし穴5選

1. 日付がシリアル値(44927など)で表示される

原因: セルの表示形式が「標準」のままになっている。Excelは日付を内部的にシリアル値(1900年1月1日からの日数)で管理しているため、NumberFormatが設定されていないと数値が表示される。

自分も報告書の日付列が「44927」のような数値で表示されていて、上司に「これ何?」と言われたことがある。Excelの日付がシリアル値だと知らなかった頃の話だ。

対策: Range("B2:B100").NumberFormat = "yyyy/mm/dd" で日付形式を明示する。

2. NumberFormat = “0” で小数点以下が消える

原因: 書式文字列 “0” は整数表示。小数点以下は表示されない(元データは残っているが見えない)。

自分もこれで痛い目にあった。品質検査の数値列に “0” を設定したら、「3.14」が「3」に見えてしまい、品質データが台無しになった。提出後に上司から指摘されて青ざめた。

対策: 小数点以下が必要なら “0.00”(2桁)や “0.0”(1桁)を使う。書式を適用する前にサンプルデータで確認する。

3. 空白セルに日付書式を適用すると「1900/01/00」が表示される

原因: 空白セル(値が0)に日付書式を適用すると、シリアル値0に対応する日付が表示される。

対策: 実務版コードのように If targetCell.Value <> "" で空白セルをスキップする。

4. 書式文字列の大文字・小文字を間違える

原因: “YYYY/MM/DD” と大文字で書いても動くことが多いが、”m” と “M” は月と分で意味が異なる場合がある。

対策: 日付書式は小文字で統一する。"yyyy/mm/dd" が標準。

5. 数値データに文字列書式 “@” を適用してしまう

原因: NumberFormat = "@" は文字列書式。数値セルに適用すると、数値が文字列として扱われ、計算に使えなくなる場合がある。

対策: 数値データには数値用の書式(”#,##0″ や “0.00” など)を使う。”@” はテキスト列にのみ使用する。


FAQ

Q1: NumberFormatを変えると元のデータは変わるのか?

表示形式が変わるだけで、セルの値自体は変わらない。たとえば「3.14159」に “0.00” を設定すると「3.14」と表示されるが、数式バーには元の「3.14159」が残っている。ただし “0” にすると「3」と表示されるので、見た目上は小数点以下が消える。

Q2: 日付がシリアル値(数値)で表示されるのはなぜ?

Excelは日付を内部的にシリアル値(1900年1月1日を1として、そこからの日数)で管理している。「44927」は2023年1月1日を意味する。セルの表示形式が「標準」だとシリアル値がそのまま表示される。NumberFormat = "yyyy/mm/dd" を設定すれば日付として表示される。

Q3: 主な書式文字列の一覧が知りたい

用途 書式文字列 表示例
日付(年/月/日) `”yyyy/mm/dd”` 2026/03/08
日付(日本語) `”yyyy年m月d日”` 2026年3月8日
金額(カンマ区切り) `”#,##0″` 1,234,567
金額(円記号付き) `”¥#,##0″` ¥1,234,567
パーセント `”0.0%”` 85.5%
小数点2桁 `”0.00″` 3.14
整数のみ `”0″` 100
文字列 `”@”` そのまま表示

Q4: 書式を統一した後にデータを抽出したい

書式を統一してからデータを抽出すると見やすい。条件に合うデータを別シートに抽出 を参照。

Q5: ボタン1つで書式統一を実行したい

マクロをボタン1つで実行する方法FormatCellsAdvanced をボタンに割り当てる。毎月の報告書作成時にボタン1つで書式が統一される。


まとめ

  • Range(...).NumberFormat = "書式文字列" でセルの表示形式を一括変更できる(最小版)
  • 列と書式の組み合わせを配列で管理すれば、複数列に異なる書式を一度に適用できる(実務版)
  • 空白セルに日付書式を適用すると「1900/01/00」が表示されるので、スキップ処理を入れる
  • “0” と “0.00” の違いに注意。小数点以下が必要なら桁数を明示する

関連記事


次にやりたくなること


書式統一は地味だけど、報告書の印象が一気にプロっぽくなる。まずは最小版でNumberFormatの威力を体験してみてほしい。

コメント

タイトルとURLをコピーしました