2017-01-20 69 views
2

如果某个字符串,数字或日期在数组中,我发现了一个返回true/false结果的函数。我略微修改了它,所以它给了我一个数字(如果该值在数组中,它给了我坐标,否则它给我-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 

我已经试图改变阵列基准,改变日期数字,串,并尝试重新设置数组的最大数量,但错误依然存在。

任何想法?

+2

'arr(position,1)';) – R3uK

+0

感谢您的回答。我也已经尝试过,结果相同。无论哪种方式,由于数组只有一个维度,是否有必要说明维度的外观? – DGMS89

+1

您是手动构建阵列还是从一个范围加载它?你如何将它传递给你的函数?尝试在循环开始处添加Debug.Print LBound(arr,1):Debug.Print UBound(arr,1):Debug.Print position'。 – R3uK

回答

2

当直接从一个范围在片材上加载的阵列:

Arr=Sheets(1).Range("A1:B2").Value

阵列是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