Excel将错误的日期值传递给VBA函数

时间:2014-03-06 15:21:42

标签: excel excel-vba vba

我有一个包含日期值的工作表。 Excel将它们正确地解释为日期。

我有一个接受Date参数的VBA函数。

当我从工作表中调用此函数时,有时它可以正常工作,有时则不然。当我在函数中设置一个断点来检查从一个不正确的单元格传递给函数的值时,我发现错误的日期被传递给函数 - 它是应该传递给函数的一天。时间值是正确的。

这发生在工作表上的随机位置。事实上,在昨天它无法正常工作的一个单元格中,它现在可以正常工作。

值的时间部分似乎没有区别。它可能是22:00,08:00,它仍然是一天。

这对任何人都有意义吗?我非常困惑。

修改

我没有发布任何代码,因为我发现它不是代码问题。但这是函数签名:

Function timeToDecimal(time As Date, semanticTimeFormat As String) As Double

在函数的第一行可执行代码上设置断点,我看到time例如是1/1/1900 1:09:25 PM,在工作表上显然是1/2/1900 1:09:25 PM

问题不在于我写的VBA代码。问题是Excel将数据传递给函数。在Excel和VBA之间的界面中是否有一些我不熟悉的怪癖?

1 个答案:

答案 0 :(得分:1)

它会出现!由于某种原因,excel中存在一个错误,其中1990被错误地解释为闰年 - 这里提到:How to represent a DateTime in Excel在接受的答案中。我在自己的一张纸上测试,把日期从01/01/1900到31/12/1901然后我用vba这样:

Sub test()


Dim str As String
Dim test As String
Dim test2 As String

test2 = ActiveCell.FormulaR1C1
test = ActiveCell.Value



While Not ActiveCell.FormulaR1C1 = ""
    str = ActiveCell.Value
    ActiveCell.Offset(0, 2).Value = str
    ActiveCell.Offset(1, 0).Activate

Wend



End Sub

从19/01/1900 - 01/03/1900那个日期已经过去了。由于vba而导致的日期都落后于电子表格中的日期:

01/01/1900 0:00     31/12/1899
02/01/1900 0:00     01/01/1900 0:00
03/01/1900 0:00     01/02/1900 0:00
04/01/1900 0:00     01/03/1900 0:00
05/01/1900 0:00     01/04/1900 0:00
06/01/1900 0:00     01/05/1900 0:00
07/01/1900 0:00     01/06/1900 0:00
08/01/1900 0:00     01/07/1900 0:00
09/01/1900 0:00     01/08/1900 0:00
10/01/1900 0:00     01/09/1900 0:00
11/01/1900 0:00     01/10/1900 0:00
12/01/1900 0:00     01/11/1900 0:00
13/01/1900 0:00 01/12/1900 0:00

然后从01/03/1990开始,所有日期都排成一直到我在1901年底停止的地方:

01/01/1901 0:00     01/01/1901 0:00         
02/01/1901 0:00     01/02/1901 0:00         
03/01/1901 0:00     01/03/1901 0:00         
04/01/1901 0:00     01/04/1901 0:00         
05/01/1901 0:00     01/05/1901 0:00         
06/01/1901 0:00     01/06/1901 0:00          
07/01/1901 0:00     01/07/1901 0:00         
08/01/1901 0:00     01/08/1901 0:00         
09/01/1901 0:00     01/09/1901 0:00         
10/01/1901 0:00     01/10/1901 0:00         
11/01/1901 0:00     01/11/1901 0:00         
12/01/1901 0:00     01/12/1901 0:00         

SO!你可能需要一部分功能来检查日期,从18/12/1899到28/02/1900,你需要将这一天提升一天。

*你会注意到显示的第二组日期,右边是全部格式化的mm / dd / yyyy - 我不知道为什么excel会这样做....