VBA-如何在来自excel的日期数组中搜索日期

时间:2015-08-04 15:31:40

标签: arrays excel vba excel-vba date

我正在尝试在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

1 个答案:

答案 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语句来突破该功能。

这应该至少让你开始。