VBA-如何search来自excel的date数组中的date

我想在VBA中写一个简单的函数,这个函数需要input一个来自Excel的date和date数组。 如果给定date是数组的一部分,则返回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 

我已经做了一些调整和改变你的代码,以帮助你。

首先,可以使用WorksheetFunction.Transpose(myRange)方法将一个通常为二维的Range对象转换为一维数组,其中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:

 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 

我注意到你的countervariables从0开始,但是转置的数组索引从1开始,所以我将0改为1。

我还注意到,当条件匹配时,函数简要地将IsInArray设置为true,但执行将继续,因此IsInArray将在函数结束时被重置为false,所以总是返回false。 如果find匹配的话,我已经包含了一个Exit Function语句来突破这个函数。

这应该让你至less开始。