12.

VBA 入門 — Excel マクロから業務自動化まで

編集
この記事の要点
  • VBA (Visual Basic for Applications) は Microsoft Office(Excel / Word / Access / PowerPoint / Outlook)に組み込まれたマクロ言語
  • 起動は 開発タブ → Visual Basic または Alt+F11 で VBE (Visual Basic Editor) を開く
  • 基本構文: Sub Macro()End SubDim x As LongRange("A1").ValueWorkbook / Worksheet / Range オブジェクト
  • 保存形式は .xlsm(マクロ有効ブック)。.xlsx ではマクロが消える
  • 後継: Office Scripts(TypeScript ベース、Web 版対応)/ Python in Excel(2024+)/ Power Automate(GUI 自動化)

VBA とは

VBA (Visual Basic for Applications) は、Microsoft Office に組み込まれているプログラミング言語です。Excel・Word・Access・PowerPoint・Outlook など、ほぼ全ての Office アプリで動作し、ユーザーが手作業で行う操作をマクロとして自動化できます。1993 年に Excel 5.0 で初登場、30 年以上経った現在も事務職の業務自動化の主役として現役です。

項目内容
正式名称Visual Basic for Applications
言語仕様VB6(Visual Basic 6.0)ベース、オブジェクト指向(一部)
動作環境Microsoft Office(Windows / macOS)、AutoCAD など一部のサードパーティ製品
ファイル形式.xlsm(Excel)、.docm(Word)、.accdb(Access)
用途業務自動化、データ加工、レポート生成、ユーザーフォーム構築
後継候補Office Scripts(Excel Online)、Python in Excel、Power Automate

VBE (Visual Basic Editor) の起動

VBA コードを書くには VBE を起動します:

  1. Excel を開く
  2. ファイル → オプション → リボンのユーザー設定 → 開発にチェック(初回のみ)
  3. リボンの 開発タブ → Visual Basic をクリック(または Alt + F11
  4. VBE が開く → 挿入 → 標準モジュール でコード記入欄を作る

Hello, World — はじめての VBA

Sub HelloWorld()
    MsgBox "Hello, VBA!"
End Sub

F5 キー or VBE の「実行」で動作。Excel に戻って 開発 → マクロ → HelloWorld → 実行 でも OK。

変数とデータ型

Sub VariableSample()
    Dim name As String
    Dim age As Long       ' Integer (16bit) より Long (32bit) 推奨
    Dim price As Double
    Dim isActive As Boolean
    Dim today As Date

    name = "Yamada"
    age = 30
    price = 1980.5
    isActive = True
    today = Now

    Debug.Print name & " / " & age & " / " & today
End Sub
用途範囲
Long整数(推奨)-2,147,483,648 ~ 2,147,483,647
Double小数倍精度浮動小数点
String文字列最大 2GB
Boolean真偽値True / False
Date日付・時刻西暦 100 年 1 月 1 日 ~ 9999 年 12 月 31 日
Variant任意型(既定)遅い・型不明確になるので明示推奨

モジュール冒頭に Option Explicit を書くと変数宣言が必須になり、タイプミスを検出できます(必須習慣)。

セル操作の基本

Sub CellSample()
    ' セル A1 に値を書き込み
    Range("A1").Value = "氏名"
    Cells(1, 2).Value = "年齢"   ' B1

    ' セル範囲に一括書き込み
    Range("A2:A4").Value = Application.Transpose(Array("Yamada", "Tanaka", "Suzuki"))

    ' 書式設定
    Range("A1:B1").Font.Bold = True
    Range("A1:B1").Interior.Color = RGB(255, 235, 100)

    ' 最終行を取得
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Debug.Print "最終行: " & lastRow
End Sub

主要オブジェクトモデル

オブジェクト意味
ApplicationExcel 本体Application.ScreenUpdating = False
Workbookブック (.xlsx)Workbooks("Book1.xlsx")
WorksheetシートWorksheets("Sheet1")
Rangeセル範囲Range("A1:B10")
ChartグラフActiveSheet.ChartObjects(1)
PivotTableピボットActiveSheet.PivotTables(1)

制御構文

' If 文
If age >= 20 Then
    Debug.Print "成人"
ElseIf age >= 13 Then
    Debug.Print "中高生"
Else
    Debug.Print "子供"
End If

' For ループ
Dim i As Long
For i = 1 To 10
    Cells(i, 1).Value = i * 2
Next i

' 全行をループ
Dim r As Range
For Each r In Range("A2:A100")
    If r.Value = "" Then Exit For
    r.Offset(0, 1).Value = r.Value & " 様"
Next r

' Do While
Dim n As Long
n = 1
Do While n <= 5
    Debug.Print n
    n = n + 1
Loop

' Select Case
Select Case score
    Case Is >= 90: rank = "A"
    Case 70 To 89: rank = "B"
    Case Else:     rank = "C"
End Select

イベントマクロ

セル変更・ブック開閉・シート切替などに反応する自動実行マクロを書けます。シート名タブ右クリック → コードの表示 で記述:

' Sheet1 のセル変更時に発火
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Then
        Target.Offset(0, 1).Value = "更新: " & Now
    End If
End Sub

' ブックを開いた瞬間
Private Sub Workbook_Open()
    MsgBox "ようこそ"
End Sub

' ブックを閉じる直前
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If MsgBox("本当に閉じますか?", vbYesNo) = vbNo Then Cancel = True
End Sub

UserForm(GUI)

VBE で 挿入 → ユーザーフォーム。テキストボックス・ボタン・コンボボックス等を配置し、コードでイベント処理:

' フォーム上の CommandButton1 クリック
Private Sub CommandButton1_Click()
    Dim name As String
    name = TextBox1.Value
    Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = name
    Unload Me
End Sub

' フォーム呼出(標準モジュールから)
Sub ShowForm()
    UserForm1.Show
End Sub

パフォーマンス最適化

Sub FastProcessing()
    ' 画面更新・計算・イベントを停止
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' 配列で一括処理(セル単位より 100 倍速い)
    Dim data() As Variant
    data = Range("A1:C10000").Value

    Dim i As Long
    For i = 1 To UBound(data, 1)
        data(i, 3) = data(i, 1) * data(i, 2)
    Next i

    Range("A1:C10000").Value = data

    ' 戻す
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub

保存形式と配布

拡張子マクロ用途
.xlsx不可通常のブック(マクロは保存されない)
.xlsm可能マクロ有効ブック(通常)
.xlsb可能バイナリ形式、大容量で高速
.xltm可能マクロ有効テンプレート
.xlam可能アドイン(複数ブックで共有)

VBA の後継・代替

技術位置付け得意分野
Office ScriptsTypeScript、Excel Online / デスクトップ両対応クラウド時代、Power Automate との連携
Python in Excel (2024+)クラウドで Python を実行、Anaconda 同梱データ分析、機械学習、可視化
Power AutomateGUI フロー、RPAクロスアプリ自動化、承認フロー
Power Query / Mデータ取得・変換ETL、定期更新の整形
VBAOffice 内蔵、ローカル動作既存資産、オフライン業務

FAQ

Q: VBA はもう古い?学ぶ価値ある?
A: 日本企業の事務職では現役。Office Scripts も普及途上で、レガシー資産の保守人材は不足気味。学習コストの割に投資効率は高い。

Q: マクロが「セキュリティ警告」で動かない
A: ファイル → オプション → トラスト センター → マクロの設定 で許可。または信頼できる場所に保存。

Q: Mac の Excel でも動く?
A: 動きますが、Windows API(Win32 宣言)を使うコードは不可。#If Mac Then で分岐。

Q: Python in Excel と VBA はどちらを選ぶべき?
A: ファイル操作・UI 自動化は VBA。データ分析・グラフ生成は Python in Excel。両者は同じシートで併用可能。

編集
Post Share
子ページ
  1. マクロとボタンの紐づけ方法
  2. 開発タブの表示
  3. モジュールの名前変更方法
  4. エラー一覧
  5. シートのコピー
  6. デバッグで一行ずつ実行する方法
  7. 変数宣言時のSETありなしの違い
  8. if文で複数条件を指定する方法
同階層のページ
  1. Java
  2. PHP
  3. Python
  4. C#
  5. C++
  6. Ruby
  7. Go
  8. HTML
  9. CSS
  10. JavaScript
  11. TypeScript
  12. VBA
  13. Google Apps Script
  14. Julia
  15. Swift
  16. オブジェクト指向言語共通
  17. Gen