我正在尝试在VBA中编写一个简单的函数,它将来自Excel的日期和日期数组作为输入。如果给定日期是数组的一部分,则返回true,否则返回false。
我的问题是来自excel的数组是2维的,但我总是传入1维数组。换句话说,列和行值,所以我可以检查我的数组中的值,但我传入一维数组。
这是我的代码:
Function IsInArray(ByVal MyDate As Date, ByRef Holiday_Calendar As Range) As Boolean
Dim length As Integer
length = WorksheetFunction.Count(Holiday_Calendar)
Dim counter As Integer
'counter = 0
For counter = 0 To length
If Holiday_Calendar(counter) = MyDate Then
IsInArray = True
End If
Next counter
IsInArray = False
End Function
答案 0 :(得分:1)
我已对您的代码进行了一些调整和更改,以帮助您解决问题。
首先,您可以使用Range
方法将WorksheetFunction.Transpose(myRange)
对象(通常为二维)转换为一维数组,其中myRange
是您想要的范围转换为一维。
我在Call
语句中这样做了,所以它看起来像这样:
Option Explicit
Private Sub DateArrays()
Dim rngToPass As Range
Dim dtMyDate As Date
Dim containsDt As Boolean
Set rngToPass = Sheet1.Range("A1:A4")
dtMyDate = "8/7/2015"
containsDt = IsInArray(dtMyDate, Application.WorksheetFunction.Transpose(rngToPass))
End Sub
这将传递一个由rngToPass
。
我确实需要稍微修改你的功能:
Function IsInArray(ByVal MyDate As Date, ByRef Holiday_Calendar As Variant) As Boolean
Dim length As Integer
length = WorksheetFunction.Count(Holiday_Calendar)
Dim counter As Integer
For counter = 1 To length
If Holiday_Calendar(counter) = MyDate Then
IsInArray = True
Exit Function
End If
Next counter
IsInArray = False
End Function
我注意到你的counter
变量从0开始,但转置数组索引从1开始,所以我将0更改为1.
我还注意到,当条件匹配时,函数会简单地将IsInArray设置为true,但执行将继续,因此IsInArray将在函数结束时重置为false,因此始终返回false。如果我们找到匹配项,我已经包含Exit Function
语句来突破该功能。
这应该至少让你开始。