我现在在英国工作。我认为我已经在区域设置中进行了设置(在公司环境中为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)
让我们在“本地”窗口中查看:
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)
我得到Excel值“ 1/10/2018”和“ 1/11/2018”,相差31天。哪个是对的。
但是,如果我这样做(带有Transpose的列数组):
wb.Range(rgOutput.Offset(3, 6), rgOutput.Offset(2 + lgNumTerms, 6)) = Application.Transpose(p_dtTermArray)
前两个值是“ 10/01/2018”和“ 11/01/2018”(减为1)。因此,十月和十一月变成了一月和一月。这是错误的。让我们也把它扔进去(一个行数组,没有Transpose):
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
中,日期类型变为字符串类型。并且所有字符串都是正确的(“ Oct and Nov”分别为“ 1/10/2018”,“ 1/11/2018”)。
因此由于某些原因,Excel / VBA在这些字符串上使用了错误的区域设置。如果我在两个单元格中键入“ 1/10/2018”和“ 1/11/2018”并减去它们,我得到31。但是当我的转置数组将相同的两个字符串放入两个单元格时,它们显示为“ 10 / 01/2018”和“ 11/01/2018”(并减去1)。粘贴的字符串将被读取为美国日期,然后转换为英国。
在一个非常特定的上下文中,我不知道在其他地方可以找到什么来控制这些字符串的误读。
是为了避免带日期的转置(还有什么?为列矢量手动转置(当您需要灵活地执行行或列时)吗?)?(在上述所有示例中,工作表中的日期都具有“通用”格式。我曾尝试在粘贴之前和之后在单元格上使用日期格式,但没有任何改善。在执行类似工作的时间和地点不同,我的做法是避免在Excel单元格中使用日期,并隐藏我的字符串本应是日期的事实(制作格式为MMM.YY的字符串),以避免Excel更改它们。这次,我认为这样做可能会很不错在织补Excel中使用织补日期。)
答案 0 :(得分:1)
如果您未指定单元格格式,则该日期似乎已被该国家/地区格式的日期格式替换。您可能想适当地设置单元格的格式。
根据我的测试,当我设置日期值,将单元格格式指定为UK或US,然后将值放回变量中时,它似乎可以自动识别。
我们地区的默认日期格式为yyyy-mm-dd。
测试代码
Sub test()
Dim p_dtTermArray() As Date
Dim vR() As Long
Dim lgnumterms As Integer
lgnumterms = 2
ReDim p_dtTermArray(1 To lgnumterms)
p_dtTermArray(1) = DateSerial(2018, 10, 1)
p_dtTermArray(2) = DateSerial(2018, 11, 1)
ReDim vR(1 To lgnumterms)
vR(1) = DateSerial(2018, 10, 1)
vR(2) = DateSerial(2018, 11, 1)
With Range("a1").Resize(1, 2)
.Value = p_dtTermArray
.NumberFormatLocal = "dd-mm-yyyy"
End With
With Range("a2").Resize(1, 2)
.Value = vR
.NumberFormatLocal = "mm-dd-yyyy"
End With
Dim vDB, vDB2
vDB = Range("a1").Resize(1, 2)
vDB2 = Range("a2").Resize(1, 2)
End Sub
张图片
“本地”窗口
我发现转置日期格式的数组时,它会更改为字符格式。防止这种情况的一种方法是将矩阵转换为代码。
Sub test()
Dim p_dtTermArray() As Date
Dim vR() As Long
Dim lgnumterms As Integer
Dim r As Long, c As Long, i As Long, c As Long
lgnumterms = 2
ReDim p_dtTermArray(1 To lgnumterms)
p_dtTermArray(1) = DateSerial(2018, 10, 1)
p_dtTermArray(2) = DateSerial(2018, 11, 1)
ReDim vR(1 To lgnumterms)
vR(1) = DateSerial(2018, 10, 1)
vR(2) = DateSerial(2018, 11, 1)
With Range("a1").Resize(1, 2)
.Value = p_dtTermArray
.NumberFormatLocal = "dd-mm-yyyy"
End With
With Range("a2").Resize(1, 2)
.Value = vR
.NumberFormatLocal = "mm-dd-yyyy"
End With
Dim vDB, vDB2, vD() As Long, vD2() As Long
vDB = Range("a1").Resize(1, 2).Value
vDB2 = Range("a2").Resize(1, 2).Value
r = UBound(vDB, 1)
c = UBound(vDB, 2)
ReDim vD(1 To c, 1 To r)
ReDim vD2(1 To c, 1 To r)
For i = 1 To r
For j = 1 To c
vD(j, i) = vDB(i, j)
vD2(j, i) = vDB2(i, j)
Next j
Next i
Range("d1").Resize(2) = vD
Range("f1").Resize(2) = vD2
End Sub