【问题标题】:Excel VBA snippet causing Run-Time Error '438'Excel VBA 代码段导致运行时错误“438”
【发布时间】:2018-03-08 17:47:07
【问题描述】:

第一次海报。

以下 VBA 脚本每次都会中断一个工作宏。我尝试了不同的语法来修复,但得到了相同的结果。

该代码应该查看 L 列中的所有数据单元格,查找字符串“ERROR”。如果找到,将该单元格和右侧的单元格复制到正确的“AX”列并清除 L 和 M 中的文本。

它每次中断的步骤是“Cells(i, 50).Paste”行。

Set rng = Application.Range("L4:M" & lrow)
For i = rng.Rows.Count To 4 Step -1
    If Cells(i, 12).Value = "ERROR" Then
        Range("L" & i & ":M" & i).Copy
        Cells(i, 50).Paste
        Range("L" & i & ":M" & i).ClearContents
    End If
    If Cells(i, 21).Value = "ERROR" Then
        Rows(i).Delete
    End If
Next I

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    Paste 不是Range object 可用的方法。 Cells 是一个 Range 对象。因此,“对象不支持此属性或方法”:)

    你可以试试:

    Cells(i, 50).PasteSpecial xlPasteAll
    

    【讨论】:

    • 工作就像一个魅力。非常感谢@DavidZemens!
    【解决方案2】:

    正如@DavidZemens 所说,您错过了正确的方法名称

    此外,您的代码似乎在以下情况下做了不必要的工作:

    • 它首先在当前的i 行中做一些事情应该If Cells(i, 12).Value = "ERROR" 检查返回True

    • 如果后续If Cells(i, 21).Value = "ERROR" Then 再次返回 True,它将删除相同的 i 行

    最后你没有使用任何PasteSpecial 功能,所以你可能想使用普通的Copy 一个

    因此我将它重构如下

    Dim lrow As Long, i As Long
    
    lrow = Cells(Rows.Count, "L").End(xlUp).Row
    
    For i = lrow To 4 Step -1
        If Cells(i, 21).value = "ERROR" Then
            Rows(i).Delete
        ElseIf Cells(i, 12).value = "ERROR" Then
            Range("L" & i & ":M" & i).Copy Destination:=Cells(i, 50)
            Range("L" & i & ":M" & i).ClearContents
        End If
    Next i
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多