2016-11-29 70 views
0

我有没有问题,运行在一些笔记本电脑下面的代码,然后别人就会报错了一个类型不匹配。列AA中格式为(mm/dd/yyyy),列AB格式为(hh:mm:ss)。 我从Now()中减去日期和时间。我无法真正解决问题,因为它可以在我的笔记本电脑上正常工作。对于其他人来说,它会出错。 CLng(CDate(Now()))有一个值,但另外两个诱发类型不匹配。我试过下面的两条线,并另其串接的日期和时间,然后进行CLng函数(CDATE(2010 VBA - 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 

我请求我的同事给我他的区域日期/时间设置。我想这可能是这样的屏幕截图。我读过与此类似,但不能由于看着办吧。提前其他问题。

+1

“日期”的时间部分是分数。在仅包含时间的“日期”上使用'CLng'将在中午离开。你究竟想要计算什么? – Comintern

+0

列AA中格式为(mm/dd/yyyy),列AB格式为(hh:mm:ss)。我想从Now()中减去日期和时间。感谢有关CLng的信息。最初,我将日期和时间连接起来,然后使用CLng,这对我来说非常合适。但是对于其他人来说,这并不奏效,所以我认为我的串接方式可能有些问题,所以我分解了日期和时间。但事实并非如此。 – jmeddy

+0

你有AA和AB列的日期和时间吗,或者你有在这些列中看起来像日期和时间的字符串? (如果您暂时将单元格格式切换为“常规”并且单元格显示数字,则内容为日期/时间,但是如果它们继续显示看起来像日期和时间的内容,则内容仅为字符串。) – YowE3K

回答

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 
+0

这对我有效!我会确保它能够快速地为其他人工作,但我认为这可能会有所裨益。我会尽快跟进。 – jmeddy

+0

我看到..我希望有一个解决方案,以避免必须根据他们的设置来定制每个人的代码。每次修改时都要为每个人更新这个工作将是很多工作。是否有一个选项可以将格式从文本更改为可用格式来绕过此操作? – jmeddy

+0

@jmeddy - 如果AA和AB中的值存储在用户的日期/时间设置中,则我提供的第一种方法将起作用。如果AA和AB中的值以固定的mm/dd/yyyy和hh:mm:ss设置存储,那么无论用户设置如何,我提供的替代代码都可以使用。 – YowE3K

0

你可以使用的Value2属性210对象来获取DateTime的数字表示形式。尝试:

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

只是一定要Now()转换为Double,否则将只使用DateTime的日期部分。

我发现很容易与DateTime的数字表示正常工作,因为它允许你绕过区域设置。

+0

感谢您的回复。我尝试了它,并得到了同一部分的Type Mismatch:'(Range(“AA”&i).Value2 + Range(“AB”&i).Value2)'..当我将鼠标悬停在Range( “AA”&i).Value2'我得到MM/DD/YYYY和'Range(“AB”&i).Value2'我得到hh:mm:ss。 CDbl(Now())给出了42703.48的数字表示。似乎我仍然需要找到一种方法来转换为数字表示而不使用区域设置? – jmeddy

+0

我不是100%确定,但我认为如果我的AA/AB列中的日期/时间格式不是文本,你的答案就可以工作。 – jmeddy