2014-03-06 76 views
0

我有一个带有日期值的工作表。 Excel将其正确解释为日期。Excel将错误的日期值传递给VBA函数

我有一个接受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的界面中是否有一些我不熟悉的怪癖?

+0

发布您的一些代码可以帮助我们帮助您:) –

+0

这些日期值如何计算? – David

+0

因为它是** [保留关键字](http://msdn.microsoft.com/zh-cn/library/aa445227(v = vs.60)),所以不应该使用“time”这个词作为变量名。 ASPX)**。我不是说这是问题的根源,但肯定没有帮助:) –

回答

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 

,并从01/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 

但随后开始1990年1月3日全部一字排开一路其中i停在结束日期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!您可能需要一部分功能来检查日期,并且从31/12/1899到28/02/1900您需要将日期提升为1.

*您会注意到第二组显示的日期,右侧,都格式化为mm/dd/yyyy - 我不知道为什么excel会这么做......

+0

这是晦涩的!谢谢! –

+0

您的欢迎,其总晦涩难懂!我不知道为什么excel没有修复这样的bug,但是是的。 – user1759942