よくある困りごと
Dim a1 As String, a2 As String, …
が延々と続く- 引数が多すぎて関数呼び出しが読めない
- どの変数がどの用途か分からなくなる
結論
変数を“意味のまとまり”で束ねる・数を減らす・スコープを絞る。この3点で一気に読みやすくなります。
基本の方針(3つだけ)
- 同じ種類の値は配列/コレクションへ
- 関連する値はひとまとめ(UDTまたはクラス)
- 引数が多いなら“パラメータ入れ物”を作る

対処法①:末尾番号の乱立は配列・コレクション化
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分でできる“今日のリファクタ”
- 末尾番号の変数を検索 → 配列/Dictionaryへ
- フィールドが3つ以上セットで動く → UDT化
- 引数が7個以上 → パラメータ入れ物作成
2
や"A"
などの“謎値” → Enum/Const化- 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などを見たときに卒倒しそうになっても大丈夫?だと思います笑