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

时间:2018-11-17 04:51:04

标签: 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) 

让我们在“本地”窗口中查看:

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)

我得到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))

v2v5中,日期类型变为字符串类型。并且所有字符串都是正确的(“ 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中使用织补日期。)

1 个答案:

答案 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

张图片

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