本ページには広告が含まれています。

Excel VBA クラス コレクション要素の追加と削除(Lv.14)

画像はCanva「Text to Image」で生成しました

「Excel VBAのクラス」についての第14回目です。前回の内容は「コレクション化されたインスタンスから要素を取り出す方法」でした。今回は、コレクション化されたインスタンスに対する要素の追加「Addメソッド」と削除「Removeメソッド」についてです。

くるみこ
くるみこ

「Addメソッド」は、コレクション化する際に使っていますが、後から要素を追加する場合にも「Addメソッド」を使います。あわせて削除する必要も発生すると思います。今回は「追加」と「削除」する方法について勉強しょう(^^)

わかりました。今回もよろしくお願いしますm(_ _)m

スポンサーリンク

はじめに

再び「Collectionオブジェクト」のメンバー(プロパティとメソッド)を確認しておきます。

メンバー説明
Count プロパティ要素の個数(Long)を返します。値の取得のみ可能です。
Add メソッド要素を追加します。
Item メソッド要素を返(取得)します。
Romove メソッド要素を削除します。

「追加」と「削除」ですから、今回使うのは AddメソッドRemoveメソッド です。

それでは、その具体的な方法についてみていきましょう。

【この記事でわかること
Excel VBA でコレクション化されたインスタンス要素の追加と削除の方法

 1 Addメソッドで要素を新たに追加する方法
 2 Removeメソッドで要素を削除する方法

使用する表データは今回も同じですが、追加する要素が見えるように11行目に置いてます。

インスタンスをコレクション化する表データの画像

この記事で使用したサンプルファイルを登録しています。リンク先からご利用ください。

コレクション化されたインスタンス要素の追加と削除

これまで設定してきたクラスは次の2つです。

  • Class1」(名前がデフォルトのまま)クラスは、プロパティ設定とコンストラクタ直後に実行するに各プロパティを設定するメソッドを設定しています。
  • clsCol」クラスでは、インスタンスをコレクション化するコンストラクタを設定しています。

すでにコレクション化されているインスタンスに要素を追加するには次のステップで処理を行います。

  1. Class1」で追加する要素の各プロパティーを設定してインスタンス化します。
  2. clsCol」でコレクションに「Collectionオブジェクト」のAddメソッドで要素を追加します。

この追加する手順を、クラスのメソッド(プロシージャ)として設定することとします。

クラスに「itemAddメソッド」を追加する

ということで、コレクション設定用の「clsCol」クラスモジュールに、新たに要素を追加する「itemAddメソッド」を作成していきます。

'要素を追加するメソッド
Public Function itemAdd(ByVal rng As Range) As Class1
  Dim owner As Class1
  Dim res As Integer
  
  '追加要素の各プロパティ設定用メソッドへ
  Set owner = New Class1: owner.Init1 rng
  Set owner.Pet = New Class1: owner.Pet.Init2 rng
Re:
  On Error Resume Next
  'コレクションに追加要素のインスタンスを追加
  mycol.Add owner, owner.ID
  'Key重複はエラーで登録できない旨メッセージする
  If Err.Number <> 0 Then
    res = MsgBox("""" & owner.ID & """" & _
          "は重複しています!上書きしますか?" _
          , vbOKCancel)
    Err.Clear
    If res = vbOK Then
      '上書の場合は元Itemは削除して再設定する
      itemRemove (owner.ID): GoTo Re
    End If
  End If
End Function

【コード補足】

  • 2行目、引数は Range オブジェクトにしています。理由はシートの表データをインスタンス化する際にRangeオブジェクトを使ったからです。型が同じなら変換の必要が無いので(^^;
  • 7~8行目、インスタンスを作成してRangeオブジェクトをプロパティを設定するメソッド(Init1Init2)に渡しています。
  • 10行目、Addメソッド実行前に On Error Resume Next でエラー発生を無視するようにしています。コレクションは Key が重複した場合エラーで中断してしまうので、それを回避するようにしています。
  • 12行目で、コレクションに Addメソッドで要素を追加します。
  • 14行目は、Err.Number <> 0 でエラーが発生したか調べています。追加しようとした ItemKey がすでにコレクションに登録済みだった場合、エラーが発生します。コレクションはKeyの重複(上書き)は出来ない仕様です。
  • 15行目、重複があった場合は、上書きするかどうか確認するようにしています。上書きしない場合は「キャンセル」で中止し、Key を変更してから再度追加処理を行います。
  • 21行目、上書きする場合は、既存Keyを一旦削除してから再登録する必要があります。削除用のメソッド itemRemove (owner.ID) で既存Keyを削除して、再登録するようにしています。
重複しているKeyを追加しようとして表示されるエラーメッセージ
  • 上書きするということは、Key データを書き換えるということです。

クラスに「itemRemoveメソッド」を追加する

clsCol」クラスモジュールに、要素を削除する「itemRemoveメソッド」がこちらです。

'要素を削除するメソッド
Public Sub itemRemove(ByVal key As Variant)
    mycol.Remove key
End Sub

これは説明の必要はありませんね。

ただ、Item1 を削除した場合、Item2Item1 にというように ItemのIDが変更になることを覚えておきましょう。追加した要素は最後の ItemIDに登録されます。

コレクションの要素(Item)を削除すると同時にインスタンスも削除されます。

標準モジュール側のコード

'標準モジュール
Sub rngCollectionTest()
  Dim table As clsCol
  'インスタンス作成⇒コンストラクタ起動
  Set table = New clsCol

  'コレクションに要素を追加する
  Call ColAddItem(table)

End Sub

次のプロシージャを Call して呼び出す設定です。

コレクションに新たな要素を追加するプロシージャ

'コレクションに要素を追加する
Sub ColAddItem(ByVal table As clsCol)
  Dim item As Class1
  Dim rng As Range
  Dim r As Long, c As Long
redo:
  On Error Resume Next
  Set rng = Application.InputBox(Prompt:= _
    "追加要素のKeyセルを単一で選択してください!", _
    Title:="追加要素を指定", Type:=8)
  On Error GoTo 0
  If rng Is Nothing Then Exit Sub
  '選択されたセルが単一かを判定
  If rng.Cells.Count = 1 Then
    r = rng.Row     '選択セルの行番号
    c = rng.Column  '選択セルの列番号
    Set rng = Range(Cells(r, c), Cells(r, c + 6))
    Set item = table.itemAdd(rng)
  Else
    MsgBox "セルの選択が単一ではありません!" & _
          vbCrLf & "もう一度選択し直してください。"
    GoTo redo
  End If
End Sub
設定したApplication.InputBoxのダイアログ

【コード補足】

  • 8行目、Application.InputBoxType:=8 でセルを選択指定する設定(Rangeオブジェクト)にしています。選択するセルは Key のセルです。
  • 14行目の rng.Cells.Count = 1 は、選択させた rng のセル数をカウントして単一セルかどうかチェックしています。
  • 15~17行目で、rng を Keyセルを基準にプロパティ数分の範囲に設定し直しています。
  • 18行目の Set item = table.itemAdd(rng) で要素を追加するメソッドに処理を渡しています。
  • 20行目は、セルの選択が間違っていた場合、メッセージしてやり直させる設定です。
Keyのセル選択が複数選択になっていた場合のメッセージ

まとめ(おわりに)

以上、Excel VBA クラスでコレクション化しているインスタンスの要素を「追加」する方法と「削除」する方法について紹介しました。

くるみこ
くるみこ

クラスの14回目はいかがでしたか。コレクション化されたインスタンスの集合に、新しい要素を「追加」する手順は理解できましたか?

はい。新しい要素を「追加」する手順は、まず追加する要素をインスタンス化してから、コレクションに Addメソッドで追加します。ただし、コレクションは Key の重複ができないので、どうしても追加する場合は既存の Key削除してから追加し直すか、Key を変更してから追加します。こんな理解でいいでしょうか(^^)

くるみこ
くるみこ

そうですね。よく理解できていると思ます。
あらかじめ Key がわかっていれば重複させませんので、Key が重複する場合というのは、Key のデータ内容を変更したい場合ということですね。

まとめ

最後に、今回勉強した内容を整理しておきましょう。

Excel VBA クラスでコレクション化されたインスタンス要素の追加と削除の方法

【追加方法(手順)】

  1. 追加する要素の各プロパティーを設定してインスタンス化します。
  2. コレクションに Addメソッドで要素を追加します。
  3. コレクションは Key の重複は出来ないので、上書きしたい場合は「削除」してから追加するようにします。上書きしたくない場合は、Key を変更してから追加します。

【削除方法】

  • 「削除」は Removeメソッドでコレクションから Key を削除します。
  • コレクションから削除すると、同時にインスタンスも削除されます。

このようにして変更されたコレクションの内容は、そのままではExcel(VBA)が終了すると破棄されてしまいます。次回は、この変更されたコレクションの内容をシートに書き出す方法についてです。

Excel VBA クラスについての記事一覧

Excel VBA クラスの作成・使い方について(Lv.1)
Excel VBA クラスのプロパティ設定について(Lv.2)
Excel VBA クラスにメソッドを設定する方法(Lv.3)
Excel VBA クラスをインスタンス化する方法(Lv.4)
Excel VBA クラス Propertyプロシージャ(Lv.5)
Excel VBA クラス Property Getプロシージャ(Lv.6)
Excel VBA クラス Property Letプロシージャ(Lv.7)
Excel VBA クラス Property Setプロシージャ(Lv.8)
Excel VBA シートの表データからクラスを作成 (Lv.9)
Excel VBA クラス インスタンスをコレクション化(Lv.10)
Excel VBA クラス コンストラクタとデストラクタ(Lv.11)
Excel VBA クラス コンストラクタを利用する方法(Lv.12)
Excel VBA クラス コレクションの要素取得方法(Lv.13)
Excel VBA クラス コレクション要素の追加と削除(Lv.14)
Excel VBA クラス コレクションの内容を書き出す(Lv.15)
Excel VBA クラス UserFormで機能を操作する(Lv.16)
Excel VBA クラス コレクションの最大要素数について(Lv.17)

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク

記事のサンプルファイルをダウンロードできます

この記事で使用したサンプルファイルを登録しました。リンク先からご利用ください。

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください