在VBA中比较日期时出现问题?

在VBA中比较日期时出现问题?,vba,Vba,我尝试使用以下代码比较两个日期: MsgBox (Format("07-12-2018", "dd-MMM-yyyy") > Format("31-12-2016", "dd-MMM-yyyy")) 尽管第一个日期大于第二个日期,但消息框显示False而不是比较字符串,请使用or函数 DateValue MsgBox (DateValue("07-12-2018") > DateValue("31-12-2016")) 这将正确显示True 注: DateValue根据为系统指

我尝试使用以下代码比较两个日期:

MsgBox (Format("07-12-2018", "dd-MMM-yyyy") > Format("31-12-2016", "dd-MMM-yyyy"))

尽管第一个日期大于第二个日期,但消息框显示False

而不是比较字符串,请使用or函数

DateValue

MsgBox (DateValue("07-12-2018") > DateValue("31-12-2016")) 
这将正确显示
True

注:

DateValue根据为系统指定的短日期格式识别月、日和年的顺序

DateSerial

独立于本地系统的短日期格式,因为它对年、月和日期使用单独的参数:

MsgBox (DateSerial(2018,12,7) > DateSerial(2016,12,31))

不要比较日期的字符串表示形式。比较日期。将
“07-12-2018”
“31-12-2016”
解析为日期类型的变量并进行比较。因为第一个字符串不是因为0小于3而比较为“大”,所以您是在进行文本比较,而不是基于日期。或者更好地使用
DateSerial(2018,12,7)>DateSerial(2016,12,31)
使其独立于操作系统本地化
DateValue
需要操作系统日期格式为
dd-mm-yyyy
才能使用这些字符串日期。例如,如果您使用您的代码,并且操作系统设置为
yyyy-mm-dd
,那么它将失败。好的一点,我将把它添加到帖子中。使用
DateSerial
的一个缺点是,您不能使用完整的日期字符串,必须将其拆分。您永远不能使用完整的字符串将其转换为日期(如果希望它是可靠的结果),因为字符串缺少关于年、月或日是字符串的哪一部分的信息。例如,计算机如何知道
07-12-2018
dd-mm-yyyy
还是
mm-dd-yyyy
?计算机不可能知道,所以这是程序员的任务。如果您不想让Excel开始猜测,则始终需要将字符串拆分为天、月和年,并使用
DateSerial
。在一定程度上为True。我可以想象一个带有文本框的UF,它只允许特定格式的值。但是程序员最好在另一个变量中将值声明为日期。但是文本框接受的格式不能是“特定”格式,而不能是操作系统中使用的“特定”格式。因此,如果工作簿在多个地方使用(全球化),那么这仍然是一个棘手的问题。