Nur Zeilen mit einem beliebigen Inhalt kopieren
Die Aufgabe ist klar: Es sollen ausschließlich Zeilen in ein anderes Tabellenblatt kopiert werden, die irgend einen Inhalt haben. Das können Werte oder Formeln sein. Prinzipiell gibt es zwei Wege: „Zu Fuß” oder per VBA bzw. Makro. Für beide Wege finden Sie eine Lösung in dieser Muster-Mappe.
Ohne VBA
Bezogen auf das Arbeitsblatt Tabelle1 der Muster-Mappe fügen Sie vor der Spalte A eine neue Spalte ein. Das geht am einfachsten, wenn Sie die komplette Spalte A markieren und dann per Rechtsklick den Punkt Zellen einfügen. Fügen Sie nun in A1 diese Formel ein: =ANZAHL2(B1:XFD1)
Damit Sie wissen, welches die letzte Zeile ist, einfach einmal die Tastenkombination StrgEnde nutzen und die letzte Zelle unten|rechts ist markiert. Kopieren Sie nun die Formel aus A1 bis zur letzten Zeile hinunter. Das kann auch durch ziehen passieren. Jetzt filtern Sie per AutoFilter alle Werte aus Spalte A, welche keine Null enthalten, indem Sie das Häkchen bei der Null entfernen.
Jetzt markieren Sie den gefilterten Bereich und kopieren ihn beispielsweise mit der Tastenkombination StrgC. Sollte in A1 eine Null stehen, dann markieren Sie nicht diese erste Zeile für das kopieren. Nun wechseln Sie in die Ziel-Tabelle und fügen den Inhalt der Zwischenablage an gewünschter Position ein. Anschließend können Sie noch den AutoFilter aus der Tabelle1 entfernen. In Tabelle1 (2) sind schon das einfügen der Spalte und der AutoFilter realisiert, falls Sie sich auf das kopieren konzentrieren wollen. Beachten Sie bitte den Hinweis am Ende dieses Beitrages.
Mit VBA/Makro
Unter der Voraussetzung, dass alle Zeilen mit beliebigem Inhalt von Tabelle1 in die jeweils erste Zeile der Tabelle2 kopiert werden sollen, geht das prima mit einem Makro. Zum ausprobieren einfach einmal AltF8 und das einzige Makro in der Auflistung ausführen. Hier nun der unkommentierte Code:
Option Explicit Sub NurMitInhaltKopieren() 'Nur Zellen mit Inhalt in ein anderes Blatt kopieren Dim lRowSrc As Long, fFreeDst As Long Dim lColSrc As Integer Dim wksSrc As WorkSheet, wksDst As WorkSheet Dim ZeSrc As Long, ZeDst As Long Dim rngZe As Range With ActiveWorkbook Set wksSrc = .Sheets("Tabelle1") Set wksDst = .Sheets("Tabelle2") End With With wksSrc lRowSrc = .Cells.Find(What:="*", SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row lColSrc = .Cells.Find(What:="*", SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious).Column End With 'Mehr|weniger CodeWith wksDst If WorksheetFunction.CountA(.Cells) = 0 Then fFreeDst = 1 Else fFreeDst = .Cells.Find(What:="*", SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row + 1 End If End With On Error GoTo ErrorHandler With wksSrc For ZeSrc = 1 To lRowSrc Set rngZe = .Range(.Cells(ZeSrc, 1), .Cells(ZeSrc, lColSrc)) If WorksheetFunction.CountA(rngZe) > 0 Then rngZe.Copy wksDst.Cells(fFreeDst, 1) fFreeDst = fFreeDst + 1 End If Next ZeSrc End With ErrorHandler: If Err.Number <> 0 Then MsgBox "Fehler Nummer: " & Err.Number & vbCrLf _ & "Fehler: " & Err.Description End If End Sub
Den Original-Code finden Sie natürlich auch in der Muster-Datei.
Hinweis: Ist Ihnen aufgefallen, dass in beiden vorgestellten Versionen eine Zeile mit kopiert worden ist, die scheinbar doch leer ist? Die Betonung liegt auf „scheinbar”, denn die Zeile ist in der Tat nicht leer. Schauen Sie sich doch einmal in der Editierzeile den Inhalt von F3 an …
[NachObenLetzte Verweis=„T&T: Belegte Zeilen kopieren”]