【问题标题】:can we use pastespecial method if the original range is deleted如果原始范围被删除,我们可以使用 pastespecial 方法吗
【发布时间】:2012-09-06 19:22:00
【问题描述】:

我想在循环遍历最后 8 种格式时模拟格式刷的行为。 为此,我将最后 8 个捕获的 Range 以循环格式存储在 List 对象中。 应用时,我取出每个范围调用 COPY 方法以将该范围复制到剪贴板上,然后在目标范围上调用 PasteSpecial 方法,如下所示

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

但如果我删除我得到的原始范围:

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

有什么建议吗?

【问题讨论】:

    标签: excel vsto excel-2007 vba


    【解决方案1】:

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

    【讨论】:

    • 在 Excel 中获取 MSForms 引用的快速方法是转到 Visual Basic 编辑器,然后插入 > 用户窗体。这会自动创建对 MSForms 的引用,然后您可以删除 UserForm
    • 我不得不使用 System.Windows.Forms.Clipboard.SetData() 方法,因为 FM20.dll 只提供 SetText 方法。但是我的问题仍然没有解决,因为从剪贴板获取对象时它返回 null。您还可以回答我的以下问题吗 1)我如何在剪贴板上存储 8 个范围,以便我可以使用一些索引来访问它 2)为了克服这个问题,我想将这些范围存储在 LIST 对象中,但在这种情况下,当我使用剪贴板类的 setdata 或 setdataobject 我必须使用的数据格式是什么?
    • 我对 Windows 和 Office 剪贴板做了一些研究。我认为两者都不是一个好的解决方案。请参阅上述答案的编辑#1
    • 感谢@JamesL。这是一次很棒的学习,你也帮助支持了我的发现。
    • @JamesL。我可以将 DisplayFormats 对象直接放入内存并使用它,即使 Range 被删除?或者是否有任何其他范围类的对象可以帮助我?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多