ExcelのVBAで仕事を自動化する方法|実務シーン別に解説

スポンサーリンク

「毎月同じ作業を手動でやるのが本当にしんどい」。Excelで繰り返しの業務を抱えている方なら、一度はそう感じたことがあるのではないでしょうか。

手動のコピペや集計作業は、時間がかかるだけでなくミスの温床にもなります。放っておけば、毎月何時間もの残業が当たり前になってしまいます。

VBAを使えば、そうした繰り返し作業をボタンひとつで自動化できます。この記事では、VBAで自動化できる実務シーン7つと、今日から始められる3ステップを紹介します。

VBAによる自動化とは

VBA(Visual Basic for Applications)は、Excelに標準搭載されているプログラミング言語です。追加のソフトをインストールする必要はありません。

VBAを使うと、普段マウスやキーボードで行っている操作をコードで記述し、自動で実行できます。たとえば「A列のデータをB列にコピーして書式を整える」といった作業を、1クリックで完了させることが可能です。

VBAとマクロの関係

VBAとマクロは、よく混同される用語です。簡単に整理しておきましょう。

用語意味
VBAExcelを操作するプログラミング言語
マクロ操作を自動実行する仕組み

マクロは「自動化の仕組み」全体を指し、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のコードを書くには、まず「開発」タブを表示させます。

  1. Excelのリボンで「ファイル」→「オプション」を開く
  2. 「リボンのユーザー設定」を選択する
  3. 右側のリストで「開発」にチェックを入れて「OK」をクリックする

開発タブが表示されたら、「Visual Basic」ボタンをクリックするか、Alt + F11 キーでVBE(Visual Basic Editor)が起動します。

詳しい手順は「開発タブの表示方法」で画像付きで解説しています。

ステップ2: コードの入力と実行

VBEが開いたら、以下の手順でコードを入力して実行します。

  1. メニューバーの「挿入」→「標準モジュール」をクリックする
  2. 表示されたコードウィンドウに、VBAコードを貼り付ける
  3. 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学習ロードマップ」を参考にしてみてください。変数の基本から実務レベルまでの学習順序をまとめています。

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