Contents
この記事でできること
- 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 <> ""で空白セルには書式を適用しない - 完了メッセージ: 処理した行数と対象シートを表示
ポイント: cols と fmts の要素数は必ず一致させる。列が増えたら両方の配列に同じ位置で追加する。
全シートに同じ書式を一括適用したい場合は 複数シートに同じ処理を一括実行 と組み合わせる。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” の違いに注意。小数点以下が必要なら桁数を明示する
関連記事
- セルの値に応じて行を自動色分け — 色分けで見た目を変えるのはこちら。書式統一とは別テーマ
- セルの転記を自動化する方法 — 転記後のデータに書式を適用する流れ
- 条件に合うデータを別シートに抽出 — 書式統一後のデータ抽出
次にやりたくなること
- ExcelファイルをPDFに一括変換: 書式を統一した報告書をPDF出力。見た目が整った状態で配布できる
- 差し込み印刷をVBAで自動化する方法: 書式を統一したデータを使って差し込み印刷。宛名や金額の表示が揃う
書式統一は地味だけど、報告書の印象が一気にプロっぽくなる。まずは最小版でNumberFormatの威力を体験してみてほしい。


コメント