如何在Excel中将日期字符串转换并进行比较

4
= "7/29/2011 12:58:00 PM" > NOW()

我希望这个表达式返回FALSE,但它却返回TRUE。

我知道我可以将我的日期时间分解成日期和时间,然后按以下方式将它们加在一起:

= DateValue("7/29/2011") + TimeValue("12:58:00 PM") > NOW()

但是,这种方法对我来说似乎不够优雅。我想要一个简单的函数或方法,看起来漂亮,并且我确信它已经存在了,但我只是找不到它。

我还知道有一个名为CDate的VBA函数,可以将字符串转换为日期时间,这将是完美的。但是,我不知道如何在Excel单元格中调用VBA函数。


1
你的日期字符串是像单元格中“硬编码”一样吗?如果是,为什么这样做? - Jean-François Corbett
它们是这样的。有没有其他更好的格式来输入它们? - Gidon Wise
为什么不把“7/29/2011 12:58:00 PM”放在一个格式设置为日期的单元格中呢?像这样硬编码字符串使它变得相当难以察觉和不灵活。 - Jean-François Corbett
啊,这就是最佳实践。我会这么做的。但是,在某些情况下,公式需要这样做,所以我会接受我认为最简单的答案,目前是*1。也感谢你。 - Gidon Wise
是的,我认为这是一个好的实践,而你的例子看起来像是可怕的实践!为什么有人会想要那样做呢?请看下面我的回答。 - Jean-François Corbett
4个回答

7

将字符串乘以1,比较函数就会起作用:

= 1*"7/29/2011 12:58:00 PM" > NOW()

你的问题的答案与@Jean-François的评论密切相关:为什么Excel将日期视为文本而不是日期?

一旦你找到了答案,你就能进行比较。

如果原因是该字符串被检索为文本,则可以简单地将其乘以1,这样比较函数就会起作用。但前提是该字符串格式在你的区域设置中是有效的日期/时间格式。


这很棒。必须给你点赞。但最终要隔离日期。 - Gidon Wise
1
这个答案的主要观点是(将其乘以一,比较函数将起作用),应该置于前台,而不是埋在第三段中间!允许我这么做。这个技巧很好知道。+1 - Jean-François Corbett

5

你可以将VBA调用封装在自定义函数中:

Function ReturnDate(ByVal datestr As String) As Date
    ReturnDate = CDate(datestr)
End Function

您可以像在电子表格中使用公式一样使用它。

我想不出一种直接从公式中调用CDate的方法,但这样的方法可能存在。 - jonsca
如果没有更好的答案,我将接受这个答案。虽然这似乎是一个变通方法,但它是一个不错的变通方法。 - Gidon Wise
1
解决 XY 问题中的 X 可能会非常痛苦!+1 - Jean-François Corbett

4
我将以下内容从评论升级为答案:
除非您有非常特定的原因(目前我想不到任何原因),否则日期(和其他值)不应该像您展示的那样作为字符串“硬编码”在单元格中。这样硬编码字符串会使其变得不可见和不灵活。用户只会看到TRUE或FALSE,没有任何说明这意味着什么。
我会把您的日期“7/29/2011 12:58:00 PM”放在一个单独的单元格中,例如A1,并设置单元格的格式为某个日期格式。然后您可以说“= A1> NOW()”。
与@jonsca和@Tiago Cardoso的答案相反,这个答案并没有回答您的具体问题,但是,您所问的似乎对我来说是非常糟糕的做法!

3

最简单的方法是创建一个使用CDATE并返回比较结果的VBA函数。然后,在Excel单元格中调用该函数。

VBA函数:

Public Function compareDate(ByVal inputDate As String) As Boolean
  compareDate = CDate(inputDate) > Now()
End Function

然后在您的电子表格中,只需执行:

=compareDate("YOUR DATE")

该函数将返回“FALSE”,如果它比Now()更旧,将返回“TRUE”,如果它比Now()更新。

与@jonsca的答案相同,除了外观。 - Jean-François Corbett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接