【问题标题】:Excel Passing Wrong Date Value to VBA FunctionExcel将错误的日期值传递给VBA函数
【发布时间】:2014-03-06 15:21:41
【问题描述】:

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

我有一个接受日期参数的 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 之间的界面是否有一些我不熟悉的怪癖?

【问题讨论】:

  • 发布您的一些代码将帮助我们帮助您:)
  • 这些日期值是计算出来的吗?
  • 你不应该使用单词time作为变量名,因为它是一个reserved keyword。我不是说这是问题的根源,但肯定没有帮助:)
  • 所以在工作表中,值 ACTUALLY 1/2/1900 1:09:25 PM 还是其他日期格式?喜欢看单元格,它的确切文本是什么?
  • 编辑栏显示1/2/1900 1:09:25 PM,但格式化文本为61:09:25

标签: excel vba


【解决方案1】:

它会出现的!由于某种原因,excel 中存在一个错误,其中 1990 年被错误地解释为闰年 - 这里提到:How to represent a DateTime in Excel 在接受的答案中。我在自己的一张纸上进行了测试,将日期从 1900 年 1 月 1 日到 1901 年 12 月 31 日,然后我像这样使用 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 日开始,日期一直排到我在 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         

所以!您可能需要该功能的一部分来检查日期,从 1899 年 12 月 31 日到 1900 年 2 月 28 日,您需要将这一天向上移动 1。

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

【讨论】:

  • 这很模糊!谢谢!
  • 欢迎您,它完全晦涩难懂!我不知道为什么 excel 还没有修复这样的错误,但是是的。
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多