2016-11-29 72 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