Excel/VBA 在从 VBA 转置/粘贴时将日期转换为美国格式

标签 excel vba date format transpose

我现在在英国环境中工作。我想我已经在区域设置中设置了(企业环境中的 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))

v2v5 , 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 中。)

最佳答案

如果您不指定单元格格式,它似乎会被替换为该国家/地区格式的日期格式。您可能希望适本地格式化单元格。

根据我的测试,当我设置日期值时,它似乎会自动识别,将单元格格式指定为英国或美国,然后将值放回变量中。

我们地区的默认日期格式为 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

工作表图像

enter image description here

本地人窗口

enter image description here

我发现当我转置日期格式的数组时,它会变为字符格式。防止这种情况的一种方法是将矩阵转换为代码。
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

enter image description here

关于Excel/VBA 在从 VBA 转置/粘贴时将日期转换为美国格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348333/

相关文章:

.net - 如何从 VB.Net 读取 Excel 单元格

vba - 禁用 Microsoft Word "Show Repairs"对话框

php - 闰年的最后一天,第 53 周还是第 1 周?

django - 将日期转换为日期时间

java - 在Java中获取两个日期之间的精确差异

sql - 计算列中的特定子字符串文本

excel - 有没有一种快速的方法可以从 VBA 的 Range 中获取列字母?

excel - 使用VBA循环遍历每一列并从大到小排序

xml - VBA - 显示每个节点及其来自 XML 的值

excel - 使用公式设置 Excel 单元格中文本子集的格式