【问题标题】:Excel/VBA converts dates to American format on transpose/paste from VBAExcel/VBA 在从 VBA 转置/粘贴时将日期转换为美国格式
【发布时间】: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-AAlt-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 中使用该死的日期。)

【问题讨论】:

  • 感谢蒂姆·威廉姆斯的评论。我没能找到那个。我的可能被称为副本。到目前为止,我只能浏览该线程,但我的第一反应是坚持我目前的工作,即简单地避免转置日期。现在我正在制作 (1xnum, 1x1) 数组。稍后,如果遇到更多问题,我将只使用字符串而不是日期。感谢您的链接。

标签: excel vba date format transpose


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Dy.Lee 的回复。我认为正是 Transpose 函数使日期行为异常。如果您很好奇,可以尝试在粘贴到工作表之前转置一组日期。 (或者也许使用您自己的特定设置组合,行为可能看起来很自然。)@Tim Williams 上面评论中的链接捕获了确切的问题。
  • @RomnieEE,你是对的。我发现当我转置日期格式的数组时,它会变为字符格式。防止这种情况的一种方法是将矩阵转换为代码。我附上了我的意见。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2017-10-21
相关资源
最近更新 更多