当您在 Excel 中复制时(复制的区域有行军蚂蚁边框),数据实际上并不在剪贴板上。粘贴时,Excel 使用剪贴板从源单元格实时传输。它这样做是为了在粘贴操作期间将公式重新编写为新的相对单元格引用。如果您删除源单元格,则 Excel 在粘贴操作期间无法从中提取数据。
VBA 不支持直接使用剪贴板。但是,您可以将 MSForms 添加到 VBA 项目中,然后声明一个支持剪贴板功能的对象。
有关如何直接从 VBA 访问剪贴板的说明和示例,请参见以下网站:
http://www.cpearson.com/excel/Clipboard.aspx
对我来说,正如cpearson 的网站所建议的那样,我在可用references 的列表中没有MSForms,但我确实在C:\ 驱动器中搜索了FM20.dll,发现它隐藏在一些不起眼的地方文件夹。我将它复制到 C:\ 的根目录,然后可以通过在 add references 对话框中单击 browse 将其添加为 reference。
一旦 MSForms 可用,您就可以使用此代码将文本复制到剪贴板,该剪贴板在源单元格被删除后仍然存在。
Public Sub Test()
Dim obj As New MSForms.DataObject
obj.SetText ActiveCell.Value
obj.PutInClipboard
End Sub
这个复制了持久的公式:
Public Sub Test()
Dim obj As New MSForms.DataObject
obj.SetText ActiveCell.Formula
obj.PutInClipboard
End Sub
我没有时间弄清楚如何将单元格的格式复制到剪贴板,但似乎这是你需要走的方向,如果你想保留复制的值以便你可以在之后粘贴它们源单元格被移除。
编辑#1
尽管 Windows 剪贴板可以为一个项目存储多种格式(例如,复制选择的 RTF 和文本版本),但它一次只能存储 一个 项目。
Office 剪贴板不使用 Windows 剪贴板。它本身存储复制的值,并且可以存储许多不同的选择。但是,从 Office 2000 开始,它无法通过 VBA 进行控制(请参阅How to use the Office 2000 Clipboard),从 Excel 复制的选择要么是“粘贴文本”,要么是“全部粘贴”。没有特殊粘贴来粘贴格式。我找不到任何与更高版本的 Office 不同的内容。
结论:使用 VBA 进行特殊粘贴的唯一方法是有一个活动/有效/复制的选择。所以我同意唯一的解决方案是声明您自己的持久全局变量(例如,对象列表)并将每个复制选择的格式存储在列表中。由于剪贴板确实不是一个可行的解决方案,SetData 和SetDataObject 是无关紧要的......如果证明不可能在一行 VBA 代码中捕获单元格的格式,您总是可以枚举感兴趣的格式并在存储的对象中设置标志以供以后使用。