2017-07-14 101 views
0

我需要你的幫助的東西。我有1004的錯誤信息(應用或非對象定義)運行下面的代碼(我只放了關鍵部分)時:VBA:錯誤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」)。

我認爲這個問題與選擇/複製有關,但我不知道爲什麼(我猜東西沒有正確定義..)。

有人可以幫助我嗎?感謝提前:)

+0

哪一行返回錯誤? –

回答

1

有幾件事情....

你的代碼是很難不縮進閱讀(不會導致錯誤雖然)。

  • 您在當前活動工作表上設置了最後一行,該表可能不是「JDE_Greece」。
  • 找到最後一行後,激活JDE_Greece。
  • 您複製選區。
  • 您更改工作表。
  • 您可以粘貼到Mismatches紙張(我的紙張上的K36:Z36)上選擇的任何單元格中。
  • 您嘗試並選擇過濾到<>#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進入了額外的參數 - 這是默認值,所以無論如何,它都會被設置。 如果'摘要DRP'已經存在,您的代碼仍然會失敗。

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 
+0

在'LastRow = .Cells(Rows.Count,「A」)中限定'Rows'可能是一個好主意。End(xlUp).Row'(**通常**不會有影響,但可能是最好的在你做其他事情時整理它) – YowE3K

+0

我永遠不知道是否限定它們 - 任何工作表上的行數都應該是相同的,但我想完整性應該在那裏。我會添加它。 –

+0

如果用戶打開兩個工作簿,則通常會出現該問題。說'ThisWorkbook'是一箇舊式的xls文件,但'ActiveWorkbook'是一個新的xlsx文件。 'Rows.Count'(默認爲'ActiveSheet.Rows.Count')將返回1048576,但是'sht.Cells(1048576,「A」)'(其中'sht'是'ThisWorkbook.Worksheets(「JDE_Greece」)) '因此限制爲65536行)會給出錯誤。 – YowE3K