如果删除原始范围,我们可以使用pastespecial方法吗?

时间:2012-09-13 16:28:34

标签: excel excel-vba vsto excel-2007 vba

我想在循环播放最后8格式时模拟Format painter行为。 为此,我将最后8个捕获的范围存储在列表中<>循环格式的对象。 在应用时,我取出每个范围调用COPY方法在剪贴板上复制该范围,然后在目标范围上调用PasteSpecial方法,如下所示

RangeInfo tempRangeInfo = listRangeInfo[Counter]; 
//Copy to clipboard
                        tempRangeInfo.CopiedRange.Copy();
                        selection.PasteSpecial(xl.XlPasteType.xlPasteFormats,  xl.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
                            false, false);

但是如果我删除原来的范围,我会得到:

  

Range类的PasteSpecial方法失败“错误。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

在Excel中复制时(复制的区域具有行进的蚂蚁边框)数据实际上不在剪贴板上。粘贴时,Excel使用剪贴板实时从源单元格进行传输。它这样做是为了它可以在粘贴操作期间将公式重新处理为新的相对单元格引用。如果删除源单元格,则Excel在粘贴操作期间无法从中提取数据。

VBA没有本机支持直接使用剪贴板。但是,您可以将MSForms添加到VBA项目,然后声明一个支持剪贴板功能的对象。

有关如何直接从VBA访问剪贴板的说明和示例,请访问以下网站:

http://www.cpearson.com/excel/Clipboard.aspx

对我来说,我在references网站上建议的可用cpearson列表中没有MSForms,但我确实在C:\驱动器中搜索了FM20.dll并找到了它埋在一些不起眼的文件夹里。我将其复制到C:\的根目录,并且可以通过reference对话框中的browse将其添加为add references

一旦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执行粘贴特殊的唯一方法是使用活动/有效/复制的选择。所以我同意唯一的解决方案是声明自己的持久全局变量(例如,对象列表)并将每个复制选择的格式存储在列表中。由于剪贴板确实不是一个可行的解决方案,SetDataSetDataObject无关......如果证明无法在单行VBA代码中捕获单元格的格式,则可以始终枚举感兴趣的格式和存储对象中的设置标志供以后使用。