VBA|変数が多すぎる時のシンプル対処法

Japanese

よくある困りごと

  • Dim a1 As String, a2 As String, … が延々と続く
  • 引数が多すぎて関数呼び出しが読めない
  • どの変数がどの用途か分からなくなる

結論

変数を“意味のまとまり”で束ねる・数を減らす・スコープを絞る。この3点で一気に読みやすくなります。


基本の方針(3つだけ)

  1. 同じ種類の値は配列/コレクションへ
  2. 関連する値はひとまとめ(UDTまたはクラス)
  3. 引数が多いなら“パラメータ入れ物”を作る

対処法①:末尾番号の乱立は配列・コレクション化

Before

Dim Item1 As String
Dim Item2 As String
Dim Item3 As String
Item1 = "りんご": Item2 = "みかん": Item3 = "ぶどう"

After(配列)

Dim items() As String
ReDim items(1 To 3)
items(1) = "りんご": items(2) = "みかん": items(3) = "ぶどう"

After(Dictionaryでキー管理)

Set dic = CreateObject("Scripting.Dictionary")
dic("A001") = "りんご"
dic("A002") = "みかん"

ポイント:番号付き変数は“配列・辞書のサイン”。迷わず置換。


対処法②:関連する値はユーザー定義型(UDT)に束ねる

Before

Dim ProductId As String, ProductName As String
Dim Price As Currency, Stock As Long

After(UDT)

' 標準モジュールの先頭あたりに定義
Public Type TProduct
    Id As String
    Name As String
    Price As Currency
    Stock As Long
End Type
' 使う側
Dim p As TProduct
p.Id = "A001": p.Name = "りんご": p.Price = 120: p.Stock = 50

メリット:補完が効く/関連が見える/配列化も簡単(Dim arr() As TProduct)。


対処法③:引数が多い関数は“パラメータ入れ物”でスッキリ

Before

Call ExportReport(path, fromDate, toDate, fmt, user, dept, isDraft)

After(UDTで入れ物化)

Public Type TExportParam
    Path As String
    FromDate As Date
    ToDate As Date
    Format As String
    User As String
    Dept As String
    IsDraft As Boolean
End Type
Dim prm As TExportParam
prm.Path = "C:\out": prm.FromDate = Date: prm.ToDate = Date
prm.Format = "PDF": prm.User = "tanaka": prm.Dept = "Sales": prm.IsDraft = False
Call ExportReport(prm)

効果:呼び出しが自己文書化。順番入れ替えにも強い。


対処法④:グローバル変数を減らす(スコープを絞る)

  • まずローカルに閉じ込める
  • どうしても共有したいならモジュールPrivate + Getter/Setter
' StateModule.bas
Private mCurrentUser As String
Public Sub SetCurrentUser(ByVal v As String): mCurrentUser = v: End Sub
Public Function CurrentUser() As String: CurrentUser = mCurrentUser: End Function

副作用の源を一箇所に集約。


対処法⑤:意味不明な数字はEnum/Constに

Before

If status = 2 Then ' 2って何?

After

Public Enum OrderStatus
    osNew = 1
    osProcessing = 2
    osDone = 3
End Enum
If status = osProcessing Then

読みやすさが段違い。補完も効く。


1分でできる“今日のリファクタ”

  1. 末尾番号の変数を検索 → 配列/Dictionary
  2. フィールドが3つ以上セットで動く → UDT化
  3. 引数が7個以上 → パラメータ入れ物作成
  4. 2"A" などの“謎値” → Enum/Const
  5. Option Explicit を有効化(未宣言ミスを防止)

小さな実例:全部盛りミニサンプル

' 定義
Public Type TLine
    Code As String
    Qty As Long
    UnitPrice As Currency
End Type
Public Enum ExportFormat
    fmtPDF = 1
    fmtCSV = 2
End Enum
' 使う
Dim lines() As TLine: ReDim lines(1 To 2)
lines(1).Code = "A001": lines(1).Qty = 3: lines(1).UnitPrice = 120
lines(2).Code = "B010": lines(2).Qty = 2: lines(2).UnitPrice = 450
' 合計
Dim i As Long, total As Currency
For i = LBound(lines) To UBound(lines)
    total = total + lines(i).Qty * lines(i).UnitPrice
Next
Debug.Print total  ' 1260

まとめ(これだけ覚えればOK)

  • 番号付き変数は配列/Dictionary
  • 関連値は**UDT(Type)**で束ねる
  • 引数だらけはパラメータ入れ物で解消
  • スコープは最小、意味はEnum/Constで可視化

これらを実践するだけでかなり変数を簡単かつ沢山宣言することができます。
既に作成されているPGなどを見たときに卒倒しそうになっても大丈夫?だと思います笑

タイトルとURLをコピーしました