VBA

【VBA】配列に特定の要素が存在するか?その位置は?その数は?を確認する関数(コピペOK)

  • ある値が配列内に存在するかどうかを確認する関数です。
  • 単純で使いやすい判定だけの関数と
    特定の値が存在するかだけでなく、その位置や数も取得する複雑な関数
    を作りました。
  • 例えば配列[ 1 , 2 , 3 , 1 , 1]で、「1」の存在を確認した場合
    • 判定だけする関数 :Trueが返ってきます。
    • 位置や数を取得する関数 :配列[ 0 , 3 , 4 ]が返ってきます。
  • コピペOKです。

配列に特定の要素が存在するかどうかを確認したい場合があると思いますが、
関数を作りました。

宣伝
ココナラでVBAマクロの作成代行を行っております。
興味がございましたら、よろしくお願いいたします。

https://coconala.com/users/2030391

単純な判定だけする関数

配列に同じ要素があるかどうかをブール型で返す関数です。

メリット : 構造が簡単で使い方もあまり悩まないでいい。
デメリット: 同じ要素のある数や位置は分からない。

コード

引数は二つあり、
一つ目に判定したい配列を入れ、
二つ目に調べたい値をいれます。
一つ目に入れた配列内に二つ目に入れた値が含まれているか判定します。

結果はブール型です。

Is_exist_same_Elm( arrs As Variant, elm As Variant)
第一引数 ( arrs ) : 判定する配列
第二引数 ( elm ) : 調べたい値
戻り値は 要素がある ⇒ True
     要素がない ⇒ False

Function Is_exist_same_Elm(ByVal arrs As Variant, ByVal elm As Variant)
    Dim arr As Variant
    
    For Each arr In arrs
        If arr = elm Then
            Is_exist_same_Elm = True
            Exit Function
        End If
    Next
    Is_exist_same_Elm = False
        
End Function

使用例

実際に使用してみると、こんな感じです

Sub test_Is_exist_same_Elm()
    Dim arrs As Variant
    Dim flg As Boolean
    
    arrs = Array(1, 2, 3, 4, 5, 6)
    
    flg = Is_exist_same_Elm(arrs, 1)
    '>> True
    
End Sub

同じ値の位置と数を返す関数

もう少し深く情報が欲しい場合、
ちょっと複雑ですが、この性質を利用して以下のことができるようになります。

  • 特定の要素が存在するかどうかの確認
  • 特定の要素が配列内のどの位置(順番)に存在するか、
    その位置を全部取得できる
  • 特定の要素をいくつ持っているか、数を確認できる

コード

引数は二つ
一つ目に判定したい配列を入れ、
二つ目に調べたい値をいれます。

結果が異なります。
配列で返ってきます。
要素のある位置を配列で返します。

Is_exist_same_Elm2(arrs As Variant, elm As Variant)
第一引数( arrs ) ⇒ 判定する配列
第二引数( elm ) ⇒ 調べたい値
戻り値は 配列

Function Is_exist_same_Elm2(arrs As Variant, elm As Variant)
    Dim i As Long
    Dim j As Long
    Dim results() As Variant
      
    For i = LBound(arrs) To UBound(arrs)
        If arrs(i) = elm Then
            ReDim Preserve results(j)
            results(j) = i
            j = j + 1
        End If
    Next
    Is_exist_same_Elm2 = results
End Function

実際に使ってみます。

例えば
配列が arrs = array ( 6 , 5 , 4 , 3 , 2 , 1 , 5 , 5 )のとき
Is_exist_same_Elm2(arrs, 5)とすると、

結果は
配列として[ 1 , 6 , 7 ]が返ってきます。

数を確認する場合は
UBound( 配列 ) + 1 で確認できます。
「3」が取得できます

配列が空の場合の対応

配列が空の状態で処理をするとエラーを起こして、処理が止まる可能性があります。

空配列の判定をする関数を組み入れることで
エラーを回避させることができます。

空配列の判定関数として
is_exist_array関数を作りました。
詳細は下記の記事をご参照ください

こちらに空配列の判定コードを記載していますが、
こんな感じです。

Function Is_exist_array(arrs As Variant)
    Dim a As Long
    On Error GoTo err
    a = UBound(arrs)
err:
    If err.Number = 9 Or err.Number = 13 Then
        Is_exist_array = False
    Else
        Is_exist_array = True
    End If
End Function