首页 文章

使用VBA复制和粘贴会使格式化无效

提问于
浏览
1

我写了一些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中的设置?任何帮助非常感谢 .

2 回答

  • 0

    沿着@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
    
  • 1

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

    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
    

相关问题