【问题标题】:Copy and pasting with VBA nullifies formatting使用 VBA 复制和粘贴会使格式无效
【发布时间】:2018-02-28 16:40:35
【问题描述】:

我编写了一些 VBA 来将一些数据从一个工作簿复制并粘贴到另一个工作簿中:

Dim x As Workbook
Dim y As Workbook

' Open both workbooks
Set y = ActiveWorkbook
Set x = Workbooks.Open("Data.csv")

' Copy data from x
x.Sheets("SourceData").Range("A1", _
    x.Sheets("SourceData").Range("A1").End(xlDown).End(xlToRight)).Copy

' Paste to y
y.Sheets("Destination").Range("C4").PasteSpecial Paste:=xlPasteValues
y.Sheets("Destination").Range("C4").PasteSpecial Paste:=xlPasteFormats

这会将数据粘贴到正确的位置。

VBA 的下一步是按包含日期的第一列过滤数据表。但是,数据的粘贴将所有内容都转换为一般数据类型,但更重要的是似乎丢失了字段中字符串后面的“日期值”。例如,当我尝试格式化粘贴后的日期列时,没有其他格式类型会更改单元格中显示的内容(即转换为数字仍将显示 01/01/2018 而不是 43101)。这会导致过滤代码隐藏所有行,因为参数中没有日期(因为本质上没有日期)。我什至不能手动过滤日期(即没有 VBA)。

This image shows how the preview for each data type is still 20/02/2018.

每当我手动复制和粘贴数据时,它都可以正常工作,并且我可以以任何方式格式化日期。只有在使用 VBA 时才会出现格式问题。

在我尝试过的其他事情中:

  • 在复制/粘贴之前使用 VBA 格式化源工作表中的列
  • 复制/粘贴后使用 VBA 格式化目标工作表中的列
  • 将整个工作表移动到目标工作簿并从工作簿内复制/粘贴(移动工作表时格式丢失)
  • 粘贴值,然后在顶部粘贴格式
  • 对数据文件使用不同的文件格式

我想知道这个问题是否是由于 Excel 中的设置造成的?非常感谢任何帮助。

【问题讨论】:

  • 我怀疑您的 Windows 区域短日期设置是 MDY 的变体,您的工作簿 Data.csv 中的数据被格式化为文本;并且您 OPEN 而不是 IMPORT 原始 csv 文件,因此您永远没有机会正确格式化日期。如果是这样,我们必须回到源 csv 文件。

标签: vba excel


【解决方案1】:

沿用@tigeravatar 解决方案,但代码更简洁

Dim y As Workbook

Set y = ActiveWorkbook

With Workbooks.Open("Data.csv").Sheets("SourceData") 'open source workbook and reference its "SourceData" sheet
    With .Range("A1").CurrentRegion 'reference referenced sheet range "adjacent" to cell A1
        y.Sheets("Destination").Range("C4").Resize(.Rows.Count, .Columns.Count).value = .value
    End With
    .Close False
End With

【讨论】:

    【解决方案2】:

    不要复制/粘贴,直接设置值:

    Dim x As Workbook
    Dim y As Workbook
    Dim rCSVValues As Range
    
    ' Open both workbooks
    Set y = ActiveWorkbook
    Set x = Workbooks.Open("Data.csv")
    
    ' Copy data from x
    With x.Sheets("SourceData")
        Set rCSVValues = .Range("A1", .Range("A1").End(xlDown).End(xlToRight))
    End With
    
    ' Paste to y
    y.Sheets("Destination").Range("C4").Resize(rCSVValues.Rows.Count, rCSVValues.Columns.Count).Value = rCSVValues.Value
    

    【讨论】:

    • 刚试过这个,但问题仍然存在。我感觉工作簿存在问题,而不是现在的数据或 VBA。
    • 此时我们需要更多信息。您能否编辑您的原始帖子以提供示例数据(“x”csv 和“y”工作簿)和预期结果?我们还需要查看您的自动过滤器代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多