【发布时间】:2019-04-20 06:15:06
【问题描述】:
我现在在英国环境中工作。我想我已经在区域设置中设置了(企业环境中的 Windows 7,Excel 2016,ver 1803(我认为这也可能是 Office 365-?不管那是什么。))。我正在尝试使用 VBA 中的日期并将结果粘贴到 Excel 中。在开始和结束时,日期以英国格式处理。但在中间,Excel 坚持将它们转换为美国。粘贴:英国-> 美国-> 英国。
Dim p_dtTermArray() As Date
ReDim p_dtTermArray(1 To lgNumTerms)
p_dtTermArray(1) = DateSerial(2018, 10, 1)
p_dtTermArray(2) = DateSerial(2018, 11, 1)
让我们看看 Locals 窗口:
p_dtTermArray(1) #1/10/2018# Date
p_dtTermArray(2) #1/11/2018# Date
在粘贴之前,我已经清除了工作表,无论是手动使用Ctrl-A-A、Alt-E-A-A,还是使用...UsedRange.Clear 在代码中。
在我写这篇文章和尝试的时候,情况刚刚发生了变化。
如果我这样粘贴:
rgOutput.Offset(0, 0) = p_dtTermArray(1)
rgOutput.Offset(0, 1) = p_dtTermArray(2)
我得到“2018 年 1 月 10 日”和“2018 年 1 月 11 日”的 Excel 值,相差 31 天。哪个是对的。
但如果我这样做(列数组,带有转置):
wb.Range(rgOutput.Offset(3, 6), rgOutput.Offset(2 + lgNumTerms, 6)) = Application.Transpose(p_dtTermArray)
前两个值是“10/01/2018”和“11/01/2018”(减去 1)。所以十月和十一月变成了一月和一月。这是错误的。让我们把这个也扔进去(一个行数组,没有转置):
wb.Range(rgOutput.Offset(3, 7), rgOutput.Offset(3, 6 + lgNumTerms)) = p_dtTermArray
啊!现在他们进来了!:43374、43405(又是 31 分)!
所以它(部分)是由于转置!让我们试试吧:
Dim v1, v2, v3, v4, v5
v1 = p_dtTermArray
v2 = Application.Transpose(p_dtTermArray)
v3 = Application.Transpose(v1)
v4 = Application.Transpose(v2)
v5 = Application.Transpose(Application.Transpose(v1))
在v2 到v5 中,Date 类型变成了 String 类型。并且所有字符串都是正确的(“1/10/2018”、“1/11/2018”,用于 10 月和 11 月)。
因此,出于某种原因,Excel/VBA 对这些字符串使用了错误的区域设置。如果我在两个单元格中输入“1/10/2018”和“1/11/2018”,然后将它们相减,我得到 31。但是当我的转置数组将这两个相同的字符串放入两个单元格时,它们显示为“10/ 01/2018”和“11/01/2018”(并减去 1)。粘贴的字符串被读取为美国日期,然后转换为英国。
我不知道在一个非常特定的上下文中可以在哪里寻找可能控制对这些字符串的误读的原因。避免转置日期是否正确(以及,什么?手动转置列向量(当您需要灵活地执行行或列时)?)?
(在上面的所有示例中,工作表中的日期都是通用格式。我尝试在粘贴前后的单元格上使用日期格式,但没有任何改进。在不同的时间和地点进行类似的工作,我的做法是避免在 Excel 单元格中使用日期,并隐藏我的字符串应该是日期的事实(制作 MMM.YY 形式的字符串),以避免让 Excel 更改它们。这次我认为只是在该死的 Excel 中使用该死的日期。)
【问题讨论】:
-
感谢蒂姆·威廉姆斯的评论。我没能找到那个。我的可能被称为副本。到目前为止,我只能浏览该线程,但我的第一反应是坚持我目前的工作,即简单地避免转置日期。现在我正在制作 (1xnum, 1x1) 数组。稍后,如果遇到更多问题,我将只使用字符串而不是日期。感谢您的链接。
标签: excel vba date format transpose