VBA - 値が配列に存在するかどうかを確認
VBA - 値が配列に存在するかどうかを確認
前書き
値が配列に存在するかどうかを確認するために、その要素をループ処理できます。 しかし別の解決策があります! Excel固有のINDEX()関数を使用できます。2次元配列の場合はINDEX / MATCH関数を組み合わせて使用します。 ただし、値が見つからない場合、 Application.Matchはエラーを返します。 考えられるエラーと配列変数の次元数を考慮する必要があります。この小さな機能はあなたを助けてくれるでしょう!
Match機能を使う
ブールとしての関数EstDans(mot As String、Tabl)バイトとしての寸法、整数としてのj
エラー時に再開
IsError(UBound(Tabl、2))の場合、Dimension = 1 Else Dimension = 2です。
エラー時GoTo 0
ケース寸法の選択
ケース1
エラー時に再開
EstDans = Application.Match(mot、Tabl、0)
エラー時GoTo 0
ケース2
j = 1からUBoundへ(Tabl、2)
エラー時に再開
EstDans = Application.Match(mot、Application.Index(Tabl、、j)、0)
エラー時GoTo 0
EstDans = Trueの場合、終了します
次
終了選択
終了機能
関数を呼び出す
サブテスト()薄暗いTb()、私は整数として
2次元:
Tb =範囲( "A2:C16")値
Debug.Print EstDans(MaValeur、Tb)
Tbを消去
'tb 1次元:
ReDim Preserve Tb(15)
i = 0〜14の場合
Tb(i)=セル数(i + 2、1)
次
Debug.Print EstDans(MaValeur、Tb)
終了サブ
ループを使う
この関数の構造はMatchを使ったものと似ています。関数BoucleSurTabl(mot As String、Tb)バイトとしてのディム寸法、長さとしてのi、長さとしてのj
エラー時に再開
IsError(UBound(Tb、2))の場合、Dimension = 1 Else Dimension = 2です。
エラー時GoTo 0
ケース寸法の選択
ケース1
j = LBound(Tb)からUBound(Tb)まで
Tb(j)= motの場合BoucleSurTabl = Trueの場合:終了関数
次
ケース2
i = LBound(Tb、1)からUBound(Tb、1)まで
j = LBound(Tb、2)からUBound(Tb、2)まで
Tb(i、j)= motの場合BoucleSurTabl = Trueの場合:終了関数
次のj
次の私
終了選択
終了機能
観察
どんな場合でも、Application.Matchを使用するよりも、大規模な配列でループ機能を使用する方が良い結果が得られます。次の範囲( "A1:Y20002")で2次元配列をテストします。
- Match機能を使用する:8.300781秒
- ループを使用して:0.4375秒。
一次元配列をテストする:
- Match機能を使う:instant
- ループを使う:0.015625秒
ダウンロードリンク
- サンプルワークブックをダウンロードすることができます://cjoint.com/?DHfpeqMBvRK