「毎月同じ作業を手動でやるのが本当にしんどい」。Excelで繰り返しの業務を抱えている方なら、一度はそう感じたことがあるのではないでしょうか。
手動のコピペや集計作業は、時間がかかるだけでなくミスの温床にもなります。放っておけば、毎月何時間もの残業が当たり前になってしまいます。
VBAを使えば、そうした繰り返し作業をボタンひとつで自動化できます。この記事では、VBAで自動化できる実務シーン7つと、今日から始められる3ステップを紹介します。
VBAによる自動化とは
VBA(Visual Basic for Applications)は、Excelに標準搭載されているプログラミング言語です。追加のソフトをインストールする必要はありません。
VBAを使うと、普段マウスやキーボードで行っている操作をコードで記述し、自動で実行できます。たとえば「A列のデータをB列にコピーして書式を整える」といった作業を、1クリックで完了させることが可能です。
VBAとマクロの関係
VBAとマクロは、よく混同される用語です。簡単に整理しておきましょう。
| 用語 | 意味 |
|---|---|
| VBA | Excelを操作するプログラミング言語 |
| マクロ | 操作を自動実行する仕組み |
マクロは「自動化の仕組み」全体を指し、VBAはその仕組みを動かす「言語」です。つまり、VBAで書いたプログラムをマクロとして実行する、という関係になります。
両者の違いをもっと詳しく知りたい方は、「VBAとマクロの違い」の記事をご覧ください。
VBAで自動化できる業務の全体像
VBAで自動化できる業務は、大きく分けて以下の7つのカテゴリに分類できます。
| カテゴリ | 具体的な作業例 | 時短の目安 |
|---|---|---|
| データ入力・転記 | シート間のコピー、別ブックへの転記 | 30分 → 数秒 |
| 集計・レポート | 月次集計、ピボット的な集計表の作成 | 1時間 → 1分 |
| 書式設定 | 罫線・色・フォントの統一 | 15分 → 数秒 |
| ファイル操作 | フォルダ内の一括処理、CSV取り込み | 20分 → 数秒 |
| 条件分岐 | ランク判定、カテゴリ振り分け | 手作業ミスをゼロに |
| 繰り返し処理 | 行ごとの処理、シート横断の一括操作 | 手作業の数百倍速 |
| 文字列操作 | スペース除去、全角半角統一 | 10分 → 数秒 |
次のセクションから、それぞれのシーンを具体的に見ていきましょう。
VBAで自動化できる実務シーン7選
ここからは、実務でよく使う7つの自動化シーンを紹介します。コードの概要と、関連記事へのリンクもまとめました。
データ入力・転記の自動化
最もニーズが高いのが、データの入力・転記の自動化です。たとえば「受注データをシートAからシートBに転記する」といった作業は、VBAなら数行で書けます。
Sub データ転記()
Dim wsFrom As Worksheet '--- 転記元シート ---
Dim wsTo As Worksheet '--- 転記先シート ---
Dim lastRow As Long '--- 最終行番号 ---
Set wsFrom = Sheets("受注データ")
Set wsTo = Sheets("集計表")
lastRow = wsFrom.Cells(Rows.Count, 1).End(xlUp).Row
wsFrom.Range("A2:D" & lastRow).Copy wsTo.Range("A2")
End Sub
ポイントは、最終行を動的に取得している点です。データが増減しても正しく動作します。
セル操作の基本は「Rangeの使い方」で解説しています。RangeとCellsの使い分けは「RangeとCellsの違い」をご覧ください。
集計・レポート作成の自動化
月末の売上集計やレポート作成は、VBAの得意分野です。SUM関数やCOUNTIF関数をVBAから呼び出すこともできます。
Sub 月次集計()
Dim ws As Worksheet '--- 対象シート ---
Dim total As Double '--- 合計金額 ---
Dim lastRow As Long '--- 最終行番号 ---
Set ws = ActiveSheet
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
total = WorksheetFunction.Sum(ws.Range("C2:C" & lastRow))
ws.Range("C" & lastRow + 2).Value = total
ws.Range("A" & lastRow + 2).Value = "合計"
End Sub
WorksheetFunction を使えば、Excelの関数をVBA内で利用できます。詳しくは「WorksheetFunctionの使い方」をご覧ください。
書式設定・フォーマットの統一
レポートのフォーマットを毎回手作業で整えていませんか。罫線・背景色・フォントサイズなどの設定は、VBAで一括適用できます。
Sub 書式統一()
Dim rng As Range '--- 書式設定範囲 ---
Dim lastRow As Long '--- 最終行番号 ---
lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Set rng = ActiveSheet.Range("A1:E" & lastRow)
With rng
.Font.Name = "游ゴシック"
.Font.Size = 11
.Borders.LineStyle = xlContinuous
End With
'--- 見出し行の装飾 ---
With ActiveSheet.Range("A1:E1")
.Interior.Color = RGB(68, 114, 196)
.Font.Color = RGB(255, 255, 255)
.Font.Bold = True
End With
End Sub
With構文を使うと、同じオブジェクトへの操作をすっきりまとめられます。
ファイル操作の自動化
フォルダ内のファイルを順番に開いて処理する、という作業もVBAで自動化できます。たとえば「売上フォルダ内の全Excelファイルからデータを集約する」といった場面です。
Sub ファイル一括処理()
Dim folderPath As String '--- フォルダパス ---
Dim fileName As String '--- ファイル名 ---
folderPath = "C:売上データ"
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
Workbooks.Open folderPath & fileName
'--- ここにファイルごとの処理を記述 ---
ActiveWorkbook.Close SaveChanges:=False
fileName = Dir()
Loop
End Sub
Dir関数 でフォルダ内のファイルを順に取得し、Do While ループで処理します。Do Loopの構文は「Do Loopの使い方」で詳しく解説しています。
条件分岐による振り分け処理
「点数に応じてランクを付ける」「金額に応じて承認者を振り分ける」など、条件によって処理を変えるのもVBAの基本です。
Sub ランク判定()
Dim i As Long '--- 行カウンター ---
Dim score As Long '--- 点数 ---
Dim lastRow As Long '--- 最終行番号 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
score = Cells(i, 2).Value
If score >= 90 Then
Cells(i, 3).Value = "A"
ElseIf score >= 70 Then
Cells(i, 3).Value = "B"
ElseIf score >= 50 Then
Cells(i, 3).Value = "C"
Else
Cells(i, 3).Value = "D"
End If
Next i
End Sub
条件が3つ以上になる場合は、Select Case のほうがコードが見やすくなります。If文の基本は「If文の使い方」、Select Caseは「Select Caseの使い方」をご覧ください。
繰り返し処理(ループ)の活用
データを1行ずつ処理する、すべてのシートに同じ操作を行う。こうした繰り返し作業は、VBAのループ処理で一瞬で片付きます。
Sub 全シート印刷設定()
Dim ws As Worksheet '--- 各シート ---
For Each ws In ThisWorkbook.Worksheets
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Next ws
End Sub
For Each は、シートやセル範囲などのコレクションを順に処理するのに便利です。基本の For~Next は「For~Nextの使い方」、For Each は「For Eachの使い方」で解説しています。
文字列操作・データクレンジング
取り込んだデータに余計なスペースが混じっていたり、全角と半角が混在していたりすることはよくあります。VBAなら一括で修正できます。
Sub スペース除去()
Dim rng As Range '--- 対象セル ---
Dim cell As Range '--- 各セル ---
Dim lastRow As Long '--- 最終行番号 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range("A1:A" & lastRow)
For Each cell In rng
If VarType(cell.Value) = vbString Then
cell.Value = Trim(cell.Value)
cell.Value = Replace(cell.Value, " ", "")
End If
Next cell
End Sub
VarType で文字列セルだけを対象にしているのがポイントです。数値や日付のセルに誤ってTrimを適用するのを防いでいます。
空白除去の詳しいパターンは「VBAで空白を削除する方法」をご覧ください。
VBA自動化の始め方【3ステップ】
VBAを使ったことがない方でも、以下の3ステップですぐに始められます。
ステップ1: 開発タブの表示とVBEの起動
VBAのコードを書くには、まず「開発」タブを表示させます。
- Excelのリボンで「ファイル」→「オプション」を開く
- 「リボンのユーザー設定」を選択する
- 右側のリストで「開発」にチェックを入れて「OK」をクリックする
開発タブが表示されたら、「Visual Basic」ボタンをクリックするか、Alt + F11 キーでVBE(Visual Basic Editor)が起動します。
詳しい手順は「開発タブの表示方法」で画像付きで解説しています。
ステップ2: コードの入力と実行
VBEが開いたら、以下の手順でコードを入力して実行します。
- メニューバーの「挿入」→「標準モジュール」をクリックする
- 表示されたコードウィンドウに、VBAコードを貼り付ける
F5キーを押す(またはメニューの「実行」→「Sub/ユーザーフォームの実行」)
まずは前のセクションで紹介したコードをコピペして動かしてみてください。動作を確認してからコードを読み解くと、理解が早まりますよ。
なお、コードを書かずに自動化を試す方法として「マクロの記録」もあります。操作をそのまま記録してくれる機能で、VBA入門の第一歩として最適です。詳しくは「マクロの記録の使い方」をご覧ください。
ステップ3: マクロ有効ブック(.xlsm)で保存
VBAコードを含むブックは、通常の .xlsx 形式では保存できません。「名前を付けて保存」で「Excel マクロ有効ブック (.xlsm)」を選択してください。
.xlsx のまま保存すると、せっかく書いたコードがすべて消えてしまいます。保存形式の詳細は「VBAのファイル形式」で解説しています。
NOTE
マクロ有効ブックを開いたときに「セキュリティの警告」が表示される場合があります。自分で作成したマクロであれば「コンテンツの有効化」をクリックして問題ありません。
自動化で失敗しないためのポイント
VBAで自動化を始めると、思わぬエラーに悩まされることがあります。ここでは、初心者がつまずきやすい3つのポイントを紹介します。
Option Explicitで変数宣言を強制する
VBAでは、変数を宣言せずに使うことができます。しかし、これはタイプミスによるバグの原因になります。
Option Explicit
Sub サンプル()
Dim total As Long '--- 合計値 ---
total = 100
'--- tatalと打ち間違えたらコンパイルエラーで教えてくれる ---
End Sub
モジュールの先頭に Option Explicit を記述すると、宣言していない変数を使った時点でエラーが出ます。タイプミスを即座に見つけられるので、必ず設定しておきましょう。
詳しくは「Option Explicitの使い方」をご覧ください。
最終行の取得で範囲を動的にする
データの行数は日々変わります。Range("A1:A100") のように固定すると、データが101行に増えた瞬間に処理漏れが発生します。
Dim lastRow As Long '--- 最終行番号 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
この1行で、A列の最終行を自動取得できます。データ範囲に依存するすべてのマクロで使う基本テクニックです。
詳しくは「最終行の取得方法」をご覧ください。
エラーハンドリングを入れる
業務で使うマクロには、エラーが起きたときの対策を入れておくことが重要です。エラーハンドリングがないと、マクロが途中で止まってデータが中途半端な状態になることがあります。
Sub 安全な処理()
On Error GoTo ErrorHandler
'--- メインの処理 ---
Workbooks.Open "C:データ.xlsx"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
On Error GoTo を使えば、エラー発生時に指定した場所へ処理を飛ばせます。エラーメッセージを表示するだけでも、原因の特定がぐっと楽になりますよ。
なお、マクロが無限ループに入ってしまった場合は Esc キーや Ctrl + Break で強制停止できます。詳しくは「マクロの強制終了方法」をご覧ください。
まとめ
この記事では、VBAで自動化できる7つの実務シーンと、始め方の3ステップを紹介しました。
この記事のポイント
- VBAはExcelに標準搭載されたプログラミング言語。追加インストール不要で使える
- データ転記・集計・書式設定・ファイル操作など、定型作業はほぼ自動化できる
- 始め方は「開発タブ表示 → コード入力 → .xlsmで保存」の3ステップ
Option Explicit・最終行の動的取得・エラーハンドリングの3つで失敗を防げる- まずは「マクロの記録」から試すのもおすすめ
次のステップ
VBAの基本をもっと体系的に学びたい方は、「VBA学習ロードマップ」を参考にしてみてください。変数の基本から実務レベルまでの学習順序をまとめています。
