【问题标题】:VBA Error 1004 - PasteSpecial method of Range classVBA 错误 1004 - Range 类的 PasteSpecial 方法
【发布时间】:2013-02-15 22:45:55
【问题描述】:

最近我开始收到错误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 文件中发布它。谢谢

【问题讨论】:

    标签: vba excel-2007


    【解决方案1】:

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

    • 使用Option Explicit - 这将避免很多错误,因为它会强制您声明每个变量
    • Call SetGlobals 可以简化为 SetGlobals - Call Buf.SetText(body) = Bof.SetText Body 等。
    • 无需“选择”任何内容 - 您可以直接通过工作表/范围/形状对象访问所有内容(这是最佳做法),因此不要选择(hws.Selecthws.Cells(k,1).Select
    • 为什么是Set mitm = itm?因此mitm 将与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
    

    【讨论】:

    • 说!对于我给出的答案,这是一个令人难以置信的答案。都是好点。我要说的两件事是,首先我每次都删除形状,因为当它们加起来时,它们会大大减慢工作表的速度。至少我是这么认为的。但是,我将替换命令放在那里以解决同样的问题,所以也许...第二件事是我正在粘贴包含表格的 html 数据。 Excel 当然是基于表格的,因此它会解析 html 并将表格插入到工作表中。只设置值只会插入 html 源代码。
    • 我看到了 HTML - 不确定我可以在这里为您提供帮助。但是,对于形状:一旦删除它们,重复循环不会进一步加快速度! ;-) 另外:考虑在子目录的开头使用Application.ScreenUpdating = False,在结尾使用Application.ScreenUpdating = True。这通常会显着提高速度!!!
    • HTML 的.PasteSpecial 很棒——不知道! :-) 当您收到错误时,可能是 HTML 不正确?
    • 好吧,当它没有焦点时,我似乎得到更多。在同一组电子邮件中似乎很随机,所以我怀疑它是 html。我以前没有遇到过这个问题,但最近我遇到的问题似乎比以前多了。
    • 我完全看到了让 EXcel 进行解析的好处!但是,正如您提到的,您最近才在这里遇到错误,这可能是 Excel 在解析 HTML 时遇到了一些困难。对 HTML 进行一些实验,看看问题是否仍然存在!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2013-05-17
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多