使用.PasteSpecial时出现运行时错误438对象不支持此属性或方法

时间:2018-12-21 21:39:56

标签: excel vba excel-vba

我正在使用以下VBA脚本复制单元格。它将值粘贴到所有单元格(A到J)中,但是将值粘贴到 K 中时抛出运行时错误438。 我不确定为什么它适用于前几行时在最后一行上失败了。

Sub Programs()
    Dim sh As Worksheet, N As Long
    Dim i As Long, M As Long
    N = Sheets.Count - 4
    M = 2
    For i = 6 To N
        'copy Form number + Edition date
        Sheets(i).Range("$D$4").Copy
        Sheets("Programs1").Range("A" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("A" & M).PasteSpecial (xlFormats)

        'copy Program
        Sheets(i).Range("$C$180").Copy
        Sheets("Programs1").Range("B" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("B" & M).PasteSpecial (xlFormats)
        'copy ProgramStatus
        Sheets(i).Range("$E$180").Copy
        Sheets("Programs1").Range("C" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("C" & M).PasteSpecial (xlFormats)

        'copy Program
        Sheets(i).Range("$C$181").Copy
        Sheets("Programs1").Range("D" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("D" & M).PasteSpecial (xlFormats)
        'copy ProgramStatus
        Sheets(i).Range("$E$181").Copy
        Sheets("Programs1").Range("E" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("E" & M).PasteSpecial (xlFormats)

        'copy Program
        Sheets(i).Range("$C$182").Copy
        Sheets("Programs1").Range("F" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("F" & M).PasteSpecial (xlFormats)
        'copy ProgramStatus
        Sheets(i).Range("$E$182").Copy
        Sheets("Programs1").Range("G" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("G" & M).PasteSpecial (xlFormats)

        'copy Program
        Sheets(i).Range("$C$183").Copy
        Sheets("Programs1").Range("H" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("H" & M).PasteSpecial (xlFormats)
        'copy ProgramStatus
        Sheets(i).Range("$E$183").Copy
        Sheets("Programs1").Range("I" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("I" & M).PasteSpecial (xlFormats)

        'copy Program
        Sheets(i).Range("$C$184").Copy
        Sheets("Programs1").Range("J" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("J" & M).PasteSpecial (xlFormats)
        'copy ProgramStatus
        Sheets(i).Range("$E$184").Copy
        Sheets("Programs1").Range("K" & M).PasteSpecial (xlValues)
        Sheets("Programs1").Range("K" & M).PasteSpecial (xlFormats)
    M = M + 1
Next i

结束子

1 个答案:

答案 0 :(得分:0)

我也不知道为什么也会出现错误,但是您当然可以缩短代码,也许可以找出错误发生的原因。当您拥有高度冗余的代码时,将该部分分成一个单独的方法将“功能上隔离”该逻辑。这很重要,因为如果发生错误,可以通过仅在一个位置更改逻辑来解决它。否则,您将必须更改生成的所有复制粘贴行以制作上述示例。这样的例程:

Private Sub CopyMe(ByVal sheetIndex As Long, _
                   ByVal from As String, _
                   ByVal to As String)
    Sheets(sheetIndex).Range(from).Copy
    With Sheets("Programs1").Range(to)
        .PasteSpecial Paste:=xlPasteValues 
        .PasteSpecial Paste:=xlPasteFormats
    End With
End Sub

所以现在您的主要逻辑将如下所示:

Sub Programs()
    Dim sh As Worksheet, N As Long
    Dim i As Long, M As Long
    N = Sheets.Count - 4
    M = 2
    For i = 6 To N
        CopyMe i, "D4", "A2"      'copy Form number + Edition date
        CopyMe i, "C180", "B2"    'copy Program
        CopyMe i, "E180", "C2"    'copy ProgramStatus
        ' ...
    Next i
End Sub

因此,如果在像这样构造代码时,所有CopyMe行都有效,但列K除外,那么您将知道该列存在问题,而不是相同的副本-粘贴线。 (但我认为这会起作用...)