不同格式的VBA粘贴数组日期值

时间:2019-07-04 13:56:03

标签: arrays excel vba

我有一个简单的宏,其中包含一个动态数组,可以满足条件。数据将按预期运行的方式填充宏,直到将数据粘贴到电子表格上为止。现在,除日期值外,所有数据均已正确粘贴。日期值从欧洲格式错误地粘贴到电子表格(即dd-mm-yyyy到mm-dd-yyyy)上。因此,例如,电子表格上的2019年3月1日变为2019年1月3日。请注意,无论我是否事先格式化目标文件,仍然会出现问题。

该数组有14列,只有12-13列是日期值。

编辑摘要

从无关信息中切碎代码;添加了结果图像。

以下是代码

Sub Verification()
    Dim NewWorkbook As String, NewWorksheet As String
    Dim wb As Workbook, sh As Worksheet
    Dim LoopCounter As Long
    Dim NewEntryCounter As Long
    Dim Cols As Long, Rows As Long
    Dim r As Range
    Dim arr As Variant, NewEntry() As Variant
    Dim myRange As Integer

    NewWorkbook = LCase(InputBox("What is the name of the new report?"))
    NewWorksheet = LCase(InputBox("What is the name of the sheet?"))
    Set wb = ThisWorkbook
    Set sh = wb.Sheets("Renouvellement")

        Cols = Workbooks(NewWorkbook).Sheets(NewWorksheet).Range(Workbooks(NewWorkbook).Sheets(NewWorksheet).Cells(1, 1), Workbooks(NewWorkbook).Sheets(NewWorksheet).Cells(1, 1).End(xlToRight)).Count
        Rows = sh.Range(sh.Cells(1, 1), sh.Cells(1, 1).End(xlDown)).Count

        For Each r In Workbooks(NewWorkbook).Sheets(NewWorksheet).Range("A2", Workbooks(NewWorkbook).Sheets(NewWorksheet).Range("A1").End(xlDown))
        If (r.Offset(0, 21).Text = "Red" Or r.Offset(0, 21).Text = "Blue") And r.Offset(0, 17).Value >= 24 Then
            arr = Application.VLookup(r.Value, sh.Range("A:A"), 1, 0)

            If IsError(arr) Then
                NewEntryCounter = NewEntryCounter + 1
                ReDim Preserve NewEntry(1 To Cols, 1 To NewEntryCounter)
                For LoopCounter = 1 To Cols
                    NewEntry(LoopCounter, NewEntryCounter) = r.Offset(0, LoopCounter - 1)
                Next LoopCounter
            Else

End Sub

在“本地”窗口中抽样结果

enter image description here

将日期值传输到电子表格时的采样结果

enter image description here

如您所见,将数据从vba传输到电子表格时,插入的第一个值已更改。第二个值已正确传输。第三个不是,依此类推。

1 个答案:

答案 0 :(得分:0)

同样,我很难确切地了解您在做什么,但就复制相关数据而言,似乎筛选器可能更简单。

在您的代码中,您将多次调用工作表,并对VBA阵列进行了多个Redim Preserve操作。这些操作可能会很昂贵。

也许可以用(例如,显然,您可能需要更改工作表和范围变量)来简化(并加速)部分代码:

Set ws = Worksheets("sheet1")
Set r = ws.Range("a1").CurrentRegion
With r
    .AutoFilter field:=22, Criteria1:="red", Operator:=xlOr, Criteria2:="blue"
    .AutoFilter field:=18, Criteria1:=">=24"
End With

r.SpecialCells(xlCellTypeVisible).Copy

'Paste somewhere

ws.ShowAllData