2017-09-21 68 views
0

免責聲明:這是一個相當具體的錯誤,我想我在Excel中遇到了,但它很奇怪,我永遠找不到解決它的答案,如果它甚至可能,如果我不不要在這裏發佈。這是一件很有趣的事情,儘管對我很感興趣。VBA Excel:我是否發現Excel在1900年處理「閏年」的錯誤? (這實際上並不是閏年)

因此,我寫了一些代碼,當我輸入B列時,可以在列A中捕獲一個時間戳。這很好。我添加了一點,所以它會提示用戶,如果他們確定他們想要在輸入後更改條目,以保持時間戳的完整性。這也適用。

在測試過程中,我遇到了一個問題,但是。如果我只是在列A中輸入一個數字,例如數字5,它會強制它以1/5/1900 00:00的格式。對我來說很有意義,因爲Excel明確選擇1900作爲任意的起點。但是如果我嘗試編輯這個日期,提示詢問我是否要更改它顯示爲1/4/1900(截圖如下)。最長的時間我無法弄清楚它爲什麼會減1。我意識到任何輸入在1到60之間(日期1到2)都會導致這個問題。在3/1/1900之後的任何日期都提示我正確。我做了一些挖掘工作,發現1900年並沒有閏年,所以60號應該解析爲3/1/1900,而是在Excel中翻到2/29/1900。

我知道這是一個小問題,隻影響列A中的60個可能的條目,但我覺得無奈修復它,因爲問題似乎是Excel如何計算1900年的閏年,而不應該這樣做。有沒有人有解決方法,或至少確認這是Excel問題而不是我的代碼?

Screenshot of 3 cases of editing column A.

第1和第3的結果也在意料之中。中間的一個顯示,即使前一個字段實際上是1月5日,提示會顯示爲1月4日。如果有人想要嘗試相同的事情,我會發佈下面的代碼。

Private lastVal As Variant 

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim timeCol, taskCol As Integer 
Dim sRow, sCol As Integer 
Dim currentCell As Range 

timeCol = 1 
taskCol = 2 

sRow = Target.row 
sCol = Target.Column 

Set currentCell = Cells(sRow, sCol) 

'Checks for timestamp or task column. If Cell wasn't empty, prompt user to 
'confirm the change 
If sCol = timeCol Or sCol = taskCol Then 
    If lastVal <> "" Then 

     response = MsgBox("Old Value: " & lastVal & Chr(10) & Chr(10) _ 
       & "New Value: " & Cells(sRow, sCol) & Chr(10) & Chr(10) _ 
       & "Are you sure you want to make this change?", _ 
       vbYesNo + vbQuestion, "Change Confirmation") 
     If response = vbYes Then 
      'Do nothing 
     Else 
      'Reject the change 
      Application.EnableEvents = False 
      currentCell = lastVal 
      Application.EnableEvents = True 
     End If 
    End If 
End If 

'Checks for task column. If timestamp cell at current row is empty 
'and something was entered into task column, fills timestamp cell 
If sCol = taskCol Then 
    If Cells(sRow, timeCol) = "" = True Then 
     If currentCell <> "" Then 
      Application.EnableEvents = False 
      Cells(sRow, timeCol) = Now() 
      Application.EnableEvents = True 
     End If 
    End If 
End If 

End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim sRow, sCol 
    Dim currentCell As Range 

    sRow = Target.row 
    sCol = Target.Column 


    Set currentCell = Cells(sRow, sCol) 
    lastVal = currentCell 

End Sub 
+1

的可能的複製[有沒有在有關日期Excel中的漏洞?](https://stackoverflow.com/questions/13722566/is-there-a-bug-in-excel-concerning -dates) – Enigmativity

回答

1

這就是:

當Lotus 1-2-3首次發佈,該計劃假定1900年是閏年,即使它實際上不是閏年。這使得程序更容易處理閏年,並且幾乎不會對Lotus 1-2-3中的所有日期計算造成傷害。

當Microsoft Multiplan和Microsoft Excel發佈時,他們還認爲1900年是閏年。這個假設允許Microsoft Multiplan和Microsoft Excel使用Lotus 1-2-3使用的相同的序列日期系統,並提供與Lotus 1-2-3更大的兼容性。將1900作爲閏年對待,使用戶可以更輕鬆地將工作表從一個程序移動到另一個程序。

雖然技術上可以糾正此問題,以便當前版本的Microsoft Excel不會假定1900是閏年,但這樣做的缺點超過了優勢。

https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year

+0

也許他們會在下一次宇宙循環時修復它....大聲笑 – jsotola

+0

@jsotola - 我認爲他們只是爲了向後兼容的原因保留當前的宇宙。 – Enigmativity