1.

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 を付けません。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 記述方法
  2. コメント
  3. 変数の宣言
  4. 関数
  5. 演算子
  6. 条件文
  7. 配列
  8. 連想配列
  9. ループ処理
  10. 非同期処理
  11. 同期処理
  12. 確認ウィンドウを表示する方法
  13. 文字の置換
  14. base urlを取得する方法
  15. formのsubmit前にjavascriptを呼び出す方法
  16. undefinedのイコール判定
  17. Javascript のみで form を post で submit する方法

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