[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」を適用しています。
本プログラムは無償で利用できますが、本プログラム内の著作権表示及びライセンス表示は削除せずに表示しておいて下さい。
必須ではございませんが、本ホームページのプログラムを書籍またはホームページ等で一般公開したい方は、お問い合わせフォームよりご連絡頂けると幸いです。
スポンサーリンク
VBACollection,MITライセンス,ソースコード
Posted by 黒箱
この記事のトラックバックURL
スポンサーリンク
カテゴリー
スポンサーリンク
-
ホーム -
上へ
PAGE TOP
ディスカッション
コメント一覧
まだ、コメントがありません