首页 > 解决方案 > 为什么在VBA中粘贴Word表格列大部分时间都会导致错误4605,然后尝试多次成功?

问题描述

我正在使用 VBA 宏从 Word 中的表格模板中删除不相关的行。我的表有大约 100 行开始。我注意到 Word VBA 中的表操作在长表上很慢,所以我决定将(少数)相关行复制/粘贴到一个新表中,并删除原始表。这样我只需要复制几行,而不是删除近 100 行。

我遇到了一个需要帮助才能理解的怪癖。

当我在我的表上运行下面的代码时,它总是在第二行上抛出错误 4605,在Newrow.range.paste. 根据睡眠持续时间,代码会失败多次,最后才能成功。睡眠 500 毫秒 34 次失败,0 毫秒 96 次失败,200 毫秒 66 次失败,依此类推。

    For Each OldRow In TestTbl.Rows
        If Models.Contains(OldRow.Cells(1).Range.Text) Then '(meaning it's relevant to copy)
            Set NewRow = NewTbl.Rows(NewTbl.Rows.Count)
            On Error Resume Next
            Do
                Err.Clear
                OldRow.Range.Copy
                Sleep 500 'ms
                NewRow.Range.Paste
                If Err <> 0 Then
                    Sleep 200 'ms
                    Debug.Print "Failed to paste row " & OldRow.Index & " from TestTbl with error " & Err & " at " & Now()
                End If
            Loop Until Err = 0
            On Error GoTo 0
        End If
    Next OldRow

有人可以帮我弄清楚如何在第一次尝试时粘贴整行,而不是在尝试 30 秒后?

这只发生在满足的第一行if models.contains(Oldrow...text)。之后的行被粘贴而没有任何错误。

标签: vbams-wordruntime-error

解决方案


谢谢你的建议。在您输入后,我研究并尝试了一种完全避免通过剪贴板的方法。瞧,它工作得更快而且没有错误......

相关代码现在是:

    For Each OldRow In TestTbl.Rows
        If Models.Contains(OldRow.Cells(1).Range.Text) Then
            Set NewRow = NewTbl.Rows(NewTbl.Rows.Count)
            NewRow.Range.FormattedText = OldRow.Range.FormattedText
        End If
    Next OldRow

这已经很好地测试并且现在用于生产。它设法复制合并的单元格、单元格中的内容控件、格式以及所有内容。好的。


推荐阅读