【VBA】セルの書式設定を自動化!フォント・色・罫線を統一する方法
資料を作るたびにフォントの種類や文字サイズがバラバラになってしまう。印刷してみたらテキストが見切れていて、慌てて手直しした経験はありませんか?
重要な数値を強調したいのに、毎回手動でセルの色を変えるのが面倒で時間がかかる。
このような悩みを抱えているビジネスパーソンはとても多く、私も会社員のころは同じ悩みを持っていました。
このような問題は、VBAを使って解決しちゃいましょう。
VBAを使えば、セルのフォント、文字サイズ、背景色、罫線といった書式設定を自動で一括処理することが可能です。
この記事では、セルの書式設定VBAの基本から実務に直結する応用コードまでを、プログラミング初心者の方でも理解できるよう丁寧に解説していきます。
読み終えたころには「これ、自分の仕事にすぐ使える!」と感じてもらえるはずです。
手作業のセル書式設定が引き起こす3つの問題
資料作成でセルの書式を手作業で設定していると、知らず知らずのうちに大きな問題が積み重なっていきます。
VBAによる自動化を検討するにあたって、まずは手作業が引き起こす問題を整理しておきましょう。
問題①:フォントや色がバラバラになって見づらい資料になる
複数人で編集するエクセルファイルは、担当者ごとにフォントの種類やサイズがバラバラになりがちです。
「MS明朝で書いた行」と「メイリオで書いた行」が混在していると、見た目に統一感がなく、読む側に余計なストレスを与えてしまいます。
「なんだかこの資料、見づらいな」と思われるだけで、内容が良くても評価が下がることがあるのです。
私がマクロ開発を受注した案件でも、「社内の様式なのにフォントがバラバラで、毎回修正に時間を取られている」というご相談を複数いただきました。
問題②:印刷するとテキストが見切れる
セルの幅に対して文字数が多いとき、画面上では問題なく見えているのに印刷すると文字が切れてしまうことがあります。
確認しながら列幅や行の高さを一つひとつ調整するのは、地味ながら相当な時間を消費する作業です。
特に、毎月同じ様式の帳票を印刷するルーティーン作業では、「また見切れてた……」という繰り返しが発生しがちです。
VBAでセルの書式設定を自動化しておけば、このような印刷トラブルを未然に防ぐことができます。
問題③:条件に合ったセルを毎回手動で確認している
「期日を過ぎた行を赤くする」「数量が基準値を超えたセルを黄色にする」といった作業は手間と時間がかかる作業です。
このような条件付きの書式設定は、データ件数が増えるほどミスが発生しやすくなります。
見落としがあれば重大なトラブルに発展することがある。
VBAを使えば、条件を判定して自動でセルの書式を変える処理を実装できるため、ヒューマンエラーをほぼゼロにできます。
セルの書式設定VBAの基本|まずはフォントと色から理解する
セルの書式設定をVBAで操作するには、主に「Font(フォント)」「Interior(背景色)」「Borders(罫線)」という3つのオブジェクトを使います。
それぞれの基本的な使い方を、実際のコードを見ながら確認していきましょう。
フォントの種類・サイズ・太字を一括設定するVBA
まずはフォントの書式設定から始めます。
下記のサンプルコードは、指定したセル範囲のフォント名・文字サイズ・太字をまとめて設定するコードです。
Sub フォント一括設定()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
'対象セル範囲を指定
Dim rng As Range
Set rng = ws.Range("A1:E20")
'フォント名を統一
rng.Font.Name = "MS明朝"
'フォントサイズを統一(単位はポイント)
rng.Font.Size = 12
'太字を解除(統一)
rng.Font.Bold = False
'1行目のヘッダーだけ太字・白文字・青背景にする
With ws.Range("A1:E1")
.Font.Bold = True
.Font.Color = RGB(255, 255, 255) '白文字
.Interior.Color = RGB(68, 114, 196) '青背景
End With
MsgBox "フォントの書式設定が完了しました。", vbInformation
End Sub
コードの流れを解説します。
最初に Set ws = ThisWorkbook.Worksheets(“Sheet1") で処理対象のシートを指定しています。
シート名は実際のファイルに合わせて変更してください。
rng.Font.Name でフォント名、rng.Font.Size でフォントサイズ、rng.Font.Bold で太字のオン/オフを設定します。
この3行だけで、指定範囲内のフォント設定を一括でリセットできます。
後半の With ブロックでは、1行目のヘッダー行だけを別書式にしています。
Font.Color = RGB(255, 255, 255) で文字を白に、Interior.Color = RGB(68, 114, 196) で背景を青に設定しています。
RGB関数は「赤・緑・青」の数値(0〜255)を組み合わせて任意の色を指定できるので、会社のカラーに合わせた設定にも対応可能です。
「With構文の使い方がよくわからない。。。」という方は関連記事「With構文の使い方」を参考にしてみてください。
条件に合ったセルを自動でハイライトするVBA
次に、実務でよく使う「条件判定+セル色変更」のVBAを紹介します。
下記は、C列の「状態」が「要確認」と入力されている行全体を黄色でハイライトするサンプルコードです。
Sub 条件付きハイライト()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'既存の背景色をリセット
ws.Range("A2:E" & lastRow).Interior.ColorIndex = xlNone
Dim i As Long
For i = 2 To lastRow
'C列の値を判定
If ws.Cells(i, 3).Value = "要確認" Then
'その行全体を黄色でハイライト
ws.Range("A" & i & ":E" & i).Interior.Color = RGB(255, 255, 0)
ElseIf ws.Cells(i, 3).Value = "期日超過" Then
'期日超過行はオレンジでハイライト
ws.Range("A" & i & ":E" & i).Interior.Color = RGB(255, 165, 0)
End If
Next i
MsgBox "ハイライト処理が完了しました。", vbInformation
End Sub
コードの流れを解説します。
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row でA列の最終行を自動取得しています。
データが増えても範囲指定を変更する必要がない、使い回しやすいコードです。
Interior.ColorIndex = xlNone でいったん背景色をすべてリセットしてから処理を始めます。
リセットを入れておかないと、前回実行時に色を付けた行が残り続けるためです。
For i = 2 To lastRow のループで2行目から最終行まで1行ずつチェックし、C列の値によってハイライト色を分岐させています。
「要確認」なら黄色、「期日超過」ならオレンジというように、条件を追加するだけで対応パターンを増やすことが可能。
関連記事「VBAで色を変える方法」では、文字の色、背景色を自動的に変える方法が解説されています。
罫線を自動で引くVBA|印刷崩れを防ぐ書式設定
セルに罫線を設定する作業も、手作業では意外と時間がかかる処理のひとつです。
データが増えるたびに罫線を引き直したり、印刷範囲が変わるたびに外枠を書き直したりするのは効率が悪い。
VBAを使えば「データが入っている範囲だけに自動で罫線を引く」という処理を1回の実行で完了させることができます。
データ範囲に自動で罫線を引くVBA
下記は、A1セルを起点にデータが入力されている範囲を自動検出し、内側・外側に罫線を引くサンプルコードです。
Sub 罫線自動設定()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
'データが入っている範囲を自動取得
Dim rng As Range
Set rng = ws.Range("A1").CurrentRegion
'既存の罫線をリセット
rng.Borders.LineStyle = xlNone
'内側の罫線(細線)
With rng.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.Color = RGB(180, 180, 180) 'グレー
End With
With rng.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.Color = RGB(180, 180, 180) 'グレー
End With
'外枠(太線)
With rng.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.Color = RGB(0, 0, 0) '黒
End With
With rng.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.Color = RGB(0, 0, 0)
End With
With rng.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.Color = RGB(0, 0, 0)
End With
With rng.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.Color = RGB(0, 0, 0)
End With
MsgBox "罫線の設定が完了しました。", vbInformation
End Sub
コードの流れを解説します。
ws.Range(“A1").CurrentRegion を使うと、A1セルを起点にデータが連続して入力されている範囲を自動で取得できます。
データが増えても範囲指定を変更せずに使えるため、毎月更新されるような帳票に非常に向いている書き方です。
rng.Borders.LineStyle = xlNone でいったんすべての罫線を消してから引き直しています。
前回引いた罫線が残った状態で上書きするとスタイルが混在することがあるため、必ずリセットしてから実行しましょう。
内側の横線は xlInsideHorizontal、縦線は xlInsideVertical で指定します。
外枠は xlEdgeTop・xlEdgeBottom・xlEdgeLeft・xlEdgeRight の4方向を個別に設定することで、内側と外側で線の太さや色を変えることができます。
列幅・行の高さを自動調整して印刷崩れを防ぐVBA
罫線に加えて、列幅と行の高さの自動調整もセットで実装しておくと、印刷崩れをほぼなくすことができます。
Sub 列幅行高自動調整()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
'データ範囲の列幅を自動調整
ws.Range("A1").CurrentRegion.Columns.AutoFit
'データ範囲の行の高さを自動調整
ws.Range("A1").CurrentRegion.Rows.AutoFit
MsgBox "列幅・行の高さの調整が完了しました。", vbInformation
End Sub
Columns.AutoFit は列幅、Rows.AutoFit は行の高さを、セル内のテキストに合わせて自動調整するコードです。
たった2行ですが、「印刷したら文字が見切れた」「行の高さが途中で変わって見づらい」という問題を一撃で解決できます。
罫線設定のコードと組み合わせてボタン1つで実行できるようにしておくと、資料の仕上げ作業を劇的に効率化することが可能。
AutoFitの使い方がよくわからない。。。と言う方は、関連記事「AutoFitの使い方」を参考にしてみてください。
書式設定VBAを応用する|実務で使える3つのパターン
ここまでの基本コードを理解できたら、次はいよいよ実務に直結する応用パターンを見ていきましょう。
今回紹介する3つのパターンは、私が実際にマクロ開発依頼を受けた際に実装した内容をベースにしています。
応用①:シートを開いたときに書式を自動リセットするVBA
毎朝エクセルを開いたときに書式を自動でリセット・再設定したい、という要望は非常に多いです。
Worksheet_Activate というイベントプロシージャを使えば、シートがアクティブになった瞬間に処理を自動実行することができます。
Private Sub Worksheet_Activate()
'書式リセット',
Me.Range("A1").CurrentRegion.Interior.ColorIndex = xlNone
Me.Range("A1").CurrentRegion.Font.Name = "MS明朝"
Me.Range("A1").CurrentRegion.Font.Size = 12
Me.Range("A1").CurrentRegion.Font.Bold = False
'1行目のヘッダー書式を再設定
With Me.Range("A1:E1")
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Interior.Color = RGB(68, 114, 196)
End With
End Sub
このコードはシートのコードエリアに記述するイベントプロシージャです。
標準モジュールではなく、対象シートのコードウィンドウに貼り付けてください。
「Me」は「このシート自身」という意味で、シート名を指定しなくてもそのシートを対象にして処理を実行するという意味です。
シートを切り替えるたびに書式が自動で整うため、「手直しをする前の状態に戻ってしまった」というトラブルが起きません。
応用②:特定の値を含むセルの文字色を自動変更するVBA
「数値がマイナスになったら赤文字にする」「特定のキーワードが入ったら太字にする」といった書式の変更も自動化することができます。
Sub 数値条件で文字色変更()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'文字色をいったんリセット(黒に統一)
ws.Range("D2:D" & lastRow).Font.Color = RGB(0, 0, 0)
Dim i As Long
For i = 2 To lastRow
Dim val As Double
val = ws.Cells(i, 4).Value 'D列の数値を取得
If val < 0 Then
'0未満は赤文字・太字',
ws.Cells(i, 4).Font.Color = RGB(255, 0, 0)
ws.Cells(i, 4).Font.Bold = True
ElseIf val >= 1000 Then
'1000以上は青文字',
ws.Cells(i, 4).Font.Color = RGB(0, 70, 190)
End If
Next i
MsgBox "文字色の設定が完了しました。", vbInformation
End Sub
For ループでD列を1行ずつ走査し、数値の大きさに応じて文字色と太字を切り替えています。
条件の閾値(0、1000)は状況に応じて変更するだけで、あらゆる業種・業務に応用可能。
処理の最初に一律で黒にリセットしているため、前回実行したときに付いた色が残り続けることもありません。
応用③:印刷前に書式を一括整備するVBA
「印刷する直前に書式を整える」という処理を自動化することができます。
Sub 印刷前書式整備()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim rng As Range
Set rng = ws.Range("A1").CurrentRegion
'① フォントリセット
rng.Font.Name = "MS明朝"
rng.Font.Size = 11
rng.Font.Bold = False
rng.Font.Color = RGB(0, 0, 0)
rng.Interior.ColorIndex = xlNone
'② ヘッダー書式',
With ws.Range("A1:E1")
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Interior.Color = RGB(68, 114, 196)
End With
'③ 罫線(外枠:太線 / 内側:細線)',
rng.Borders.LineStyle = xlNone
rng.BorderAround(xlContinuous, xlMedium, RGB(0, 0, 0))
rng.Borders(xlInsideHorizontal).LineStyle = xlContinuous
rng.Borders(xlInsideHorizontal).Weight = xlThin
rng.Borders(xlInsideVertical).LineStyle = xlContinuous
rng.Borders(xlInsideVertical).Weight = xlThin
'④ 列幅・行の高さ自動調整',
rng.Columns.AutoFit
rng.Rows.AutoFit
MsgBox "印刷前の書式整備が完了しました。", vbInformation
End Sub
4つの処理(フォントリセット・ヘッダー書式・罫線・列幅行高)を1つのSubプロシージャにまとめています。
印刷ボタンを押す前にこのマクロを実行するだけで、フォント・罫線・列幅がすべて整った状態で印刷することが可能。
さらに「印刷実行」も同じマクロの末尾に追加すれば、書式整備から印刷までをボタン1クリックで完結させることもできます。
書式設定VBAを使う際の注意点
書式設定VBAは非常に便利ですが、いくつかの注意点を把握しておかないと「なぜか意図した通りに動かない」という場面に直面することがあります。
実際に私がマクロ開発で経験した注意点を3つ紹介します。
注意点①:処理前に必ず書式をリセットする
書式設定VBAを実行する前に、対象範囲の書式をいったんリセットしておくことが重要です。
前回実行したときの書式が残った状態で上書きすると、「前は黄色だったセルに今回はハイライトなしのはずなのにまだ黄色のまま」といった問題が起きます。
Interior.ColorIndex = xlNone や Borders.LineStyle = xlNone を処理の先頭に入れる習慣をつけておきましょう。
注意点②:CurrentRegionは空白行があると正しく取得できない
ws.Range(“A1").CurrentRegion はA1セルを起点にデータが連続している範囲を取得しますが、途中に空白行や空白列があるとその手前までしか取得できません。
空白行が含まれるデータの場合は、Cells(Rows.Count, 1).End(xlUp).Row を使って最終行を明示的に取得してから範囲指定するほうが確実です。
注意点③:RGBの数値ミスに注意する
RGB関数で色を指定するとき、数値の桁や順番を間違えると意図しない色になることがあります。
RGB(255, 0, 0) が赤、RGB(0, 255, 0) が緑、RGB(0, 0, 255) が青という基本を覚えておきましょう。
会社のコーポレートカラーに合わせた色を使いたい場合は、エクセルの「色の設定」ダイアログでRGB値を確認してからコードに入力すると確実です。
まとめ ~ セルの書式設定はVBAで自動化が正解 ~
エクセルのセル書式設定を毎回手作業で行うのは、時間のロスとミスの温床になります。
VBAを使えば、フォント・背景色・罫線・列幅の調整を一括かつ正確に処理でき、資料の品質を一定に保つことができます。
今回紹介したコードをまとめると、「フォント一括設定」「条件付きハイライト」「罫線自動設定」「印刷前一括整備」という4つのVBAが、セル書式設定の自動化に直結する実務的なコードです。
これらを組み合わせることで、資料作成の最終仕上げから印刷までをボタン1クリックで完結させることが可能になります。
最初は基本コードをそのままコピペして動かすところから始め、徐々に自分の業務に合わせてカスタマイズしていくのがおすすめです。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。