VBAでクラスを扱う際、インスタンスの生成方法には主に次の2つがあります。
- 変数宣言 → 後からインスタンス化(Dim + Set)
- 宣言と同時にインスタンス化(As New)
一見似ていますが、挙動・使いどころ・保守性 に大きな違いがあります。 本記事では、それぞれの特徴と実務での使い分けをわかりやすく解説します。
目次
1. 変数宣言してからインスタンス化する方法(Dim + Set)
■ 基本構文
Dim obj As clsSample
Set obj = New clsSample
■ 特徴
- 宣言と生成が分離されている
- Set のタイミングでインスタンスが作成される
■ メリット
① インスタンス生成のタイミングを制御できる
Dim obj As clsSample
If 条件 Then
Set obj = New clsSample
End If
👉 必要な場合のみ生成できる
② 再生成・解放が可能
Set obj = Nothing
Set obj = New clsSample
👉 状態リセットができる
③ エラー制御がしやすい
On Error Resume Next
Set obj = New clsSample
If obj Is Nothing Then
MsgBox "生成失敗"
End If
■ デメリット
- Set を忘れると実行時エラーになる
Dim obj As clsSample
obj.Method '← 実行時エラー
2. 宣言と同時にインスタンス化する方法(As New)
■ 基本構文
Dim obj As New clsSample
■ 特徴
- 遅延初期化(Lazy Initialization) → 初めて使用したときに自動でインスタンス生成
■ メリット
① コードがシンプル
obj.Method 'Set 不要
② 初心者でも扱いやすい
👉 宣言した瞬間から「使えるように見える」
■ デメリット(重要)
③ インスタンス生成タイミングが不明確
Dim obj As New clsSample
'この時点では未生成
obj.Method '← ここで生成
④ Nothing にしても再生成される
Set obj = Nothing
obj.Method '← 再生成される
👉 意図しない動作になりやすい
⑤ デバッグしづらい
- いつ生成されたか分かりにくい
- 内部的に毎回チェックが入る
⑥ ライフサイクル管理が困難
👉 実務ではバグの原因になりやすい
3. 2つの違いまとめ
| 項目 | Dim + Set | Dim As New |
|---|---|---|
| 初期化タイミング | 明示的 | 自動(遅延) |
| 可読性 | ◎ | ○ |
| 安全性 | ◎ | △ |
| 再利用性 | ◎ | △ |
| デバッグ性 | ◎ | △ |
| 手軽さ | △ | ◎ |
4. 実務でのおすすめ
■ 結論
👉 実務では「Dim + Set」を使うのが基本
Dim obj As clsSample
Set obj = New clsSample
■ 理由
- 挙動が明確でバグが起きにくい
- インスタンス管理がしやすい
- 保守性が高い
■ As New を使ってもよいケース
- 簡単なマクロ
- テストコード
- 一時的な処理
5. 実務でよくある初期化パターン
Dim user As clsUser
Set user = New clsUser
user.Init "田中"
👉 初期化処理を明示的に書けるため、実務向き
6. まとめ
- Dim As New は便利だが挙動が分かりづらい
- Dim + Set は安全で管理しやすい
- 実務では「明示的なインスタンス化」が基本
コメント