【问题标题】:VBA- How to search date in array of dates coming from excelVBA-如何在来自excel的日期数组中搜索日期
【发布时间】:2015-10-27 02:24:57
【问题描述】:

我正在尝试在 VBA 中编写一个简单的函数,该函数将来自 Excel 的日期和日期数组作为输入。如果给定日期是数组的一部分,则返回 true,否则返回 false。

我的问题是来自 excel 的数组是二维的,但我总是传入一维数组。换句话说,一个列和一个行值,所以我可以检查我的数组中的值,但我传入一个一维数组。

这是我的代码:

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

【问题讨论】:

  • 我的函数总是返回 False 因为 Holiday_Calendar(counter) = MyDate 总是 False 因为Holiday_Calendar(counter) 出于某种原因需要一行和一列值
  • 所以Holiday_Calendar 是一维的,但其他一些数组是二维的?试试If Holiday_Calendar(counter,1) = MyDate Then
  • 您的函数总是返回 false,因为您将 IsInArray = False 放在函数的末尾。 (;
  • 我的测试用例正在调用 excel 中的函数,MyDate 是 8/7/2015,Holiday_Calendar 是 8/3/2015、8/7/2015、8/10/2015、8/13/ 2015 年,2015 年 8 月 14 日。我仍然得到虚假天气我在 if 语句中使用 Holiday_Calendar(counter) 或 Holiday_Calendar(counter, 1) 或 Holiday_Calendar(1, counter)
  • 哦,好吧,汤姆,但我的函数不应该先点击 IsInArray = True 吗? (因为第二次条件为真)

标签: arrays vba excel date


【解决方案1】:

为了帮助您,我对您的代码进行了一些调整和更改。

首先,您可以使用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 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 语句,如果我们找到匹配项,则可以退出该函数。

这至少应该让你开始。

【讨论】:

  • 非常感谢约书亚!!!退出功能命令使其工作。我来自 C/Java,有人告诉我 IsInArray = True 相当于 return True。显然这是不准确的,因为在 C/Java 中,函数在遇到 return 语句时结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2017-03-17
相关资源
最近更新 更多