【VBA】クラスのインスタンス化方法の違い|Dim+SetとAs Newの使い分け

VBAでクラスを扱う際、インスタンスの生成方法には主に次の2つがあります。

  1. 変数宣言 → 後からインスタンス化(Dim + Set)
  2. 宣言と同時にインスタンス化(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 + SetDim 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 は安全で管理しやすい
  • 実務では「明示的なインスタンス化」が基本

コメント

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