- ある値が配列内に存在するかどうかを確認する関数です。
- 単純で使いやすい判定だけの関数と
特定の値が存在するかだけでなく、その位置や数も取得する複雑な関数
を作りました。 - 例えば配列[ 1 , 2 , 3 , 1 , 1]で、「1」の存在を確認した場合
- 判定だけする関数 :Trueが返ってきます。
- 位置や数を取得する関数 :配列[ 0 , 3 , 4 ]が返ってきます。
- コピペOKです。
配列に特定の要素が存在するかどうかを確認したい場合があると思いますが、
関数を作りました。
単純な判定だけする関数
配列に同じ要素があるかどうかをブール型で返す関数です。
メリット : 構造が簡単で使い方もあまり悩まないでいい。
デメリット: 同じ要素のある数や位置は分からない。
コード
引数は二つあり、
一つ目に判定したい配列を入れ、
二つ目に調べたい値をいれます。
一つ目に入れた配列内に二つ目に入れた値が含まれているか判定します。
結果はブール型です。
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
その他VBAに関する記事
https://www.hokkyokun.com/summary-vba/