2017-06-29 8 views
0

Es ist kein Fehler im Code vorhanden.
Aber ich bekam noch nicht, was ich will.VBA: Die letzte Zeile konnte nicht zum Füllen der Tabelle (Array der Blätter) verwendet werden

Der Code sollte jede Zeile nehmen, die "Total" enthält und dann einfügen, um eine Tabelle zu füllen.
Alle Tabellen, die ich momentan bekomme, sind falsch, einige kopieren sogar die Zeile, die nicht "Total" enthält.
Und für einige, nur 15 Zeilen haben, aber es gibt 30.

For Each name In Array("Sheet A", "Sheet B", _ 
"Sheet C", "Sheet D") 
     Set ws = ThisWorkbook.Worksheets(name) 
    'find EVERY total row then copy the range from A-J 
    'new rows with contents added during macro run 
     ws.Columns("L:U").Select 
     Selection.ClearContents 

     For Each cell In Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) 
      If cell.Value = "Total" Then 
       cell.Activate 
       n = ActiveCell.Row 

      Set rnge = Range(ws.Cells(n, 1), ws.Cells(n, 10)) 
      rnge.Copy 

     'clear contents before contents paste to here 
     'it was kinda unnecessary but im clueless on how to only copy new added row 
     'and paste them to create new table (in same sheet from columnL) 
     'Columns("L:U").Select 
     'Selection.ClearContents 

      pasteRow = ws.Cells(ws.Rows.Count, "L").End(xlUp).Row + 1 
      ws.Cells(pasteRow, "L").PasteSpecial xlPasteValues 

      End If 
     Next cell 
Next name 

ich noch neu bin, so war ich nicht sicher, ob es von Platten-Array oder Bereich verwendet wegen der falsch/Zelle.
Ich habe diese Annahme gemacht, weil, wenn ich dies auf Einzelblatt ausführen, funktioniert es gut.

For Each ws In ThisWorkbook.Worksheets 
    If ws.Name = "Sheet A" Then 
+1

'Range' implizit die' ActiveSheet' verwendet. – ThunderFrame

+1

forschen Sie, wie Sie die .select-Funktion loswerden und nachsehen können, um Ihre Referenzen vollständig zu qualifizieren. Das sollte dir 99% + den Weg dorthin bringen. – sous2817

Antwort

0

Ihr Problem ist Explicitly Verweis auf Ihr Objekt.
Zuerst haben Sie das Richtige getan, indem Sie die Variable ws setzen, aber es ist nicht konsistent. Versuchen:

Dim ws As Worksheet, cell As Range, rnge As Range 

For Each Name In Array("Sheet A", "Sheet B", _ 
         "Sheet C", "Sheet D") 
    Set ws = ThisWorkbook.Worksheets(Name) 

    With ws '/* reference all Range call to your worksheet */ 
     .Columns("L:U").ClearContents '/* abandon use of Select */ 
     For Each cell In .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row) 

      If cell.Value = "Total" Then 
       n = cell.Row 

       Set rnge = .Range(.Cells(n, 1), .Cells(n, 10)) 
       rnge.Copy 

       pasteRow = .Cells(.Rows.Count, "L").End(xlUp).Row + 1 
       .Cells(pasteRow, "L").PasteSpecial xlPasteValues 

      End If 

     Next cell 

    End With 

Next Name 

Diese Ausnahme ziemlich Ihr Code ist, dass ich entfernt Select, Activate und Referenz und erklären alle Variablen. Sie können auch verlassen Looping und Einbau-Range Methods wie diese versuchen:

Dim r As Range, copy_r As Range, name, ws As Worksheet 

For Each name In Array("Sheet A", "Sheet B", _ 
         "Sheet C", "Sheet D") 
    Set ws = ThisWorkbook.Worksheets(name) 

    With ws 
     '/* set the range */ 
     Set r = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) 
     r.AutoFilter 1, "Total" '/* filter the range, all with "Total" */ 
     '/* set the range for copy, 10 cell based on your code? */ 
     Set copy_r = r.SpecialCells(xlCellTypeVisible).Offset(, 9) 
     '/* copy to the last empty row in column L */ 
     copy_r.Copy .Range("L" & .Range("L" & .Rows.Count).End(xlUp).Row + 1) 
     .AutoFilterMode = False '/* remove filtering */ 
    End With 

Next 
Verwandte Themen