VBA 2010 - CDate类型不匹配问题

时间:2016-11-29 18:13:11

标签: excel-vba date format vba excel

我有以下代码在某些笔记本电脑上运行没有问题,然后其他代码会出现类型不匹配错误。在列AA中是具有格式(mm / dd / yyyy)的日期,列AB具有相应的格式时间(hh:mm:ss)。 我从Now()中减去日期和时间。我无法真正解决问题,因为它在我的笔记本电脑上工作正常。对于其他人来说,它出错了。 CLng(CDate(Now()))有一个值,但另外两个会导致类型不匹配。我已经尝试了下面两行以及另一行连接日期和时间,然后执行了CLng(CDate(。

'If CLng(CDate(Now())) - CLng(CDate(Range("AA" & i).Value)) + CLng(CDate(Range("AB" & i).Value)) >= 7 Then
 If CLng(CDate(Now())) - CLng(CDate(FMT(Range("AA" & i), "mm/dd/yyyy"))) + CLng(CDate(FMT(Range("AB" & i), "hh:mm:ss"))) >= 7 Then

其中FMT是公共职能:

Public Function FMT$(ByVal Value, ByVal strFormat)
FMT = VBA.Format$(Value, strFormat)
End Function

我要求我的同事给我发送他的地区日期/时间设置的屏幕截图..我当时认为可能是这种情况。我已经阅读了与此相似的其他问题,但无法弄明白。提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果AA和AB列包含文本而不是日期和时间,请尝试使用以下语句:

If Now() - (DateValue(Range("AA" & i)) + TimeValue(Range("AB" & i))) >= 7 Then

如果用户的本地日期设置为dd/mm/yyyy,但您的列存储的字符串表示某个其他区域设置的日期设置中的日期,则可能仍会出现问题。如果是这种情况,您可能需要解析字段并按如下方式执行:

Dim myDateStr As String
Dim myTimeStr As String
Dim myDateTime As Date
myDateStr = Range("AA" & i)
myTimeStr = Range("AB" & i)
myDateTime = DateSerial(CInt(Mid(myDateStr, 7, 4)), CInt(Mid(myDateStr, 1, 2)), CInt(Mid(myDateStr, 4, 2))) + _
             TimeSerial(CInt(Mid(myTimeStr, 1, 2)), CInt(Mid(myTimeStr, 4, 2)), CInt(Mid(myTimeStr, 7, 2)))

If Now() - myDateTime >= 7 Then

答案 1 :(得分:0)

您可以使用Value2对象的Range属性来获取DateTime的数字表示。尝试:

If CDbl(Now()) - (Range("AA" & i).Value2 + Range("AB" & i).Value2) >= 7 Then

请务必将Now()转换为Double,否则它只会使用DateTime的日期部分。

我发现使用DateTime的数字表示更容易,因为它允许您绕过区域设置。