【问题标题】:Excel VBA - Does a range possess/contain a dateExcel VBA - 范围是否拥有/包含日期
【发布时间】:2016-10-11 10:22:04
【问题描述】:

我正在寻找一种解决方案来检查某个范围(在我的情况下为整行)是否包含任何日期值。因此,仅要求特定日期的 find 等方法不符合我的兴趣。

我已经尝试过IsDate(Cells(x, y).Value)IsDate(Range("xy")),它只适用于一个单元格检查,但不幸的是它不适用于多个单元格。

我还尝试了以下方法:

If IsDate(Sheets("test").Range(Cells(7, 2), Cells(7, 3)).Value) Then
    MsgBox ("works")
End If 

两个单元格都是日期,并且通过只检查它们的单个单元格来使用 IsDate

有人可以帮我解决这个问题吗? 如何检查整行是否包含任何日期值? 请在不循环每个单元格的情况下尝试它。

【问题讨论】:

  • 为什么要避免循环?

标签: vba excel date find range


【解决方案1】:

您无法检查整个范围以查看它是否包含日期,这是不可能的,必须逐个单元格地完成,但可以通过在第一个肯定答案时退出来减少它。

考虑以下单元格:-

' |A      |B              |C
'1|This   |10/June/2016   |Date is 10/06/16

尝试一次性处理它们会问This10/June/2016Date is 10/06/16 是一个日期吗?答案是否定的。

A1 不是日期

B1 是日期

C1 不是日期(它包含日期但被视为字符串,因为它的内容也不是日期)

我们必须一一检查以隔离我们正在检查的内容。

我从您的问题中假设,除了“是的,此范围内有一个日期”之外,您不需要任何其他信息(即您不需要知道在哪里)。这只能通过循环来实现:-

Public Sub Sample()
Dim WkSht           As Worksheet
Dim Rng             As Range
Dim Cl              As Range
Dim BlnContainsDate As Boolean

'Connect to worksheet
Set WkSht = ThisWorkbook.Worksheets("Sheet1")

    'Define a range to check
    Set Rng = WkSht.Range("A2:J2")

        'Check each cell
        For Each Cl In Rng.Cells

            'Its there is a date in any of them, flag it and stop checking
            If IsDate(Cl.Value) Then
                BlnContainsDate = True
                Exit For
            End If

        Next
    Set Rng = Nothing
Set WkSht = Nothing

End Sub

如果你不希望它看起来像一个循环,你可以像一个子过程一样调用它并返回一个结果:-

Public Sub Sample()
Dim WkSht           As Worksheet

'Connect to worksheet
Set WkSht = ThisWorkbook.Worksheets("Sheet1")

    'Send a range to be checked
    Debug.Print ContainsADate(WkSht.Range("A2:J2"))

Set WkSht = Nothing

End Sub

Private Function ContainsADate(ByVal Rng As Range) As Boolean

'Check each cell we were passed
For Each Cl In Rng.Cells

    'Its there is a date in any of them, flag it and stop checking
    If IsDate(Cl.Value) Then
        ContainsADate = True
        Exit For
    End If

Next

End Function

【讨论】:

    【解决方案2】:

    试试

    For Each cell In Range("A1:D3")
           If IsDate(cell.Value) Then MsgBox cell.Value 
    next
    

    编辑:对不起,我没有循环阅读......但也许有人使用我的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 2020-08-03
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多