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

最近更新/作成されたページ