2015-01-11 78 views
6

Khi tôi sử dụng datevalue thức ("01/01/1900") tôi nhận được 1 và định dạng như một ngày nó cho thấy là 01/01/1900Lỗi trong VBA DateValue() trong VBA Excel?

Khi tôi sử dụng VBA

.Range("A1").Value = DateValue("01/01/1900") 

nó cho thấy vào "02/01/1900" trong ô

Làm cách nào có thể?

Nếu tôi sử dụng ví dụ

.Range("A1").Value = DateValue("01/01/1901") 

nó hoạt động tốt!

Đầu bị tan chảy !!!

Microsoft trạng thái đó - "Sử dụng hệ thống ngày mặc định trong Microsoft Excel cho Windows, lập luận DATE_TEXT phải đại diện cho một ngày giữa ngày 01 Tháng 1 năm 1900 và 31 tháng 12, 9999"

+0

[Ngày của tuần trước 01 tháng 3 năm 1900 là không chính xác trong Excel] (http://support.microsoft.com/kb/214058/en-us) – GSerg

+3

thể trùng lặp của [Tại sao các ngày trong tuần Excel sai cho 1900?] (http://superuser.com/questions/481496/why-are-excel-weekdays-wrong-for-1900) – GSerg

+1

liên kết cho biết WeekDay, Không chắc tại sao điều này sẽ ảnh hưởng đến DateValue? cũng là các tế bào nói 02/01/1900 nhưng biên tập viên VBA nói 01/01/1900 trên tooltip nhưng nó thực sự là 02/01/1900 nó được sử dụng để so sánh - .Range ("A1"). "02/01/1900" tương đương với sự thật nhưng ô nói 02/01/1900 - lỗi là địa ngục –

Trả lời

4

Nói tóm lại, DateTime kỷ nguyên của Excel không phải là giống như kỷ nguyên DateTime của VBA. Mặc dù, họ như cũ khi bạn vượt qua 28 tháng 2, 1900.

Từ Joel Spolksy's blog:

Trong hầu hết các môi trường lập trình hiện đại, ngày tháng được lưu trữ như số thực. Phần nguyên của số là số ngày kể từ ngày một số ngày đã thỏa thuận trong quá khứ, được gọi là kỷ nguyên. Trong Excel, ngày nay ngày , ngày 16 tháng sáu năm 2006, được lưu giữ như 38.884, đếm ngày mà tháng một 1st, 1900 là 1.

tôi bắt đầu làm việc thông qua các hàm ngày tháng và thời gian khác nhau trong cơ bản và ngày và thời gian chức năng trong Excel, khi tôi nhận thấy điều gì đó lạ trong tài liệu Visual Basic: Cơ bản sử dụng ngày 31 tháng 12 năm 1899 làm kỷ nguyên thay vì ngày 1 tháng 1 năm 1900, nhưng vì lý do nào đó, ngày hôm nay giống nhau trong Excel giống như ở số Cơ bản.

Huh?

Tôi đã đi tìm một nhà phát triển Excel đủ lớn để nhớ lý do tại sao. Ed Fries dường như biết câu trả lời.

"Ồ," anh ấy nói với tôi. "Kiểm tra ngày 28 tháng 2 năm 1900."

"Đó là 59", tôi nói.

"Bây giờ hãy thử ngày 1 tháng 3."

"It's 61!"

"Điều gì đã xảy ra với 60?" Ed hỏi.

"ngày 29 tháng 2 năm 1900 là năm nhuận! Nó chia hết cho 4!"

"Đoán tốt, nhưng không có xì gà", Ed nói và để tôi tự hỏi trong khi.

Rất tiếc. Tôi đã làm một số nghiên cứu.Số năm chia hết cho 100 không được chia chonăm nhuận, trừ khi chúng cũng chia hết cho 400.

1900 không phải là năm nhuận.

"Đó là lỗi trong Excel!" Tôi kêu lên.

"Ồ, không thực sự", Ed nói. "Chúng tôi phải làm theo cách đó bởi vì chúng tôi cần để có thể nhập Lotus 123 trang tính".

"Vì vậy, đó là lỗi trong Lotus 123?"

"Vâng, nhưng có lẽ là một chủ ý. Lotus phải phù hợp với 640K. Đó không phải là nhiều bộ nhớ. Nếu bạn bỏ qua 1900, bạn có thể tìm ra nếu một năm nhất định chỉ là một năm nhuận xem nếu đúng nhất hai bit là 0. Điều đó thực sự nhanh chóng và dễ dàng.Các chàng trai Lotus có lẽ đã tìm ra nó không quan trọng là sai cho hai tháng cách trong quá khứ. Có vẻ như những kẻ cơ bản muốn được hậu môn khoảng hai tháng đó, vì vậy họ đã di chuyển kỷ nguyên một ngày trở lại. "

"Aargh!" Tôi nói, và đi học tại sao có một hộp kiểm trong hộp thoại tùy chọn gọi là 1904 Date System.


Thông tin dưới đây được lấy từ this Super User answer.


Như đã trình bày trong Microsoft KB 214058:

Days of the week before March 1, 1900 are incorrect in Excel

THÊM THÔNG TIN

Khi hệ thống ngày trong Microsoft Excel ban đầu được tạo ra, nó được thiết kế để tương thích hoàn toàn với ngày các hệ thống được sử dụng bởi các chương trình bảng tính khác.

Tuy nhiên, trong hệ thống ngày này, năm 1900 được hiểu sai là năm nhuận. Vì không có ngày 29 tháng 2 ("ngày nhuận") vào năm 1900, ngày trong tuần cho bất kỳ ngày nào trước ngày 1 tháng 3 năm 1900 (ngày sau "ngày nhuận"), không được tính chính xác.

"Các chương trình bảng tính khác" tham chiếu đến Lotus 1-2-3, khá phổ biến vào thời điểm đó và giả định không chính xác năm 1900 là năm nhuận. Này được giải thích một cách chi tiết hơn trong KB 214326:

Excel 2000 incorrectly assumes that the year 1900 is a leap year

THÊM THÔNG TIN

Khi Lotus 1-2-3 lần đầu tiên được phát hành, chương trình cho rằng năm 1900 là một năm nhuận, mặc dù nó thực sự không phải là một năm nhuận. Điều này giúp chương trình xử lý các năm nhuận dễ dàng hơn và không gây hại cho hầu hết các tính toán ngày trong Lotus 1-2-3.

Khi Microsoft Multiplan và Microsoft Excel được phát hành, họ cũng giả định rằng năm 1900 là năm nhuận.Giả định này cho phép Microsoft Multiplan và Microsoft Excel sử dụng cùng một hệ thống ngày nối tiếp được Lotus 1-2-3 sử dụng và cung cấp khả năng tương thích cao hơn với Lotus 1-2-3. Việc coi năm 1900 là một năm nhuận cũng giúp người dùng dễ dàng di chuyển các trang tính từ chương trình này sang chương trình khác.

Mặc dù về mặt kỹ thuật có thể khắc phục hành vi này để các phiên bản hiện tại của Microsoft Excel không cho rằng năm 1900 là năm nhuận, những nhược điểm của việc làm này lớn hơn những lợi thế.

Nếu hành vi này là để được sửa chữa, nhiều vấn đề sẽ nảy sinh, bao gồm:

  • Hầu như tất cả các ngày trong bảng tính Microsoft Excel hiện hành và các văn bản khác sẽ được giảm một ngày nào đó. Việc hiệu chỉnh ca làm việc này sẽ mất nhiều thời gian và công sức, đặc biệt là trong các công thức sử dụng ngày tháng.
  • Một số chức năng, chẳng hạn như hàm WEEKDAY, sẽ trả về các giá trị khác nhau; điều này có thể khiến công thức trong trang tính hoạt động không chính xác.
  • Việc sửa đổi hành vi này sẽ phá vỡ tính tương thích của ngày nối tiếp giữa Microsoft Excel và các chương trình khác sử dụng ngày tháng.

Nếu hành vi này vẫn uncorrected, chỉ có một vấn đề xảy ra:

  • Chức năng WEEKDAY trả về giá trị sai cho những ngày trước ngày 01 tháng 3, 1900. Bởi vì hầu hết người dùng không sử dụng ngày trước ngày 01 Tháng Ba năm 1900, vấn đề này rất hiếm.