【问题标题】:VBA pasting array date values in different formatVBA以不同格式粘贴数组日期值
【发布时间】:2019-07-04 13:56:03
【问题描述】:

我有一个简单的宏,其中包含一个动态数组,该数组在满足条件时填充。数据填充宏,因为它应该正在运行,直到将数据粘贴到电子表格上。现在,所有数据都已正确粘贴,日期值除外。日期值被错误地从欧洲格式粘贴到美国格式到电子表格上(即 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

来自本地窗口的示例结果

将日期值传输到电子表格时的示例结果

正如您所见,在将数据从 vba 传输到电子表格时,插入的第一个值发生了变化。第二个值被正确传输。第三个不是,依此类推。

【问题讨论】:

  • 粘贴日期的目标列的格式是什么?您的 Windows 区域设置短日期格式是什么(我怀疑 DMY 或类似的)。
  • 那些更改的日期如果颠倒过来将不是有效日期(例如,在第二个数据点上没有第 13 个月)。这就解释了为什么有些日期会改变。正如在其他 cmets 中提到的,数据的显示方式取决于应用于单元格的格式。这与代码无关 - 信息被正确传递。宏运行后,选择此列,然后转到格式化/格式化单元格。查看“数字”选项卡,您可能会发现“区域设置”不是您认为的那样。更改语言环境,看看是否会有所不同?
  • @CindyMeister 我认为你做对了。一旦粘贴到电子表格上,这些值就会变得混乱。我查了一下,13 号以上的天数以一般格式存储
  • @RonRosenfeld 我无法访问 Windows 区域设置,因为我没有权限
  • 更新:如果我在 Excel 单元格中插入随机日期,例如 01/07/2018,我会遇到错误“检测到不明确的名称:验证日期”

标签: arrays excel vba


【解决方案1】:

同样,我有点难以准确理解您在做什么,但似乎过滤器可能更简单,就相关数据的复制而言。

在您的代码中,您对工作表进行了多次调用,并对 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2013-11-03
    相关资源
    最近更新 更多