エクセルVBAで自作コレクションの要素を削除するメソッドの作り方


remove

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるエクセルVBAのクラスモジュール」ということでシリーズをお送りします。

前回の記事はこちらです。

エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載をしております。今回は、エクセルVBAで自作のコレクションに要素を追加するAddメソッドを作成する方法について見ていきます。

自作のコレクションに要素を追加するメソッドの作り方をお伝えしました。

追加するメソッドが作れましたので、今度は削除するメソッドを作ってみようと思います。

というとで、エクセル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です。

Collectionオブジェクト.Remove キー

ここでキー、整数で順に割り振られているインデックスまたは、設定されていれば文字通りのキーでも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でクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
  9. エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
  10. エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
  11. エクセルVBAでインスタンスの集合をコレクション化する方法
  12. エクセルVBAでコレクション化したインスタンスを取り出す方法
  13. エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
  14. エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
  15. エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
  16. エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
  17. エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
  18. エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
  19. エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

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