VBA:错误1004 - 选择和复制问题

时间:2017-07-14 10:10:44

标签: vba copy

我需要你的帮助..运行以下代码时我有1004错误消息(应用程序或对象未定义)(我只放置关键部分):

Sub overwrite_CDL()
Dim sht As Worksheet, LastRow As Long
Set sht = ThisWorkbook.Worksheets("JDE_Greece")
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
sht.Activate
Range("M1").AutoFilter Field:=13, Criteria1:="#N/A"
Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Sheets("Mismatches").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, 
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'we want to create a summary sheet with the matches and the N/A:'
sht.Range("M1").AutoFilter Field:=13, Criteria1:="<>#N/A"
sht.Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Worksheets.Add(After:=Worksheets("Instructions")).Name = "Summary DRP"
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, 
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub

另外,一切正常(没有错误消息,良好的输出)但在一起运行时给出了错误1004。即使正确设置了过滤器,也不会创建我要添加的工作表(“摘要DRP”)。

我认为这个问题与选择/复制有关,但我不确切知道为什么(我猜有些东西没有正确定义......)。

有人能帮助我吗?在此先感谢:)

1 个答案:

答案 0 :(得分:1)

一些事情......

您的代码很难在没有缩进的情况下阅读(但不会导致错误)。

  • 您在当前活动的工作表上设置了最后一行,这可能不是&#34; JDE_Greece&#34;。
  • 找到最后一行后,激活JDE_Greece。
  • 您复制选择。
  • 你换床单。
  • 您粘贴到Mismatches工作表上选择的任何单元格(K36:Z36在我的工作表上)。
  • 您尝试选择已过滤的&lt;&gt; #N / A单元格,但您尚未重新选择该表单,因此无法选择单元格并引发Select Method of Range class failed错误。

这个故事的寓意......不要使用Select。

所以你的代码没有删除,但更新了注释:

Sub overwrite_CDL()
    Dim sht As Worksheet, LastRow As Long
    Dim sht1 As Worksheet, sht2 As Worksheet '\\New variables

    Set sht = ThisWorkbook.Worksheets("JDE_Greece")
    Set sht1 = ThisWorkbook.Worksheets("Mismatches") '\\Added reference to Mismatches.
    LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row '\\Add sheet reference (not really necessary on Rows.Count as row counts should be the same across sheets).
    'sht.Activate  '\\Don't need to Activate or Select.
    sht.Range("M1").AutoFilter Field:=13, Criteria1:="#N/A" '\\Add sheet reference.
    sht.Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Copy '\\No need to Select, just copy.
    'Selection.Copy '\\Don't need this as incorported into above line.
    'Sheets("Mismatches").Select
    sht1.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False  '\\Added sheet and cell reference.
    Application.CutCopyMode = False

    'we want to create a summary sheet with the matches and the N/A:'
    '\\Moved these two lines after the new sheet is created.
    '\\sht.Range("M1").AutoFilter Field:=13, Criteria1:="<>#N/A"
    '\\sht.Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Select
    'Selection.Copy '\\Don't need this as incorported into above line.

    Set sht2 = ThisWorkbook.Worksheets.Add 'Add worksheet and use variable to reference it.
    sht2.Name = "Summary DRP"
    sht2.Move After:=ThisWorkbook.Worksheets("Instructions")

    'Worksheets.Add(After:=Worksheets("Instructions")).Name = "Summary DRP" '\\This row is now the above 3 rows.

    sht.Range("M1").AutoFilter Field:=13, Criteria1:="<>#N/A"
    sht.Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Copy '\\No need to Select, just copy.

    sht2.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False '\\Added sheet and cell reference.

End Sub  

收拾整齐:
注意:我已删除您在PasteSpecial中输入的额外参数 - 这些是默认值,因此无论如何都要设置为。 如果&#39;摘要DRP&#39;已经存在。

Sub overwrite_CDL()
    Dim sht As Worksheet, LastRow As Long
    Dim sht1 As Worksheet, sht2 As Worksheet

    Set sht = ThisWorkbook.Worksheets("JDE_Greece")
    Set sht1 = ThisWorkbook.Worksheets("Mismatches")

    With sht
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        .Range("M1").AutoFilter Field:=13, Criteria1:="#N/A"
        .Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Copy
    End With

    sht1.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    Application.CutCopyMode = False

    Set sht2 = ThisWorkbook.Worksheets.Add
    With sht2
        .Name = "Summary DRP"
        .Move After:=ThisWorkbook.Worksheets("Instructions")
    End With

    With sht
        .Range("M1").AutoFilter Field:=13, Criteria1:="<>#N/A"
        .Range("A1:P" & LastRow).SpecialCells(xlCellTypeVisible).Copy
    End With

    sht2.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats

End Sub