Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用Excel宏复制粘贴形状时会出现自动错误,但如果我减慢代码速度,则不会出现这种错误?_Excel_Vba_Runtime Error_Copy Paste - Fatal编程技术网

为什么使用Excel宏复制粘贴形状时会出现自动错误,但如果我减慢代码速度,则不会出现这种错误?

为什么使用Excel宏复制粘贴形状时会出现自动错误,但如果我减慢代码速度,则不会出现这种错误?,excel,vba,runtime-error,copy-paste,Excel,Vba,Runtime Error,Copy Paste,当我尝试根据单元格的值将某些现有形状复制粘贴到单元格中时,我的宏在复制几次(少于10次)后将失败,并出现以下错误: 运行时错误“-2147221040(800401d0)”:自动化错误 OpenClipboard失败 我最初认为这可能是某种剪贴板缓冲区问题,因此在每次粘贴后添加了以下命令: Application.CutCopyMode = False 但这并没有改变任何事情 但后来我注意到,如果在我的代码上设置一些断点并“一步一步”地运行它(当在断点处时为F5),它就可以正常工作。。。只要我

当我尝试根据单元格的值将某些现有形状复制粘贴到单元格中时,我的宏在复制几次(少于10次)后将失败,并出现以下错误:

运行时错误“-2147221040(800401d0)”:自动化错误 OpenClipboard失败

我最初认为这可能是某种剪贴板缓冲区问题,因此在每次粘贴后添加了以下命令:

Application.CutCopyMode = False
但这并没有改变任何事情

但后来我注意到,如果在我的代码上设置一些断点并“一步一步”地运行它(当在断点处时为F5),它就可以正常工作。。。只要我不太快按F5

最后,我在每次粘贴后添加了1s的等待,这样代码就可以毫无错误地运行到最后(但是对于几千次粘贴来说速度非常慢)

下面是我当前运行的代码:

Sub Change_to_icon()
Dim cell As Range

For Each cell In ActiveSheet.Range("C4:AI28")
    If cell.Value = "" Then
        cell.Value = "0"
    ElseIf cell.Value = "1" Then
        ActiveSheet.Shapes("CD").Copy
        cell.Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Application.Wait (Now + TimeValue("0:00:01"))
    ElseIf cell.Value = "2" Then
        ActiveSheet.Shapes("CDW").Copy
        cell.Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Application.Wait (Now + TimeValue("0:00:01"))
    ElseIf cell.Value = "3" Then
        ActiveSheet.Shapes("E").Copy
        cell.Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Application.Wait (Now + TimeValue("0:00:01"))
    ElseIf cell.Value = "4" Then
        ActiveSheet.Shapes("CT").Copy
        cell.Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Application.Wait (Now + TimeValue("0:00:01"))
    End If


Next cell

End Sub
在其他一些主题中,有人建议在一些非常类似的情况下,而不是在循环中出现差异,例如尝试在复制之前粘贴(我很理解),并添加一些事件。我也在代码中的不同地方尝试过这个。没有改变任何事情

此外,粘贴的所有新形状都有相似的名称,我可以想象它在某些地方有一些意想不到的副作用,但我没有尝试为每个粘贴给它们一个新名称


当它在没有等待的情况下全速运行时,你认为会发生什么

您可以使用
Shape.Duplicate
,而不是复制粘贴。以下代码在我的计算机上复制了1000多个形状,不到2秒:

With ActiveSheet

    Dim cell As Range
        For Each cell In .Range("C4:AI28")

        Dim shapeName As String
        shapeName = ""

        Select Case cell.Value
            Case 0: cell.Value = 1
            Case 1: shapeName = "CD"
            Case 2: shapeName = "CDW"
            (...)
        End Select

        If shapeName <> "" Then
            Dim shCopy As Shape
            Set shCopy = .Shapes(shapeName).Duplicate
            shCopy.Left = cell.Left
            shCopy.Top = cell.Top
            shCopy.Name = shapeName & "_" & cell.Address(False, False)
        End If
    Next cell
End With
使用ActiveSheet的

暗淡单元格作为范围
对于范围内的每个单元格(“C4:AI28”)
将shapeName设置为字符串
shapeName=“”
选择大小写单元格。值
案例0:单元格。值=1
案例1:shapeName=“CD”
案例2:shapeName=“CDW”
(...)
结束选择
如果是shapeName“”,则
按形状复制
设置shCopy=.Shapes(shapeName).重复
shCopy.Left=单元格.Left
shCopy.Top=单元格.Top
shCopy.Name=shapeName&“&”cell.Address(False,False)
如果结束
下一个细胞
以