- 配列の要素を位置を指定して削除できます。
○○番目の要素を削除 - (例)配列[a,b,c,d]
「0」指定(先頭) [a,b,c,d]⇒[b,c,d]
「2」指定 [a,b,c,d]⇒[a,b,d] - マイナスで位置を指定して、
最後から○○番目の位置も指定できる - (例)配列[a,b,c,d]
「-1」指定(末尾) [a,b,c,d]⇒[a,b,c]
「-2」指定(最後から2番目) [a,b,c,d]⇒[a,b,d]
こんにちは、hokkyokunです。
配列の位置を指定して要素を削除する
関数をご紹介します。
配列の要素数の再宣言が面倒で
配列は使いずらい!
配列はプログラミングの基本ですが、
VBAは配列が不親切な設計になっています。
コピペですぐ使える関数を作りましたので紹介します。
注意点
関数をご紹介する前に注意点が二つあります。
ざっくりまとめると以下のような点に注意してください。
- エラー回避関数Is_correct_array関数を使って
エラーが生じる空の状態を回避する - 配列の宣言方法は
「Dim 配列名 as Variant」
エラー回避関数
配列に要素が何も入っていない状態=空と定義すると
- エラーが生じる状態
- エラーが生じない、Emptyが入った状態
の二つの状態があります。
①のエラーが生じている状態の空はプログラムが止まってしまうので
特に注意が必要です。
これを回避する関数として
Is_correct_array関数を作りました。
これを用いると配列がエラー状態なのかどうか
ブール型(TrueかFalse)で返してくれます。

コードはこちらです。
合わせてこちらもコピペしてください。
使い方は↑の記事をご確認ください。
Function Is_correct_array(ByVal arrs As Variant)
Dim a As Long
'なんでもいいが、エラーを生じさせる
On Error GoTo err
a = UBound(arrs)
'エラーが生じたときエラー番号で9か13の場合はFalse
err:
If err.Number = 9 Or err.Number = 13 Then
Is_correct_array = False
Else
Is_correct_array = True
End If
End Function
②エラーが生じない、Emptyが入った状態は
基本的には静的配列(宣言時に要素数を指定する配列)で生じる状態なので
次の配列の宣言の方法を活用すれば回避できます。
配列の宣言の方法
配列を変数として格納していくと思いますが、
その宣言方法には注意が必要です。

個人的には配列の宣言は以下一択です。
他の書き方は一切しません。
Dim 配列名 as Variant
(例) Dim arrs as Variant
arrsの後に()や(2)などをつけないのがポイント
この書き方の場合はエラーが起きないはずです。
起きた場合はご連絡いただければ幸いです。
関数
pop関数 特定の位置の要素を削除する
Function pop(ByRef arrs As Variant, ByVal loc As Long)
Dim results() As Variant
Dim i, j As Long
ReDim Preserve results(j)
'配列が空かどうか判定
If Not Is_correct_array(arrs) Then
MsgBox ("配列が空なので、pop関数は処理をせず、終了します。")
Exit Function
End If
'locがマイナスのとき、後ろから位置を指定する
'(例)loc=-1なら、最後尾、loc=-2なら後ろから二番目
If loc < 0 Then
loc = UBound(arrs) + 1 + loc
End If
'locの位置がarrsの要素数範囲外の場合処理をしない
If loc > UBound(arrs) Or loc < LBound(arrs) Then
MsgBox ("指定したインデックスが有効範囲にありません")
Exit Function
End If
'locの位置の要素以外をresultsに格納
For i = LBound(arrs) To UBound(arrs)
If i <> loc Then
ReDim Preserve results(j)
results(j) = arrs(i)
j = j + 1
End If
Next i
arrs = results
End Function
関数中にあるIs_correct_array関数の
コードはこちらの記事にあります。
実際に使ってみます。
先頭(loc=0)削除
Sub test_pop1()
Dim arrs As Variant
Dim loc As Long
arrs = Array("a", "b", "c", "d")
'先頭の位置を指定
loc = 0
Call pop(arrs, loc)
'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>b,c,d
End Sub
真ん中(0 < loc < インデックス最大)削除
Sub test_pop2()
Dim arrs As Variant
Dim loc As Long
arrs = Array("a", "b", "c", "d")
'先頭の位置を指定
loc = 2
Call pop(arrs, loc)
'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>a,b,d
End Sub
末尾(loc=最大インデックス数)
Sub test_pop3()
Dim arrs As Variant
Dim loc As Long
arrs = Array("a", "b", "c", "d")
'先頭の位置を指定
loc = 3
Call pop(arrs, loc)
'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>a,b,c
End Sub
マイナスで位置指定(後ろから○○番目)
Sub test_pop4()
Dim arrs As Variant
Dim loc As Long
arrs = Array("a", "b", "c", "d")
'先頭の位置を指定
loc = -1
Call pop(arrs, loc)
'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>a,b,c
End Sub
インデックス範囲外を指定
配列が持っているインデックス以外を指定した場合です。
例えば、[a,b,c,d]の最大インデックスは3ですが、
「4」を指定するとメッセージボックスが出てアナウンスします。
Sub test_pop5()
Dim arrs As Variant
Dim loc As Long
arrs = Array("a", "b", "c", "d")
'先頭の位置を指定
loc = 4
Call pop(arrs, loc)
'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>指定したインデックスが有効範囲にないため、処理をしないで終了
'>>a,b,c,d
End Sub

まとめ
いかがでしょうか。
まとめてみます。
配列を便利に使いやすくする関数を作っています。
VBAを短時間で習得するためには
何はともあれ質問、相談する環境が重要です。
侍エンジニアはVBAをオンラインで学習できます。
質問の回答に力を入れていますので、
短時間でサクッと習得するにはオンライン学習を検討してみてください。

リアルに学習したい場合は
KENスクールがお勧めです。
KENスクールもオンライン対応していますが、
KENスクールにはリアルな教室があり、対面で学習できる強みがあります。
VBAカリュキュラムがあるパソコン教室はあまりないので、
実際に出向いて学習する方はこちらを検討してみてください。
新宿、池袋、北千住、横浜、名古屋、梅田、札幌、福岡に校舎があります!