2017-01-20 59 views
2

特定の文字列、数値または日付が配列内にある場合、真偽結果を返す関数が見つかりました。私はちょうどそれを私に番号を与えるように少し変更しました(値が配列内にあれば、それは私に座標を与えます、そうでなければ-1になります)。IsInArray関数VBA

Public Function IsInArray2(DateToBeFound As Date, arr As Variant) As Long 
Dim position As Long 
IsInArray2 = -1 

For position = LBound(arr, 1) To UBound(arr, 1) 
    If arr(position) = DateToBeFound Then 
     IsInArray2 = position 
     Exit For 
    End If 
Next 

End Function 

この関数を使用して、日付が配列内にあるかどうかを確認しようとしています。そうであれば、私のコードで座標を使用してさらに計算することができます。

問題:何らかの理由でラインにを、私は取得していますし、エラー(範囲外の添字):

If arr(position) = DateToBeFound Then 

私はすでに文字列に、数値に日付を変更し、配列参照を変更しようとしました、それが持っているアイテムの最大量に関して配列を赤字にしようとしましたが、それでもエラーは持続します。

アイデア?

すなわちArr=Sheets(1).Range("A1:B2").Value

配列は2次元である:あなたがシート上の範囲から直接配列をロード

+2

'arr(位置、1)';) – R3uK

+0

答えをありがとう。私はすでに同じ結果を試しています。どちらの方法でも、配列には次元が1つしかないので、どの次元を見るかを指定する必要がありますか? – DGMS89

+1

配列を手動で構築したか、範囲からロードしましたか?どのようにあなたの機能にそれを渡していますか?ループの先頭に 'Debug.Print LBound(arr、1):Debug.Print UBound(arr、1):Debug.Print position'を追加してみてください。 – R3uK

答えて

2

Arr(position,1)を使用する必要があります。 ;)

+1

2Dとして入力したことはわかりませんでした。質問を投稿する前に追加しようとしましたが、うまくいきませんでした。ファイルを再起動してもう一度試してみてください。私はこの魔術師を推測しない。 – DGMS89

2

"垂直範囲"(複数の行)の2Dアレイにおける結果が、For Eachループ(試験せず)を用いることができる非日付または通貨タイプの

Public Function IndexOf(arr, value) As Long 
    Dim v: IndexOf = 0   
    For Each v in arr 
     If v = value Then Exit For 
     IndexOf = IndexOf + 1 
    Next 
    IndexOf = -1 ' not found 
End Function 

Public Function IndexOf(arr, value) As Long 
    Dim v: v = Application.Match(arr, value, 0) 
    IndexOf = IIf(IsError(v), -1, v) 
End Function