みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるエクセルVBAのクラスモジュール」ということでシリーズをお送りします。
前回の記事はこちらです。
自作のコレクションに要素を追加するメソッドの作り方をお伝えしました。
追加するメソッドが作れましたので、今度は削除するメソッドを作ってみようと思います。
というとで、エクセルVBAで自作コレクションの要素を削除するメソッドの作り方です。
では、行ってみましょう!
前回のおさらい
では、前回のおさらいからです。
以下のエクセル表があったとして、これをクラスを使って扱おうというのがシリーズを通してのテーマとなっています。
それで、まずエクセル表の1行ずつのデータを表すクラスであるPersonを作成しました。
そのコードがこちらです。
Private id_ As String
Public FirstName As String
Public Gender As String
Public Birthday As Date
Public Sub Greet()
MsgBox Me.FirstName & "です、こんにちは!"
End Sub
Public Sub Initialize(ByVal values As Variant)
Select Case TypeName(values)
Case "Range"
id_ = values(1).Value
FirstName = values(2).Value
Gender = values(3).Value
Birthday = values(4).Value
Case "Variant()"
id_ = values(0)
FirstName = values(1)
Gender = values(2)
Birthday = values(3)
End Select
End Sub
Public Property Get IsMale() As Boolean
IsMale = (Me.Gender = "male")
End Property
Public Property Get Id() As String
Id = id_
End Property
Public Property Let Id(ByVal newId As String)
If id_ <> "" Then
Debug.Print "Idは上書きすることはできません"
Else
id_ = newId
End If
End Property
エクセル表の各フィールドを格納するプロパティのほか、いくつかのメンバーを追加しています。
前回は、InitializeメソッドをRangeオブジェクトでも、配列でも実行できるように変更しましたね。
そして、そのPersonクラスから生成したインスタンスをコレクション的に扱うのが、以下のPersonsクラスです。
Private items_ As Collection
Private Sub Class_Initialize()
Set items_ = New Collection
With Sheet1
Dim i As Long: i = 2
Do While .Cells(i, 1).Value <> ""
Me.Add .Range(.Cells(i, 1), .Cells(i, 4))
i = i + 1
Loop
End With
End Sub
Public Property Get Item(ByVal key As Variant) As Person
Set Item = items_.Item(key)
End Property
Public Function Add(ByVal values As Variant) As Person
Dim p As Person: Set p = New Person
p.Initialize values
items_.Add p, p.Id
Set Add = p
End Function
前回はAddメソッドを追加しましたので、それを検証するための標準モジュールがこちらです。
Sub MySub()
Dim myPersons As Persons: Set myPersons = New Persons
Dim p As Person
Set p = myPersons.Add(Array("a04", "Jay", "male", #7/7/1995#))
Stop
End Sub
ここしばらくは、こちらのPersonsクラスのほうにいろいろな機能を追加しているところですね。
自作のコレクションの要素を削除するメソッド
前回は、Personsクラスに要素を追加するAddメソッドを作成しました。
ということで、今回はその逆。
Personsコレクションから要素を削除するRemoveメソッドを作っていきたいと思います。
Collectionオブジェクトの要素を削除する
Personsクラスのコレクション機能は、蓋を開けてみるとCollection型のプライベート変数item_が担ってくれています。
ですから、item_が参照するCollectionオブジェクトから要素を削除してあげればよいわけですね。
Collectionオブジェクトから要素を削除するには、Removeメソッドを使えばOKです。
ここでキー、整数で順に割り振られているインデックスまたは、設定されていれば文字通りのキーでもOKです。
助かりますね。
自作コレクションのRemoveメソッドのコード
では、それを使ってPersonsクラスにRemoveメソッドを作りましょう。
コードはこちらです。
Public Sub Remove(ByVal key As Variant)
items_.Remove key
End Sub
おっと、シンプル!
整数型を受け取っても、文字列型を受け取っても処理ができるように、Variant型で引数を受け取るようにしています。
自作コレクションのRemoveメソッドの動作を確認
検証用のプロシージャを標準モジュールに書いて、自作コレクションの要素を削除するRemoveメソッドの動作確認をしてみましょう。
Sub MySub()
Dim myPersons As Persons: Set myPersons = New Persons
Dim p As Person
Set p = myPersons.Add(Array("a04", "Jay", "male", #7/7/1995#))
With myPersons
.Remove 2
.Remove "a01"
End With
Stop
End Sub
実行してStopステートメントの中断時のローカルウィンドウを見てみましょう。
初期状態のインデックス2の「Tom」と、IDが「a01」の「Bob」のデータが削除されていますね。
まとめ
以上、エクセルVBAで自作コレクションの要素を削除するメソッドの作り方をお伝えしました。
これまでの連載をご覧いただいていれば、今回の内容は簡単ですよね。
さて、次回はPersonクラスの内容をエクセル表に反映させるメソッドを作っていきます。
どうぞお楽しみに!
連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう
名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!- 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
- エクセルVBAでクラスに最も簡単なプロパティを追加する方法
- エクセルVBAで自作クラスをインスタンス化する方法
- エクセルVBAでクラスに最も簡単なメソッドを追加する方法
- エクセルVBAで表の1行分のデータを表すクラスを作成する方法
- エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
- エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
- エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
- エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
- エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
- エクセルVBAでインスタンスの集合をコレクション化する方法
- エクセルVBAでコレクション化したインスタンスを取り出す方法
- エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
- エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
- エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
- エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
- エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
- エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
- エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット