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

概要

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

コード

Option Explicit

'* @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

ソースコードの利用について

本ソースコードは「GPL v3.0(GNU General Public License Version 3.0)」ライセンスで利用可能です。

本ソースコードを私的に利用される方は、本ソースコードが無料で利用できると考えて差し支え御座いません。下記の著作権表示をソースコード内に表示して頂ければ幸いです。

Copyright © 2017 黒い箱の中 All Rights Reserved.(https://kuroihako.com/)

本ホームページのソースコードを利用したソフトウェアを商用利用したり、ホームページ等で一般公開する方は、本ホームページのソフトウェアまたはソースコードに適用されているライセンスをご理解頂いてからご使用ください。同ライセンス以外での利用をご希望の方はお問い合わせフォームよりご連絡下さい。