VBA错误1004 - Range类的PasteSpecial方法

时间:2013-02-15 22:45:56

标签: vba excel-2007

最近我开始收到错误1004: PasteSpecial method of Range class failed。我知道人们之前已经说过,当没有人时,它可能会尝试粘贴到活动工作表上,但是,正如您所看到的,所有内容都基于ThisWorkbook,因此这不应该是问题所在。当Excel没有焦点时,它会发生很多。

'references the Microsoft Forms Object Library
Sub SetGlobals()
    Set hwb = ThisWorkbook' home workbook
    Set mws = hwb.Worksheets("Code Numbers") ' main worksheet
    Set hws = hwb.Worksheets("Sheet3") ' home worksheet (Scratch pad)
    Set sws = hwb.Worksheets("Status") ' Status sheet
    Set aws = hwb.Worksheets("Addresses") ' Addresses sheet
End Sub
Sub Import()

    Call SetGlobals
    hws.Select
    'a bunch of code to do other stuff here.
    For Each itm In itms
        Set mitm = itm
        body = Replace(mitm.HTMLBody, "<img border=""0"" src=""http://www.simplevoicecenter.com/images/svc_st_logo.jpg"">", "")
        Call Buf.SetText(body)
        Call Buf.PutInClipboard
        Call hws.Cells(k, 1).Select
        Call hws.Cells(k, 1).PasteSpecial

        For Each shape In hws.Shapes
            shape.Delete
        Next shape

        'Some code to set the value of k 
        'and do a bunch of other stuff.
    Next itm
End Sub

更新: mitm和itm有两种不同的类型,所以我为intellisense做了它,谁知道还有什么。此代码获取电子邮件列表并将它们粘贴到excel中,以便excel解析html(包含表格)并将其直接粘贴到excel中。因此,数据直接进入工作表,我可以对其进行排序并解析它以及我想要的任何其他内容。

我想我基本上要求任何知道另一种方法的人除了把它放在一个html文件中发布之外。感谢

1 个答案:

答案 0 :(得分:4)

这可能无法准确回答您的问题 - 但我注意到您的源代码中的一些内容太长而无法放入评论中,所以现在就是这样。其中一些肯定是因为你省略了它的例子,但无论如何我都会提到它,以防万一:

  • 使用Option Explicit - 这会避免很多错误,因为它会强制您声明每个变量
  • Call SetGlobals可以简化为SetGlobals - 同样适用于Call Buf.SetText(body) = Bof.SetText Body等。
  • 无需'。选择'任何内容 - 您直接通过工作表/范围/形状对象访问所有内容(这是最佳做法),因此请勿选择(hws.Selecthws.Cells(k,1).Select)< / LI>
  • 为什么Set mitm = itm?因此,mitmitm的对象相同 - 因此您只需使用itm
  • 您要hws多次删除itms中的所有形状 - 对于hws.Cells(k, 1).Value = body中的每个元素。但是,一旦足够,所以将删除循环移到For Each循环之外
  • 不是将某些内容放入剪贴板然后将其粘贴到单元格,而是直接指定它:Sheet1 (sheetname) - 这可以解决您的错误!
  • 不使用在“SetGlobals”中分配的工作表的全局变量,而只需使用Excel本身提供的工作表对象:如果使用项目树查看VBE中的右侧窗口,则会看到工作表节点{{1您可以重命名这些对象 - 转到它们的属性( F4 )并将其更改为有意义的名称 - 或您当前的名称(Sheet2 (sheetname)hwb,...)如果你愿意的话。然后您可以在整个代码中访问它们而无需任何分配!即使您将mws的名称更改为有意义的内容,它也会在以后工作! ; - )

因此,考虑到这一切,我最终得到以下代码,做同样的事情:

Sheet3