「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」クラスでは、インスタンスをコレクション化するコンストラクタを設定しています。
すでにコレクション化されているインスタンスに要素を追加するには次のステップで処理を行います。
- 「Class1」で追加する要素の各プロパティーを設定してインスタンス化します。
- 「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オブジェクトをプロパティを設定するメソッド(Init1とInit2)に渡しています。
- 10行目、Addメソッド実行前に On Error Resume Next でエラー発生を無視するようにしています。コレクションは Key が重複した場合エラーで中断してしまうので、それを回避するようにしています。
- 12行目で、コレクションに Addメソッドで要素を追加します。
- 14行目は、Err.Number <> 0 でエラーが発生したか調べています。追加しようとした Item の Key がすでにコレクションに登録済みだった場合、エラーが発生します。コレクションはKeyの重複(上書き)は出来ない仕様です。
- 15行目、重複があった場合は、上書きするかどうか確認するようにしています。上書きしない場合は「キャンセル」で中止し、Key を変更してから再度追加処理を行います。
- 21行目、上書きする場合は、既存Keyを一旦削除してから再登録する必要があります。削除用のメソッド itemRemove (owner.ID) で既存Keyを削除して、再登録するようにしています。
- 上書きするということは、Key データを書き換えるということです。
クラスに「itemRemoveメソッド」を追加する
「clsCol」クラスモジュールに、要素を削除する「itemRemoveメソッド」がこちらです。
'要素を削除するメソッド
Public Sub itemRemove(ByVal key As Variant)
mycol.Remove key
End Sub
これは説明の必要はありませんね。
ただ、Item1 を削除した場合、Item2 が Item1 にというように 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
【コード補足】
- 8行目、Application.InputBox の Type:=8 でセルを選択指定する設定(Rangeオブジェクト)にしています。選択するセルは Key のセルです。
- 14行目の rng.Cells.Count = 1 は、選択させた rng のセル数をカウントして単一セルかどうかチェックしています。
- 15~17行目で、rng を Keyセルを基準にプロパティ数分の範囲に設定し直しています。
- 18行目の Set item = table.itemAdd(rng) で要素を追加するメソッドに処理を渡しています。
- 20行目は、セルの選択が間違っていた場合、メッセージしてやり直させる設定です。
まとめ(おわりに)
以上、Excel VBA クラスでコレクション化しているインスタンスの要素を「追加」する方法と「削除」する方法について紹介しました。
クラスの14回目はいかがでしたか。コレクション化されたインスタンスの集合に、新しい要素を「追加」する手順は理解できましたか?
はい。新しい要素を「追加」する手順は、まず追加する要素をインスタンス化してから、コレクションに Addメソッドで追加します。ただし、コレクションは Key の重複ができないので、どうしても追加する場合は既存の Key を削除してから追加し直すか、Key を変更してから追加します。こんな理解でいいでしょうか(^^)
そうですね。よく理解できていると思ます。
あらかじめ Key がわかっていれば重複させませんので、Key が重複する場合というのは、Key のデータ内容を変更したい場合ということですね。
まとめ
最後に、今回勉強した内容を整理しておきましょう。
このようにして変更されたコレクションの内容は、そのままではExcel(VBA)が終了すると破棄されてしまいます。次回は、この変更されたコレクションの内容をシートに書き出す方法についてです。
Excel VBA クラスについての記事一覧
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
記事のサンプルファイルをダウンロードできます
この記事で使用したサンプルファイルを登録しました。リンク先からご利用ください。
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください