[VBA]Collectionから指定した要素を削除する関数

2022年3月20日

概要

VBAのCollectionのRemove関数は、インデックス指定による削除しか対応していなかったため、値指定で削除できる関数を作成しました。なお、VBAは値型とオブジェクト型で等価演算子が異なるため、作成した関数には3つのバリエーションがあります。1つ目は、1つのCollectionに値型とオブジェクトが混在している場合に使用するRemoveCollectionItem関数、2つ目は、オブジェクト型のみを含む場合に使用するRemoveCollectionObject関数、3つ目は、値型のみを含む場合に使用するRemoveCollectionValue関数です。3つの違いがよく分からない場合は、1つ目のRemoveCollectionItem関数のみをしようすると良いでしょう。

コード

' [VBA]Collectionから指定した要素を削除する関数 
' Copyright (c) 2020-2024  黒箱 
' This software is released under the MIT License;. 
' このソフトウェアはMITライセンスの下でリリースされています。 


'* @fn Public Function RemoveCollectionItem(ByVal Collection As Collection, ByVal Target As Variant) As Long
'* @brief コレクションの中から、引数で指定した値又はオブジェクトと一致する要素を削除します。
'* @param[in] Collection 削除したい要素を含むコレクション
'* @param[in] Target 削除する値又はオブジェクト
'* @return Long 要素を削除した場合は削除した要素のインデックスを返し、それ以外の場合は0を返します。
'* @details コレクションにTargetと一致する要素が複数含まれている場合、コレクションを前方から検索して最初に一致した要素を削除します。コレクションの要素が全て値型の場合はRemoveCollectionValueを、オブジェクトの場合はRemoveCollectionObjectを使用してください。
Public Function RemoveCollectionItem(ByVal Collection As Collection, ByVal Target As Variant) As Long

    Dim Index As Long
    Dim e As Variant
    
    If (IsObject(Target)) Then
        For Each e In Collection
            Index = Index + 1
            If (IsObject(e)) Then
                If (e Is Target) Then
                    Call Collection.Remove(Index)
                    RemoveCollectionItem = Index
                    Exit Function
                End If
            End If
        Next
        
    Else
        For Each e In Collection
            Index = Index + 1
            If Not (IsObject(e)) Then
                If (e = Target) Then
                    RemoveCollectionItem = Index
                    Call Collection.Remove(Index)
                    Exit Function
                End If
            End If
        Next
    
    End If
    
    RemoveCollectionItem = 0
    
    Exit Function
End Function


'* @fn Public Sub RemoveCollectionObject(ByVal Collection As Collection, ByVal Target As Object)
'* @brief コレクションの中から、引数で指定したオブジェクトと一致する要素を削除します。
'* @param[in] Collection 削除したい要素を含むコレクション
'* @param[in] Target 削除するオブジェクト
'* @return Long 要素を削除した場合は削除した要素のインデックスを返し、それ以外の場合は0を返します。
'* @details コレクションにTargetと一致する要素が複数含まれている場合、コレクションを前方から検索して最初に一致した要素を削除します。コレクションに値型とオブジェクトの両方が含まれている場合はRemoveCollectionを使用してください。
Public Function RemoveCollectionObject(ByVal Collection As Collection, ByVal Target As Object) As Long

    Dim Index As Long
    Dim e As Object
    For Each e In Collection
        Index = Index + 1
        If (e Is Target) Then
            Call Collection.Remove(Index)
            RemoveCollectionObject = Index
            Exit Function
        End If
    Next
        
    RemoveCollectionObject = 0

End Function



'* @fn Public Public Function RemoveCollectionValue(ByVal Collection As Collection, Target As Variant) As Long
'* @brief コレクションの中から、引数で指定した値と一致する要素を削除します。
'* @param[in] Collection 削除したい要素を含むコレクション
'* @param[in] Target 削除する値
'* @return Long 要素を削除した場合は削除した要素のインデックスを返し、それ以外の場合は0を返します。
'* @details コレクションにTargetと一致する要素が複数含まれている場合、コレクションを前方から検索して最初に一致した要素を削除します。コレクションに値型とオブジェクトの両方が含まれている場合はRemoveCollectionを使用してください。
Public Function RemoveCollectionValue(ByVal Collection As Collection, Target As Variant) As Long

    Dim Index As Long
    Dim e As Variant
    For Each e In Collection
        Index = Index + 1
        If (e = Target) Then
            Call Collection.Remove(Index)
            Exit Function
        End If
    Next
    
    RemoveCollectionValue = 0

End Function

プログラムの利用について

本プログラムのライセンスは「The MIT License」を適用しています。

本プログラムは無償で利用できますが、本プログラム内の著作権表示及びライセンス表示は削除せずに表示しておいて下さい。

必須ではございませんが、本ホームページのプログラムを書籍またはホームページ等で一般公開したい方は、お問い合わせフォームよりご連絡頂けると幸いです。

スポンサーリンク