excel 在另一个电子表格中复制粘贴值时,VBA将英国日期更改为美国日期的问题

55ooxyrt  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(98)

我有一段代码,可以打开最近的电子表格,复制数据,并将其粘贴到主文件中。两个文件中的E列都有日期,总是英国格式。
但是,当将数据从最近的电子表格粘贴到主电子表格时,日期会转换为US格式,例如02/10/2022是2022年10月2日,单元格值为44836,但它被粘贴为10/02/2022,粘贴为10 FEB 2022单元格值44602。这是整个专栏都受到影响。
我见过其他用户在这方面挣扎,并尝试将格式设置为文本,将格式设置为日期,添加新列等,但没有任何解决方案。
我认为问题就在这一步:

Workbooks.Open Filename:=MyDir & myMostRecentFile
    Range("A1").AutoFilter Field:=3, Criteria1:="PRD"
    Range("A2", Range("A2").End(xlToRight).End(xlDown)).Copy
    wb.Sheets("D").Range("A70").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
ActiveWorkbook.Close savechanges:=False

字符串
我尝试了一些方法(没有成功):

Columns("E").Copy
Columns("E").PasteSpecial Paste:=xlPasteValues
Columns("E").NumberFormat = "@"
Range("E1", Range("E" & Rows.Count).End(xlUp)).NumberFormat = "dd/mm/yyyy"


如果需要,请输入完整代码:

Sub D_ImportAutoReport()

Dim myFile As String, myRecentFile As String, myMostRecentFile As String
Dim recentDate As Date
Dim MyDir As String
Dim fileExtension As String
Dim fileFilter As String
Dim wb As Workbook
Dim wbImp As Workbook

Application.ScreenUpdating = False

Set wb = ThisWorkbook
wb.Sheets("D").Range("A70:Q337").ClearContents

MyDir = "Q:\TEST\Scheduled Reports\"
fileExtension = "*.csv*"
fileFilter = "PRD*"

myFile = Dir(MyDir & fileFilter & fileExtension)

If myFile <> "" Then
    myRecentFile = myFile
    recentDate = FileDateTime(MyDir & myFile)
        Do While myFile <> ""
            If FileDateTime(MyDir & myFile) > recentDate Then
                myRecentFile = myFile
                recentDate = FileDateTime(MyDir & myFile)
            End If
            myFile = Dir
        Loop
End If

myMostRecentFile = myRecentFile

Workbooks.Open Filename:=MyDir & myMostRecentFile
    Range("A1").AutoFilter Field:=3, Criteria1:="PRD"
    Range("A2", Range("A2").End(xlToRight).End(xlDown)).Copy
    wb.Sheets("D").Range("A70").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
ActiveWorkbook.Close savechanges:=False

Application.ScreenUpdating = True
End Sub

k5hmc34c

k5hmc34c1#

如果粘贴的数据看起来像我上面假设的那样(并且你没有确认/不确定...),你可以根据需要使用下一个函数来转换它:

Function convertUSStr_DateToUK(arr As Variant) As Variant
    Dim arrConv, arrStrD, i As Long
    ReDim arrConv(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arrConv)
        If IsNumeric(arr(i, 1)) Then
            arrConv(i, 1) = DateSerial(Year(arr(i, 1)), Day(arr(i, 1)), Month(arr(i, 1)))
        Else
            arrStrD = Split(arr(i, 1), "/")
            arrConv(i, 1) = DateSerial(CLng(arrStrD(2)), CLng(arrStrD(0)), CLng(arrStrD(1)))
        End If
    Next i
    convertUSStr_DateToUK = arrConv
End Function

字符串
你可以用下一种方式使用它:

Private Sub testConvertUSStr_DateToUK()
     Dim sh As Worksheet, lastR As Long, arrD
     Const col As String = "B" 'use here your column to convert its Date
     
     Set sh = ActiveSheet
     lastR = sh.Range(col & sh.rows.count).End(xlUp).row
     
     arrD = sh.Range(col & 2 & ":" & col & lastR).Value2 'Date is taken as number...
     arrD = convertUSStr_DateToUK(arrD)
     'drop the converted array content and format it appropriately:
     With sh.cells(2, col).Offset(, 1).Resize(UBound(arrD), 1)
            .Value2 = arrD
            .NumberFormat = "dd/mm/yyyy"
     End With
End Sub

46scxncf

46scxncf2#

我也有同样的问题。感谢FaneDuru的回答。然而,我发现我需要做以下代码调整(我不能提供这作为评论,因为我没有足够的声誉)。我并不是说这是一个不同的答案。这可能是我的调整是不优雅的,可以做得更好,因为我是相当新的VBA,但代码现在适用于我的情况下,我粘贴数据从浏览器显示的表(与英国格式的日期),并发现Excel是治疗日期作为FaneDuru inidicated以上。也就是说,当day值>12时,日期被粘贴为文本不变,但当day值<=12时,文本被转换为日期格式,假设源文本是美国格式的日期(无论Windows本地化设置如何)。
我改变了函数中的第二个DateSerial()调用(即其他情况下,单元格内容被检测为不是数字是在一般文本格式),因为在呼叫中使用的顺序在答案是(我认为)为美国格式的日期。OP指定他们的源日期(文本)都是英国格式(我的情况也是如此)。

Function convertUSStr_DateToUK(arr As Variant) As Variant
    Dim arrConv, arrStrD, i As Long
    ReDim arrConv(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arrConv)
        If IsNumeric(arr(i, 1)) Then
            arrConv(i, 1) = DateSerial(Year(arr(i, 1)), Day(arr(i, 1)), Month(arr(i, 1)))
        Else
            arrStrD = Split(arr(i, 1), "/")
            arrConv(i, 1) = DateSerial(CLng(arrStrD(2)), CLng(arrStrD(1)), CLng(arrStrD(0)))
        End If
    Next i
    convertUSStr_DateToUK = arrConv  
End Function

字符串
我还更改了子例程中的“With sh.Cells(2,col).Offset(,0).Resize(UBound(arrD),1)”行,以便Offset为(,0)而不是(,1),因为我发现在原始代码中,更正后的值被粘贴到下一列(这可能是故意的)。此调整是为了使最终输出仅在原位校正日期。

Private Sub testConvertUSStr_DateToUK()
     Dim sh As Worksheet, lastR As Long, arrD
     Const col As String = "D" 'use here your column to convert its Date
     
     Set sh = ActiveSheet
     lastR = sh.Range(col & sh.Rows.Count).End(xlUp).Row
     
     arrD = sh.Range(col & 2 & ":" & col & lastR).Value2 'Date is taken as number...
     arrD = convertUSStr_DateToUK(arrD)
     'drop the converted array content and format it appropriately:
     With sh.Cells(2, col).Offset(, 0).Resize(UBound(arrD), 1)
            .Value2 = arrD
            .NumberFormat = "dd/mm/yyyy"
     End With
End Sub

相关问题