Excel VBAを使えば、繰り返し作業を自動化できます。
Excel VBA入門【業務自動化の第一歩】
この記事では、VBAの基礎から実践的な使い方まで、初心者向けに解説します。
VBAとは
概要
VBA(Visual Basic for Applications) は、Microsoft Office製品で使えるプログラミング言語です。
できること
- Excelの操作を自動化
- 繰り返し作業の効率化
- カスタム関数の作成
- フォームの作成
メリット・デメリット
| メリット | デメリット |
|---|---|
| Excelがあれば追加費用なし | Excel/Windowsのみ |
| 学習コストが比較的低い | 大規模処理には不向き |
| 業務に直結した自動化 | バージョン依存の場合あり |
VBAを始める準備
開発タブの表示
手順
- ファイル → オプション
- リボンのユーザー設定
- 「開発」にチェック
- OK
VBEの起動
開発タブ → Visual Basic または Alt + F11
VBEの画面構成
┌─────────────────────────────────────┐ │ メニューバー │ ├──────────┬──────────────────────────┤ │ プロジェクト│ │ │ エクスプ │ コードウィンドウ │ │ ローラー │ │ ├──────────┤ │ │ プロパティ │ │ │ ウィンドウ │ │ └──────────┴──────────────────────────┘
標準モジュールの追加
手順
- プロジェクトエクスプローラで右クリック
- 挿入 → 標準モジュール
- コードを記述
基本的な構文
プロシージャ(Sub)
vba
Sub HelloWorld()
MsgBox "Hello, World!"
End Sub
変数の宣言
vba
Sub VariableExample()
Dim str As String
Dim num As Long
Dim dbl As Double
Dim flag As Boolean
str = "文字列"
num = 100
dbl = 3.14
flag = True
End Sub
条件分岐(If)
vba
Sub IfExample()
Dim score As Long
score = 80
If score >= 80 Then
MsgBox "合格"
ElseIf score >= 60 Then
MsgBox "追試"
Else
MsgBox "不合格"
End If
End Sub
繰り返し(For)
vba
Sub ForExample()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = i
Next i
End Sub
繰り返し(For Each)
vba
Sub ForEachExample()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Debug.Print ws.Name
Next ws
End Sub
繰り返し(Do While)
vba
Sub DoWhileExample()
Dim i As Long
i = 1
Do While Cells(i, 1).Value <> ""
Debug.Print Cells(i, 1).Value
i = i + 1
Loop
End Sub
セルの操作
セルの参照方法
vba
' A1セルを参照
Range("A1").Value = "Hello"
' 行・列で参照(行, 列)
Cells(1, 1).Value = "Hello"
' 複数セルを参照
Range("A1:C3").Value = 1
' 名前付き範囲
Range("データ範囲").Value = 0
値の取得と設定
vba
Sub CellValueExample()
' 値を取得
Dim value As Variant
value = Range("A1").Value
' 値を設定
Range("B1").Value = value * 2
' 数式を設定
Range("C1").Formula = "=A1+B1"
End Sub
行・列の操作
vba
Sub RowColumnExample()
' 最終行を取得
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 最終列を取得
Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
' 行の挿入
Rows(5).Insert
' 列の削除
Columns("B").Delete
End Sub
書式設定
vba
Sub FormatExample()
With Range("A1")
.Font.Bold = True
.Font.Size = 14
.Font.Color = RGB(255, 0, 0)
.Interior.Color = RGB(255, 255, 0)
End With
End Sub
実践的なマクロ例
例1: データの集計
vba
Sub SumData()
Dim lastRow As Long
Dim total As Double
Dim i As Long
' 最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 合計を計算
total = 0
For i = 2 To lastRow
total = total + Cells(i, 2).Value
Next i
' 結果を出力
Cells(lastRow + 1, 1).Value = "合計"
Cells(lastRow + 1, 2).Value = total
End Sub
例2: 条件に合うデータを抽出
vba
Sub ExtractData()
Dim srcSheet As Worksheet
Dim dstSheet As Worksheet
Dim srcRow As Long, dstRow As Long
Dim lastRow As Long
Set srcSheet = Sheets("元データ")
Set dstSheet = Sheets("抽出結果")
' 抽出先をクリア
dstSheet.Cells.Clear
' ヘッダーをコピー
srcSheet.Rows(1).Copy dstSheet.Rows(1)
' データを抽出
lastRow = srcSheet.Cells(Rows.Count, 1).End(xlUp).Row
dstRow = 2
For srcRow = 2 To lastRow
If srcSheet.Cells(srcRow, 3).Value >= 100 Then
srcSheet.Rows(srcRow).Copy dstSheet.Rows(dstRow)
dstRow = dstRow + 1
End If
Next srcRow
MsgBox dstRow - 2 & "件を抽出しました"
End Sub
例3: 複数ファイルの一括処理
vba
Sub ProcessMultipleFiles()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim summary As Range
Dim rowNum As Long
folderPath = "C:\data\"
fileName = Dir(folderPath & "*.xlsx")
rowNum = 2
' 結果シートの準備
Set summary = ThisWorkbook.Sheets("集計").Range("A1")
summary.Value = "ファイル名"
summary.Offset(0, 1).Value = "合計"
' 各ファイルを処理
Do While fileName <> ""
Set wb = Workbooks.Open(folderPath & fileName)
' 処理(例:B列の合計)
summary.Offset(rowNum - 1, 0).Value = fileName
summary.Offset(rowNum - 1, 1).Value = _
Application.WorksheetFunction.Sum(wb.Sheets(1).Range("B:B"))
wb.Close SaveChanges:=False
rowNum = rowNum + 1
fileName = Dir()
Loop
MsgBox "処理が完了しました"
End Sub
例4: 日報の自動生成
vba
Sub CreateDailyReport()
Dim ws As Worksheet
Dim reportDate As Date
reportDate = Date
' 新しいシートを作成
Set ws = ThisWorkbook.Sheets.Add
ws.Name = Format(reportDate, "yyyymmdd") & "_日報"
' テンプレートを作成
With ws
.Range("A1").Value = "日報"
.Range("A1").Font.Size = 16
.Range("A1").Font.Bold = True
.Range("A3").Value = "日付:"
.Range("B3").Value = reportDate
.Range("A5").Value = "作業内容:"
.Range("A7").Value = "明日の予定:"
.Range("A9").Value = "備考:"
End With
MsgBox "日報を作成しました"
End Sub
デバッグ方法
ブレークポイント
コード行の左端をクリック → 赤い丸が表示される → 実行時にそこで停止
ステップ実行
ショートカットキー
- F8:1行ずつ実行
- F5:続けて実行
- Ctrl+Break:中断
変数の確認
vba
' イミディエイトウィンドウに出力
Debug.Print variable
' または
MsgBox variable
エラーハンドリング
vba
Sub ErrorHandlingExample()
On Error GoTo ErrorHandler
' 処理
Dim result As Double
result = 1 / 0 ' エラー発生
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
注意点とベストプラクティス
画面更新の制御
vba
Sub FastProcess()
' 処理を高速化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' 処理
' ...
' 元に戻す
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
変数の宣言を強制
vba
' モジュールの先頭に記述
Option Explicit
コメントの記述
vba
'==================================
' 機能:売上データを集計する
' 引数:なし
' 戻値:なし
' 作成:2025/01/01
'==================================
Sub SumSales()
' 処理
End Sub
まとめ
VBA習得のステップ
学習の流れ
- マクロの記録で動作を理解
- 記録されたコードを読む
- 簡単な処理を手書き
- 徐々に複雑な処理へ
よく使う構文
vba
' 変数宣言
Dim x As Long
' セル操作
Range("A1").Value = 1
Cells(1, 1).Value = 1
' 繰り返し
For i = 1 To 10
Next i
' 条件分岐
If x > 0 Then
End If
関連記事
