- 配列の要素を値で指定して削除する関数です。
コピペですぐ使えます。 - (例)配列[a,b,c,d]から「b」を指定して削除したい
⇒配列[a,c,d]が得られます。 - 最初に出てきた値を消すバージョンと
全ての要素を消すバージョンがあります。 - (例)配列[a,b,c,d,b,b]
最初の一つを消す⇒[a,c,d,b,b]
全部消す⇒[a,c,d]
こんにちはhokkyokunです。
配列の要素を指定してその値を削除する関数を作成しました。
配列の位置を指定して削除する関数はこちら↓です。
例えば、[リンゴ、バナナ、パイナップル、イチゴ]という配列があり、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
詳細は省略しますが、この関数を使うことで、配列に要素簡単に追加することができます。
詳しくは以下の記事をご確認よろしくお願い致します。
removeElm関数
特定の要素のうち、最初に現れた分を削除します。
# | 引数 | データ型 | 内容 |
① | 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の動画がたくさんアップロードされています。よければ覗いてみてください。
ではでは。