VBA 不使用剪贴板复制单元格 + 格式化

VBA Copy Cells + Formatting without using the clipboard

我正在尝试将单元格从一个 sheet 复制到另一个单元格而不将内容复制到剪贴板,但它必须复制格式。

这是我目前尝试过的方法,有什么办法可以满足我的需求吗?

LastRow = ThisWorkbook.Sheets("Nas").Range("A65536").End(xlUp).Row

'Option 1, works but it's using the clipboard :/
ThisWorkbook.Sheets("Nas").Range("A" & 6 & ":F" & LastRow).Copy
ThisWorkbook.Sheets("Test").Range("A" & 6 & ":F" & LastRow).Offset(-5, 0).PasteSpecial

'Option 2, works but doesn't take formatting (ie text, general, time, date... etc)
Set Src = ThisWorkbook.Sheets("Nas").Range("A" & 6 & ":F" & LastRow)
Set Dst = ThisWorkbook.Sheets("Test").Range("A" & 6 & ":F" & LastRow).Offset(-5, 0).Resize(Src.Rows.Count, Src.Columns.Count)
Dst.Value = Src.Value

'Option 3, works but doesn't take formatting (ie text, general, time, date... etc)
ThisWorkbook.Sheets("Test").Range("A" & 6 & ":F" & LastRow).Offset(-5, 0) = ThisWorkbook.Sheets("Nas").Range("A" & 6 & ":F" & LastRow).Values

您的示例代码将 格式 定义为 "text, general, time, date... etc"。虽然 数字格式 (单元格 Properties 的子集)可以很容易地容纳,但可以进一步深入枚举大量属性和子属性当所有相关(非默认)属性可以使用剪贴板通过 copy/paste 操作轻松携带时,Cells 对象的使用会适得其反。

With ThisWorkbook.Sheets("Nas")
  LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
  ThisWorkbook.Sheets("Test").Range("A6:F" & LastRow).Offset(-5, 0) = _
    .Range("A6:F" & LastRow).Value
  ThisWorkbook.Sheets("Test").Range("A6:F" & LastRow).Offset(-5, 0).NumberFormat = _
    .Range("A6:F" & LastRow).NumberFormat
End With

请注意,转移单元格的值是使用 .Value.Value2 而不是 .Values 执行的。

我偶尔会看到这个问题弹出窗口,恕我直言,问题的来源可能是 a) 一位老师认为这是一种让学生了解有多少属性、子属性和内部子属性的可爱方式Range.Cells 对象 (Range Members (Excel)) 包含或 b) 一些刚刚获得 MBA 学位的白痴想要证明他们比 IT 部门更聪明。当剪贴板可用时,枚举一个单元格可能包含的所有可能的格式 属性 只是徒劳的差事(再次恕我直言)。

如果您自己尝试这样做,请不要忘记条件格式和注释,这两者都可以很容易地归因于单元格格式的一部分。