0

最近我开始收到错误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 有两种不同的类型,所以我这样做是为了智能感知,谁知道还有什么。此代码获取电子邮件列表并将它们粘贴到 excel 中,以便 excel 解析 html(包含表格)并将其直接粘贴到 excel 中。因此,数据直接进入工作表,我可以对其进行排序和解析以及我想要的任何其他内容。

我想我基本上是在询问任何知道另一种方法的人,除了将它放在一个 html 文件中发布它。谢谢

4

1 回答 1

4

这可能不会完全回答您的问题 - 但我注意到您的源代码中的一些内容太长而无法放在评论中,所以就在这里。其中一些肯定是因为您在示例中省略了它,但我还是会提到它,以防万一:

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

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

Option Explicit

Sub Import()

    'a bunch of code to do other stuff here.

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

    For Each itm In itms
        Call hws.Cells(k, 1) = Replace(itm.HTMLBody, "<img border=""0"" src=""http://www.simplevoicecenter.com/images/svc_st_logo.jpg"">", "")

        'Some code to set the value of k 
        'and do a bunch of other stuff.
    Next itm
End Sub
于 2013-02-15T23:13:38.337 回答