「毎月同じ作業を手動でやるのが本当にしんどい」。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 で強制停止できます。詳しくは「マクロの強制終了方法」をご覧ください。
処理を高速化する3つの設定
ここまでのコードでも十分動きますが、扱うデータが数千行を超えてくると「マクロが重い」と感じる場面が出てきます。実は、処理の前後に数行を足すだけで体感速度がぐっと改善します。
Sub 高速化テンプレート()
'--- 処理開始前:重くなる原因を一時停止 ---
Application.ScreenUpdating = False '--- 画面の再描画を止める ---
Application.Calculation = xlCalculationManual '--- 自動再計算を止める ---
Application.DisplayAlerts = False '--- 確認ダイアログを抑制 ---
'--- ここにメインの処理を書く ---
'--- 処理終了後:必ず元に戻す ---
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
ScreenUpdating は、処理中に画面がチカチカ更新されるのを止める設定です。再描画の負荷がなくなるぶん、大量処理がスムーズになります。
ひとつ注意点があります。これらの設定は、処理が終わったら必ず元に戻してください。False のまま放置すると、画面が固まったように見えたり、再計算が止まったままになったりします。
フォルダパスをハードコードしない
先ほどの「ファイル一括処理」では C:売上データ のようにパスを直接書いていました。自分のPCでは動きますが、同僚に渡すとフォルダ構成が違ってエラーになります。
'--- ブックと同じフォルダを基準にする ---
folderPath = ThisWorkbook.Path & "データ"
ThisWorkbook.Path を使うと、マクロの入ったブックがある場所を自動で取得できます。配布するマクロや、複数人で使うマクロでは、こうした相対的な指定がトラブルを減らしてくれますよ。
VBAが本当に最適か、ほかの自動化手段と比べる
「自動化=VBA」と思いがちですが、やりたいことによってはVBAより手軽な方法があります。VBAを書き始める前に、いったん選択肢を見渡しておくと遠回りを避けられます。
| 手段 | 得意なこと | VBAと比べた特徴 |
|---|---|---|
| Excel関数 | 計算・抽出・集計 | FILTERやXLOOKUPで済むなら、そもそもコード不要 |
| Power Query | 外部データの取り込み・整形 | CSVの集約・クレンジングはこちらが定番 |
| Officeスクリプト | Web版・クラウド連携 | TypeScriptベースでPower Automateと組める |
| VBA | 他アプリ操作・ファイル横断 | デスクトップでフルアクセスの自動化が可能 |
ざっくりした判断基準はこうです。計算や抽出だけなら関数、外部データの整形はPower Query、Web版中心や定期実行ならOfficeスクリプト。そして「複数ファイルを横断する」「ほかのアプリを操作する」「複雑な条件分岐がある」といった作業になったら、VBAの出番です。
OfficeスクリプトとVBAの細かな違いは「OfficeスクリプトとVBAの違い」で整理しています。あわせて、CSVの取り込みを自動化したい方は「VBAでCSVを取り込む・書き出す方法」も参考にしてください。
よくある質問
VBAで自動化を始める方からよく寄せられる疑問をまとめました。
マクロが「セキュリティリスク」と表示されて実行できません
2022年以降、インターネット経由で取得したファイルのVBAマクロは、初期設定でブロックされるようになりました。「ファイルのソースが信頼されていないため、Microsoftはマクロの実行をブロックしました」というバナーが出て、従来の「コンテンツの有効化」ボタンが見当たらないケースです。
解除するには、ファイルを右クリックして「プロパティ」を開き、下部の「ブロックの解除」にチェックを入れて適用します。あるいは、信頼できる場所として登録したフォルダにファイルを保存する方法もあります。
なお、このブロック仕様はWindows版のみで、Mac・Web・モバイル版のOfficeには影響しません(Microsoft Learn「インターネットからのマクロのブロック」)。
マクロを有効化する設定はどこにありますか
「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」→「マクロの設定」から変更できます。
初期設定は「通知を含むVBAマクロを無効にする」になっています。自作のマクロであれば、開いたときの通知バーから有効化するか、信頼できる場所に保存して常時許可する運用が安全です。「VBAマクロを有効にする(全許可)」は、出所不明のマクロまで動いてしまうため推奨されません。
なぜ .xlsx で保存するとマクロが消えるのですか
.xlsx は、そもそもマクロを保存できない形式だからです。保存した時点でコードが破棄される仕様になっています。
マクロを残すには、マクロ有効ブックである .xlsm で保存してください。動作が速いバイナリ形式の .xlsb でもマクロは保持できます。保存形式については「VBAのファイル形式」で詳しく解説しています。
MacのExcelでもVBAは使えますか
使えます。Mac版でもマクロの作成・実行が可能で、VBEは Option + F11 キー、またはメニューの「ツール」→「マクロ」から起動できます。
ただし、WindowsとMacでVBAが完全互換というわけではありません。Dir関数のパス区切り()や一部のWindows固有機能はMacで動かないことがあるため、両環境で使うマクロを作るときは注意してください(Microsoft Q&A ほか)。
VBAとOfficeスクリプトはどちらを使うべきですか
用途で選びます。Officeスクリプトは、TypeScriptベースでWeb版に対応し、Power Automateと連携した自動ワークフローが組める点が強みです。一方VBAは、デスクトップ専用ながら、ファイルシステムやほかのアプリまで操作できるフルアクセスが魅力です。
社内の定型バッチや複数ファイルを横断する処理ならVBA、Web版中心で自動実行したいならOfficeスクリプト、という棲み分けが基本になります。詳しくは「OfficeスクリプトとVBAの違い」をご覧ください。
作ったマクロは毎回VBEを開いて実行するのですか
いいえ、もっと手軽な方法があります。シート上にボタン(フォームコントロール)や図形を置いてマクロを登録すれば、ワンクリックで実行できます。
ほかにも、クイックアクセスツールバーへの登録、ショートカットキーの割り当て、開発タブの「マクロ」一覧からの実行などが可能です。実務では、よく使うマクロをボタン化しておくと一気に快適になりますよ。入力用のフォームを作りたい場合は「ユーザーフォームで入力する方法」も参考にしてください。
プログラミング未経験でもVBAは独学できますか
できます。多くの方が、まず「マクロの記録」で操作を記録し、生成されたコードを読み解くところから始めています。
最近は、ChatGPTなどにやりたい処理を伝えてコードを書かせ、それを読んで学ぶ方法も有効です。書かせたコードの読み方は「他人のマクロを読むコツ」、ChatGPTの使い方は「ChatGPTにVBAを書かせるプロンプト集」が参考になります。
まとめ
この記事では、VBAで自動化できる7つの実務シーンと、始め方の3ステップを紹介しました。
この記事のポイント
- VBAはExcelに標準搭載されたプログラミング言語。追加インストール不要で使える
- データ転記・集計・書式設定・ファイル操作など、定型作業はほぼ自動化できる
- 始め方は「開発タブ表示 → コード入力 → .xlsmで保存」の3ステップ
Option Explicit・最終行の動的取得・エラーハンドリングの3つで失敗を防げる- まずは「マクロの記録」から試すのもおすすめ
次のステップ
VBAの基本をもっと体系的に学びたい方は、「VBA学習ロードマップ」を参考にしてみてください。変数の基本から実務レベルまでの学習順序をまとめています。
