クラスモジュールを使うためには、
定義したクラスを 「インスタンス化」=実体として生成 する必要があります。
VBA では New キーワードを使うことで
クラスを元にした“オブジェクト(実体)”を作ることができます。
Excel の Range や Workbook と同じ感覚で
自作クラスを使えるようになる重要なポイントです。
目次
1. インスタンスとは何か
「クラス」は 設計図 であり、
「インスタンス」は その設計図から作った実際に使えるオブジェクト です。
例えるなら:
- クラス … カタログに載っている家具の図
- インスタンス … 実際に部屋に置かれた家具
設計図そのものでは操作できませんが、
インスタンスを作ればプロパティやメソッドが使えるようになります。
2. New でインスタンスを作る基本構文
標準モジュールで以下のように記述します。
Dim obj As New クラス名
または、以下のように変数宣言と生成を分けることも可能です。
Dim obj As クラス名
Set obj = New クラス名
▼ 例:clsPerson クラスをインスタンス化する
クラスモジュール名:clsPerson
Option Explicit
Private pName As String
Property Let Name(value As String)
pName = value
End Property
Property Get Name() As String
Name = pName
End Property
Public Sub ShowGreeting()
MsgBox "こんにちは、" & pName & " です。"
End Sub
▼ 標準モジュール側のコード(インスタンス生成)
Sub TestNew()
Dim p As New clsPerson 'インスタンス生成
p.Name = "田中" 'プロパティに値をセット
p.ShowGreeting 'メソッドを実行
End Sub
結果:
「こんにちは、田中です。」と表示されます。
3. New の書き方と動作の違い
VBA の New には2種類の使い方があり、
微妙に動作が異なります。
① Dim ~ As New(暗黙的インスタンス化)
Dim p As New clsPerson
この書き方だと…
- プロパティやメソッドにアクセスしたタイミング
- または Set 文を使ったとき
に自動でインスタンスが生成されます。
メリット: 書き方が簡単
デメリット: 不要なタイミングでインスタンスが作られる可能性があり、処理の追跡がしづらい
② Dim ~ As ClassName → Set ~ = New(明示的インスタンス化)
Dim p As clsPerson
Set p = New clsPerson
メリット:
- いつ生成されたかが明確
- 実務的にはこちらが主流
- バグが出にくい
デメリット:
- 1行増える(ほぼデメリットではない)
実務では 常に明示的に New するのがおすすめ です。
4. Set を使わないといけない理由
VBA ではインスタンスを扱う変数は オブジェクト型 のため、
通常の代入と区別するために Set が必要です。
例:
Set p = New clsPerson
もし Set を付けずに書くと、
「型が一致しません」などのエラーになります。
5. 複数インスタンスの生成(業務でよく使うパターン)
クラスは何個でも生成できます。
Sub TestMulti()
Dim p1 As New clsPerson
Dim p2 As New clsPerson
p1.Name = "佐藤"
p2.Name = "鈴木"
p1.ShowGreeting
p2.ShowGreeting
End Sub
完全に独立したオブジェクトとして扱えるため、
顧客管理・計算処理・タスク管理などの実務でとても便利です。
6. まとめ
- New を使うとクラスからインスタンス(実体)を作れる
Dim obj As New クラス名(簡単・自動生成)Dim obj As クラス名→Set obj = New クラス名(明示的・実務向け)- Set はオブジェクト型を代入するときに必須
- インスタンスは複数生成でき、完全に独立して動作する
コメント