簡體   English   中英

將Excel VBA中的日期寫入工作表會給出錯誤的值

[英]Writing a date from Excel VBA to a worksheet gives the wrong value

當我將VBA中的日期寫入Excel工作表時,有時工作表上的值最終比我預期的少一個(比前一天早)。 這是我在使用Excel 2003,2007和2010的多台計算機上測試過的示例。從即時窗口:

?Format(41652.9999999963, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:00

[A1].value = CDate(41652.9999999963)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-13 00:00:00

[A1].value = CDbl(CDate(41652.9999999963))
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:00

究竟是什么引發了這個

編輯:

好的,讓我更清楚一點, 這不是一個四舍五入的問題。 如果我上升或下降一小時,我得到正確的時間。 只是如果我接近這個確切的數字,那么日期就會消失一整天:

[A1].value = CDate(41652.99999)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-13 23:59:59

[A1].value = CDate(41652.999999999996)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-13 00:00:00

[A1].value = CDate(41652.999999999997)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:00

[A1].value = CDate(41653.00001)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:01

正如CDate的幫助中所述,“CDate識別日期文字和時間文字以及屬於可接受日期范圍內的一些數字。將數字轉換為日期時, 整數部分將轉換為日期任何小數部分該數字從午夜開始轉換為一天的時間 。“ 它永遠不會說到第二天的時間增加了日期! 我相信這解決了這個謎。

事實上,您可以自己使用圓形來獲得所需的結果。 測試表明,9位是舍入的最高數字,10位提供了不良影響......

ex [a1]=cdate(round(41652.9999999999,8)) - > 14/01/14 00:00

[a1]=cdate(round(41652.9999999999,10)) - > 13/01/14 00:00

評論后添加代碼:

Sub dower() 

Dim v1 As Double, vdt As Date, vv As Variant, vdbl As Double
Range("a1:a6").ClearContents

v1 = 41652.9999999996
vdt = CDate(v1)
vv = CDate(v1)
vdbl = CDate(v1)

[a1] = v1
[a2] = vdt
[a3] = vv
[a4] = vdbl

vdt = CDbl(v1)
[a5] = vdt

End Sub

單元格值和cdate都具有足夠的精度來記錄此值:41652.9999999963。

?CDate(41652.9999999963) = 41652.9999999963
True
[A1].Value=cdbl(CDate(41652.9999999963))
?[A1].Value= 41652.9999999963
True

所以我認為當用戶將cdate分配給單元格值時,這應該是一個Excel缺陷。

雖然我們不知道它的詳細實現,但我猜它可能看起來像:

[A1].Value=StringToDate(DateToString(CDate(41652.9999999963)))

當我們這樣做

[A1].Value=CDate(41652.9999999963))

並且“DateToString”函數不做正確的事情:它將41652.9999999963分為41652和.9999999963兩部分,並使用41652計算日期部分(“2014-1-13”),並使用.9999999963計算其余部分(“1天0:0:0”),最后,它們合並為一個值“2014-1-13 0:0:0”,但“1天”丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM