配列

【VBA】配列の要素の値を指定して削除する関数

記事内に商品プロモーションを含む場合があります

こんにちはhokkyokunです。

配列の要素を指定してその値を削除する関数を作成しました。

配列の位置を指定して削除する関数はこちら↓です。

【VBA】配列の位置を指定して要素を削除する関数 わかること 配列の要素を位置を指定して削除できます。○○番目の要素を削除 (例)配列[a,b,c,d]「0」指定(先頭) [a...

例えば、[リンゴ、バナナ、パイナップル、イチゴ]という配列があり、2番目の値(ここではバナナ)を削除したい場合はこちら↑の記事をご参照ください。

プログラミング代行いたします。

Python・VBAのコード対応です。

【VBA】
エクセルの自動処理全般

【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)

ココナラで依頼を受けておりますので、お気軽にご相談ください。

依頼はこちらから

ココナラの会員登録がまだの方↓

無料登録はこちら

VBAを学習するには、動画プラットフォームUdemyがおすすめです。
Udemyの公式サイトはこちらです。

注意点

以下のサブ関数を使っています。

Function addElm(ByRef arrs As Variant, ByVal elm As Variant, Optional order As Long = -1)
    Dim num As Long
    Dim arr As Variant
    Dim i As Long
    Dim a As Variant
    
    'エラー判定
    On Error GoTo err
    a = arrs(0)
    
    'エラーを起こす=配列が空→要素を一つ追加して終了
err:
    If err.Number = 9 Or err.Number = 13 Then
        ReDim arrs(0)
        arrs(0) = elm
        Exit Function
    End If
    
    
    'エラーを起こさない=配列が空ではない→orderの順番で入れる位置を決める
    'orderが-1以下、もしくは、配列の要素数を超える数値の場合、末尾に追加
    num = UBound(arrs)
    If order <= -1 Or order > num Then
        ReDim Preserve arrs(num + 1)
        arrs(num + 1) = elm
        
    'orderが0~要素数までの値の場合その位置に要素を入れる
    Else
        ReDim results(num + 1)
        For Each arr In arrs
            If i = order Then
                results(i) = elm
                i = i + 1
                results(i) = arr
            Else
                results(i) = arr
            End If
            i = i + 1
        Next
        arrs = results
    End If

End Function

詳細は省略しますが、この関数を使うことで、配列に要素簡単に追加することができます。

詳しくは以下の記事をご確認よろしくお願い致します。

【VBA】配列に要素を追加する関数(任意の位置に対応可能) わかること 配列に簡単に要素を追加できる関数のコードとその使い方 こんにちはhokkyokunです。 配列の関数をいくつ...
【VBA】配列が空の状態のバリエーションと空の状態を判定する関数 わかること VBAの配列が空の状態になる、そのバリエーションを解説 動的配列で宣言すると配列が空という扱い。エラーになる 静...

removeElm関数

特定の要素のうち、最初に現れた分を削除します。

  • 関数名
    removeElm( arrs , elm,All)
  • 引数
    詳細は下記
  • 戻り値
    なし(配列から特定の要素のうち、最初に現れた一つを削除されています。)
# 引数 データ型 内容
arrs Variant 対象とする配列
elm Variant 削除したい要素の値
All Bool 省略可(その場合False)
Trueの場合、①の配列から②の要素をすべて削除
Function removeElm(ByRef arrs As Variant, ByVal elm As Variant, Optional All As Boolean = False)
    Dim arr As Variant
    Dim results As Variant  '削除後の配列。これを求める。
    Dim i As Long
    Dim targetNum As Long
    
    'エラー判定
    Dim a As Variant
    On Error GoTo err
    a = arrs(0)
    
    'エラーを起こす=配列が空→何もせずに終了
err:
    If err.Number = 9 Or err.Number = 13 Then
        Exit Function
    End If
    
    
    
    If Not All Then
        '====================================================
        '特定の要素のうち、最初に出てきた要素だけ削除する
        '
        '====================================================
        '配列の要素を一つずつ確認する。
        '特定の要素が現れたらFor文を抜けて次の処理に向かう
        '特定の要素が現れる前の要素は全てresultsに入れる
        For Each arr In arrs
            If arr <> elm Then
                Call addElm(results, arr)
                i = i + 1
                
            Else
                i = i + 1
                Exit For
            End If
        Next
        targetNum = i
        '特定の要素が現れた位置プラス1以降の処理です。
        '問答無用でresultsに格納する
        
        For i = targetNum To UBound(arrs)
            Call addElm(results, arrs(i))
        Next i
        
    Else
        '====================================================
        '特定の要素をすべて削除する
        '
        '====================================================
        For Each arr In arrs
            If arr <> elm Then
                Call addElm(results, arr)
            End If
        Next
        
    End If
    arrs = results
    
End Function

実際に使用①【全削除】

実際に使ってみます。

[リンゴ, バナナ, イチゴ, パイナップル, イチゴ, イチゴ, メロン, リンゴ]という配列を考えてみます。

リンゴが2個、イチゴが3個重複して入っています。
このような配列で特定の要素を全削除してみます。

  • バナナ(重複なし)を削除
  • リンゴ(2個重複)を削除

バナナ(重複なし)を全削除

Sub testArray1()
    
    Dim arrs As Variant
    arrs = Array("リンゴ", "バナナ", "イチゴ", "パイナップル", "イチゴ", "イチゴ", "メロン", "リンゴ")
    
    Call removeElm(arrs, "バナナ", True)
    
    Debug.Print "============================="
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '=============================
    'リンゴ
    'イチゴ
    'パイナップル
    'イチゴ
    'イチゴ
    'メロン
    'リンゴ
    '============================
    
End Sub

リンゴ(2個重複)を全削除

Sub testArray2()
    
    Dim arrs As Variant
    arrs = Array("リンゴ", "バナナ", "イチゴ", "パイナップル", "イチゴ", "イチゴ", "メロン", "リンゴ")
    
    Call removeElm(arrs, "リンゴ", True)
    
    Debug.Print "============================="
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '=============================
    'バナナ
    'イチゴ
    'パイナップル
    'イチゴ
    'イチゴ
    'メロン
    '============================
    
End Sub

実際に使用②【最初の要素一つだけ削除】

次は配列の中で、最初に現れた特定の要素を一つだけ削除してみます。

最初の一つだけ削除するには引数「All」をFalseにするか、省略することで設定できます。

  • バナナ(重複なし)を削除
  • イチゴ(3個重複)を一つだけ削除

バナナ(重複なし)を削除

Sub testArray3()
    
    Dim arrs As Variant
    arrs = Array("リンゴ", "バナナ", "イチゴ", "パイナップル", "イチゴ", "イチゴ", "メロン", "リンゴ")
    
    '引数Allは省略可で指定しなければFalse=要素一つだけ削除
    Call removeElm(arrs, "バナナ")
    
    Debug.Print "============================="
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '=============================
    'リンゴ
    'イチゴ
    'パイナップル
    'イチゴ
    'イチゴ
    'メロン
    'リンゴ
    '============================
    
End Sub

イチゴ(3個重複)を一つだけ削除

Sub testArray4()
    
    Dim arrs As Variant
    arrs = Array("リンゴ", "バナナ", "イチゴ", "パイナップル", "イチゴ", "イチゴ", "メロン", "リンゴ")
    
    '引数Allは省略可で指定しなければFalse=要素一つだけ削除
    Call removeElm(arrs, "イチゴ")
    
    Debug.Print "============================="
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '=============================
    'リンゴ
    'バナナ
    'パイナップル
    'イチゴ
    'イチゴ
    'メロン
    'リンゴ
    '============================
    
End Sub

まとめ

いかがでしょうか。
まとめてみます。

まとめ

配列から要素を指定して削除する関数を作成
removeElm関数

配列を便利に使いやすくする関数を作っています。

最後に、

ココナラでVBA、Pythonの作成代行を行っています。
よければ、↓からご依頼お待ちしております。

プログラミング代行いたします。

Python・VBAのコード対応です。

【VBA】
エクセルの自動処理全般

【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)

ココナラで依頼を受けておりますので、お気軽にご相談ください。

依頼はこちらから

ココナラの会員登録がまだの方↓

無料登録はこちら

また、VBAを学習するなら動画での学習がおすすめです。
世界最大級の学習用動画プラットフォームUdemyにはVBAの動画がたくさんアップロードされています。よければ覗いてみてください。

Udemyの公式サイトはこちらです。

ではでは。