VBA

【VBA】配列の位置を指定して要素を削除する関数(コピペですぐ使える)

記事内に商品プロモーションを含む場合があります
わかること
  • 配列の要素を位置を指定して削除できます。
    ○○番目の要素を削除
  • (例)配列[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]

短時間で習得するためには質問できる環境が必要です。
KENスクールはVBAコースがあり、個別指導で質問し放題です。

KENスクール[ピーシーキョウシツ]
無料体験レッスンあります!

こんにちは、hokkyokunです。

配列の位置を指定して要素を削除する
関数をご紹介します。

アイコン名を入力

配列の要素数の再宣言が面倒で
配列は使いずらい

配列はプログラミングの基本ですが、
VBAは配列が不親切な設計になっています。

コピペですぐ使える関数を作りましたので紹介します。

注意点

関数をご紹介する前に注意点が二つあります。
ざっくりまとめると以下のような点に注意してください。

  • エラー回避関数Is_correct_array関数を使って
    エラーが生じる空の状態を回避する
  • 配列の宣言方法は
    「Dim 配列名 as Variant」

エラー回避関数

配列に要素が何も入っていない状態=空と定義すると

  1. エラーが生じる状態
  2. エラーが生じない、Emptyが入った状態

の二つの状態があります。

①のエラーが生じている状態の空はプログラムが止まってしまうので
特に注意が必要です。

これを回避する関数として
Is_correct_array関数を作りました。

これを用いると配列がエラー状態なのかどうか
ブール型(TrueかFalse)で返してくれます。

コードはこちらの記事にあります。

【VBA】配列が空かどうかを判定する関数とエラー回避する関数 わかること 配列が空の状態は2種類①エラーが発生する状態②エラーが出ずEmptyが要素として入った状態 配列の状態を把握するこ...

コードはこちらです。
合わせてこちらもコピペしてください。
使い方は↑の記事をご確認ください。

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関数 特定の位置の要素を削除する

  • 関数
    pop( arrs , elm )
  • 引数
    ① arrs : 配列(データ型はVariant)
    ② elm : 要素(データ型はVariant)
  • 戻り値
    なし(配列から特定の位置の要素が削除されています。)
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
このようなメッセージボックスが出て、処理は何もしません。

まとめ

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

まとめ

配列の特定の位置を指定して要素を削除する関数

関数はpop関数

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

VBAを短時間で習得するためには
何はともあれ質問、相談する環境が重要です。

侍エンジニアはVBAをオンラインで学習できます。

質問の回答に力を入れていますので、
短時間でサクッと習得するにはオンライン学習を検討してみてください。

リアルに学習したい場合は
KENスクールがお勧めです。

KENスクールもオンライン対応していますが、
KENスクールにはリアルな教室があり、対面で学習できる強みがあります。

VBAカリュキュラムがあるパソコン教室はあまりないので、
実際に出向いて学習する方はこちらを検討してみてください。

新宿、池袋、北千住、横浜、名古屋、梅田、札幌、福岡に校舎があります!

KENスクール[ピーシーキョウシツ]
無料体験レッスンあります!