如何检查Excel中的日期单元格是不是为空?

Posted

技术标签:

【中文标题】如何检查Excel中的日期单元格是不是为空?【英文标题】:How to check if a date cell in Excel is empty?如何检查Excel中的日期单元格是否为空? 【发布时间】:2016-01-30 00:40:35 【问题描述】:

如果感觉这应该很容易,但如果不再次检索单元格的值,我就无法让它工作。

首先,我有 2 个日期单元格:

Dim agreedDate As Date
Dim completedDate As Date

这可行..(但看起来很乱)

agreedDate = Worksheets("Data").Cells(Counter, 7).Value
completedDate = Worksheets("Data").Cells(Counter, 9).Value

If (IsEmpty(Worksheets("Data").Cells(Counter, 7).Value) = True) Or (IsEmpty(Worksheets("Data").Cells(Counter, 9).Value) = True) Then

[.. do stuff]
End If

这不起作用 - 为什么不呢?!

agreedDate = Worksheets("Data").Cells(Counter, 7).Value
completedDate = Worksheets("Data").Cells(Counter, 9).Value

If (IsEmpty(agreedDate) = True) Or IsEmpty(completedDate) = True) Then

[.. do stuff]
End If

有没有办法以一种简洁明了的方式编写 if 语句?

【问题讨论】:

您已将变量声明为日期类型。只有 Variant 类型的变量可以为 Empty。 为什么使用 IsEmpty() = True 而不是 IsEmpty() 作为条件?它已经评估为布尔值。 【参考方案1】:

由于只有 Variant 类型的变量可以为 Empty,因此您需要对 Date 类型进行不同的测试。

检查是否为零:

If agreedDate = 0 Or completedDate = 0 Then

但更安全的方法是将变量更改为 Variant 类型,然后进行此测试:

If IsDate(agreedDate) = False Or IsDate(completedDate) = False Then

【讨论】:

很好的答案,这正是我想要的!【参考方案2】:

IsEmpty function 确定指示的变量是否已初始化。如果一个单元格真的是空白的,那么从 IsEmpty 的角度来看,它被认为是未初始化的。但是,在 VBA 中声明一个变量会给它一个默认值。在这种情况下,日期类型变量本质上是 030-Dec-1899 00:00:00,如以下简短的 sn-p 所示。

Sub date_var_test()
    Dim dt As Date
    Debug.Print Format(dt, "dd-mmm-yyyy hh:mm:ss")
End Sub

如果您想“整理”您的代码,您可能还希望允许 IsEmpty 函数的真正布尔返回来解析布尔条件,而不是将其与 True 进行比较。

If IsEmpty(Worksheets("Data").Cells(Counter, 7)) Or IsEmpty(Worksheets("Data").Cells(Counter, 9)) Then
    [.. do stuff]
End If

鉴于 False 为零(出于所有意图和目的),那么这将适用于您的日期类型变量。

If Not (agreedDate or completedDate) Then
    [.. do stuff]
End If

【讨论】:

我认为最好的方法是使用变体并使用 IsDate()。如果单元格中有文本怎么办... 约会总是有点搞笑。它们是数字,但实际上不仅仅是数字。虽然主要是准确的,IsDate Function 仍然是最好的猜测。我更喜欢使用 Range.Value2 property 并将日期视为数字,直到必须将它们放回工作表中。 @Excel Hero 我同意 Excel Hero。 Variant 应该用作 Value 和 Value2 的预期回报。如果单元格包含文本,则将其值传递给日期变量会产生运行时错误。所以最好的形式是使用变体类型和 IsDate()。如果需要日期值,可以在验证日期值后分配它们。尽管我也同意将日期视为数字是最简单的,但前提是您可以保证它们实际上是开始的日期。 @P57 & xlHero 我猜变体的使用将取决于您的数据的易失性。传递数据中的错误(在预期日期的位置找到字符串)并不总是最好的解决方案。你要在继续之前停止潜艇吗?您是否要跳过该记录并以某种方式报告错误?如果我找到了一个我期望日期的字符串,我想立即知道,因为我首先担心的是一个错误的导入,其中不明确的 DMY 与 MDY 被错误地转换,明确的 DMY 与 MDY 被转换为字符串,使整个操作无用。 重点是 Value 和 Value2 的预期返回值都是变体。任何异常情况都应该在此基础上进行处理,而不是通过产生(或需要错误处理)运行时错误。随后,IsDate 函数似乎是将变量单元格值验证为日期的最方便的方法。它还使代码本质上具有自我描述性。所有其他场景仍可根据需要处理。【参考方案3】:

正如 Excel Hero 指出的,日期变量不能为空。事实上,日期变量是一个数字,所以你应该可以做这样的事情。另外,请注意下面的代码使用“Value2”。

Sub test()
    Dim d As Date
    d = Range("A1").Value2
    If d = 0 Then
      MsgBox "ok"
    Else
      MsgBox "not ok"
    End If
End Sub

【讨论】:

以上是关于如何检查Excel中的日期单元格是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

excel的单元格为空 日期型 插入到SQL数据库 为啥会出现默认时间1900-1-2

怎么在excel中单元格中运用if函数表示周末是不是加班

Delphi网格面板检查单元格是不是为空

我的excel表格打开的单元格格式默认为日期,请问如何让excel表格打开的单元格格式默认为常规

如何将EXCEL单元格中字符型日期截取并转为日期型?

在Excel里,日期为啥变成了数字