【VBA】New を使ったインスタンス生成|クラスの実体化と使い方の基本

クラスモジュールを使うためには、
定義したクラスを 「インスタンス化」=実体として生成 する必要があります。

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 はオブジェクト型を代入するときに必須
  • インスタンスは複数生成でき、完全に独立して動作する

コメント

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