この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:8
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: 記述方法
SEOタイトル: VBA 記述方法・コーディング規約完全ガイド — Sub/Function/Dim/With/Error

この記事の要点
  • VBA のコード単位はプロシージャ。値を返さない Sub と返す Function の 2 種類
  • 変数宣言: Dim x As Long必ず Option Explicit をモジュール先頭に置いて宣言強制
  • コメントは ' (アポストロフィ)、改行 (行継続) は半角空白 + アンダースコア _
  • With ... End With で同じオブジェクトに複数操作。On Error GoTo でエラーハンドリング
  • 実行/デバッグ: F5 実行 / F8 ステップ実行 / F9 ブレークポイント / Debug.Print で出力

VBA の基本構造

VBA (Visual Basic for Applications) は Excel / Word / PowerPoint 等の Office アプリケーションを自動化するスクリプト言語です。コードはモジュール (Module) に書き、プロシージャと呼ばれる単位で実行されます。

' モジュール先頭で宣言強制
Option Explicit

' Sub プロシージャ (値を返さない)
Sub HelloWorld()
    MsgBox "Hello, World!"
End Sub

' Function プロシージャ (値を返す)
Function Add(a As Long, b As Long) As Long
    Add = a + b              ' 戻り値は関数名に代入
End Function

' 呼び出し例
Sub Main()
    HelloWorld
    Dim result As Long
    result = Add(3, 5)       ' = 8
    Debug.Print result
End Sub

Option Explicit と変数宣言

VBA は宣言なしでも変数を使えますが、タイプミスでバグになるため必ず Option Explicit をモジュール先頭に置きます。

Option Explicit

Sub VariableExamples()
    ' 単独宣言
    Dim i As Long
    Dim name As String
    Dim price As Currency
    Dim isReady As Boolean
    Dim today As Date

    ' 同一行で複数宣言 (型は個別指定が必要)
    Dim x As Long, y As Long, z As Long
    ' ⚠️ Dim x, y, z As Long  → x と y は Variant 型になる!

    ' 配列
    Dim arr(1 To 10) As Long          ' 1 〜 10
    Dim arr0(9) As Long               ' 0 〜 9 (既定)
    Dim dynArr() As String            ' 動的配列
    ReDim dynArr(5)                   ' 後でサイズ確保
    ReDim Preserve dynArr(10)         ' 内容保持して拡張

    ' 定数
    Const PI As Double = 3.14159
    Const APP_NAME As String = "MyApp"

    ' オブジェクト型
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
End Sub

主な型:

用途サイズ
Long整数 (-21億〜21億)4 byte
Integer整数 (-32768〜32767)。古い形式、Long 推奨2 byte
Double倍精度浮動小数8 byte
Currency固定小数点 (金額用)8 byte
String文字列可変
BooleanTrue / False2 byte
Date日付/時刻8 byte
Variant任意 (既定)16 byte+
Objectオブジェクト参照4/8 byte

コメントと改行

' これはコメント (アポストロフィ)
Rem これもコメント (古い書式、ほぼ使わない)

Dim total As Long
total = 100 + 200 + _
        300 + 400 + _       ' 行継続 (半角スペース + アンダースコア)
        500
Debug.Print total            ' → 1500

制御構文

' If
If score >= 80 Then
    grade = "A"
ElseIf score >= 60 Then
    grade = "B"
Else
    grade = "C"
End If

' 1 行 If (古い書式)
If score = 100 Then MsgBox "Perfect!"

' Select Case
Select Case grade
    Case "A"
        Debug.Print "優"
    Case "B", "C"
        Debug.Print "可"
    Case Is >= "D"          ' 比較演算子
        Debug.Print "不可"
    Case Else
        Debug.Print "?"
End Select

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

' Step 指定
For i = 10 To 1 Step -1
    Debug.Print i           ' 逆順
Next i

' For Each (コレクション)
Dim cell As Range
For Each cell In Range("A1:A10")
    cell.Value = cell.Value * 2
Next cell

' Do While / Loop
Dim n As Long: n = 1
Do While n <= 100
    n = n * 2
Loop

' Do Until
Do Until cell.Value = ""
    Set cell = cell.Offset(1)
Loop

' Exit For / Exit Do で途中抜け

With ... End With

同じオブジェクトに対する複数操作を簡潔に書ける構文。VBA らしさが最もよく現れる場面です。

' ❌ 冗長
Range("A1").Font.Name = "Meiryo"
Range("A1").Font.Size = 14
Range("A1").Font.Bold = True
Range("A1").Font.Color = RGB(255, 0, 0)
Range("A1").Interior.Color = RGB(255, 255, 0)

' ✅ With で簡潔
With Range("A1")
    With .Font
        .Name = "Meiryo"
        .Size = 14
        .Bold = True
        .Color = RGB(255, 0, 0)
    End With
    .Interior.Color = RGB(255, 255, 0)
End With

Range / Cells でセル操作

Sub CellAccess()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' 単一セル
    ws.Range("A1").Value = "Hello"
    ws.Cells(1, 1).Value = "Hello"        ' 行,列 で指定

    ' 範囲
    ws.Range("A1:C3").Value = "X"
    ws.Range(ws.Cells(1, 1), ws.Cells(3, 3)).Value = "X"

    ' 最終行取得
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 列全体
    ws.Columns("B").AutoFit

    ' 配列でまとめて書き込み (高速)
    Dim arr(1 To 1000, 1 To 1) As Long
    Dim i As Long
    For i = 1 To 1000: arr(i, 1) = i: Next i
    ws.Range("A1").Resize(1000, 1).Value = arr
End Sub

エラーハンドリング

Sub SafeDivide()
    On Error GoTo ErrorHandler

    Dim x As Double
    x = 10 / 0                       ' 実行時エラー: ゼロ除算

    Exit Sub                          ' 正常終了パス
ErrorHandler:
    MsgBox "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description
    Err.Clear
End Sub

' エラーを無視 (使い所注意)
Sub IgnoreError()
    On Error Resume Next
    Dim w As Worksheet
    Set w = ThisWorkbook.Worksheets("存在しないシート")
    If w Is Nothing Then
        MsgBox "シートが見つかりません"
    End If
    On Error GoTo 0                  ' エラートラップ解除
End Sub

命名規則 (推奨スタイル)

  • プロシージャ名: PascalCase (例: CalculateTotal)
  • 変数名: camelCase (例: totalAmount)
  • 定数名: UPPER_SNAKE_CASE (例: MAX_RETRY)
  • モジュール名: 機能を表す名詞 (例: FileUtil, SalesReport)
  • ハンガリアン記法 (strName, lngCount) は古い慣習、現代はあまり使わない

デバッグの基本

キー動作
F5マクロ実行
F8ステップイン (1 行ずつ実行)
Shift+F8ステップオーバー (Sub 呼出をまとめて実行)
F9ブレークポイント設定/解除
Ctrl+Gイミディエイトウィンドウ表示
Ctrl+Break実行中断
Debug.Print xイミディエイトに出力
Stop強制中断 (一時的ブレークポイント)

Excel オブジェクト階層

Application
 └ Workbook (Workbooks コレクション)
    └ Worksheet (Worksheets コレクション)
       ├ Range / Cells / Rows / Columns
       ├ Shape (図形)
       ├ ChartObject (グラフ)
       └ PivotTable

例:
Application.Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1")
→ ThisWorkbook.Worksheets("Sheet1").Range("A1") と省略可能

FAQ

Q: Dim a, b As Long と書いたら a が Variant 型だった
A: VBA の仕様です。Dim a As Long, b As Long のように変数ごとに型指定が必要です。

Q: マクロが遅い
A: 画面更新 Application.ScreenUpdating = False、自動計算 Application.Calculation = xlCalculationManual を冒頭で OFF にし、最後に戻すと劇的に高速化します。セル単位ではなく配列にまとめて代入するのも効果的。

Q: Set と単純代入の違いは?
A: オブジェクト型 (Range / Worksheet など) には Set が必要。プリミティブ型 (Long / String) には Set を付けません。