2017-08-15 3 views
-1

Ich habe ein Blatt "Data". Mit diesem Blatt schaue ich in die Spalte K. Wenn es rot ist, ziehe ich die komplette Zeile heraus und kopiere sie auf ein anderes Blatt "Delay".Kopieren Sie Daten von einem Blatt zu einem anderen mit dem Zellwert

Ich folge dem untenstehenden Code. Der Code hat keinen Fehler, aber es kopiert nur 4 rote Reihen, während ich 12 Reihen habe.

Könnte mir jemand helfen zu finden, wo ich falsch liege und welche Veränderungen ich brauche?

Sub delay() 
Dim cell As Range 
Dim nextrow As Long 
Dim a As Double 

Application.ScreenUpdating = False 
a = Application.WorksheetFunction.CountA(Sheets("Data").Range("K:K")) 
For Each cell In Sheets("Data").Range("K5:K" & a) 
If cell.DisplayFormat.Interior.Color = vbRed Then 
nextrow = Application.WorksheetFunction.CountA(Sheets("Delayed").Range("K:K")) 
Rows(cell.Row).Copy Destination:=Sheets("Delayed").Range("A" & nextrow + 1) 
End If 

Next 
Application.ScreenUpdating = False 
End Sub 
+2

Was ist der Grund für die Verwendung von 'CountA'? Ist die Spalte K garantiert nicht leer bis zur letzten Zelle in dieser Spalte? – YowE3K

+0

@ YowE3K nein es ist nicht garantiert – Jenny

+0

Was willst du dann mit dem 'CountA' erreichen? "CountA" zählt, wie viele nichtleere Zellen in der Spalte K existieren, und Sie verwenden diese, um "K5: K" & a' und "A" & nextrow + 1 'zu erzeugen, d.h. eine Art von Bereich. Warum bestimmt die Anzahl oder nicht leere Zellen die letzte Zeile, die Sie verarbeiten werden? – YowE3K

Antwort

2

Zu allererst:
WorksheetFunction.CountA zählt die Anzahl von Zellen, die nicht leer und die Werte in der Liste der Argumente, können Sie es nicht die Gesamtzahl der Zeilen zu zählen verwenden oder zu finden Nummer der letzten Zeile (es sei denn, alle Zellen sind nicht leer).
Was man braucht ist:

nmbRows = Workbook("WorkbookName").Worksheet("SheetName").Range("K" & Rows.Count).End(xlUp).Row 

oder etwas weniger stumpf.
Die Verwendung von CountA kann zu einer Einschränkung des Suchbereichs führen, was zu Datenverlusten oder in Ihrem Fall zum Einfügen einer Zeile an falscher Stelle führen kann.
Beispiel:
Ergebnis

Option Explicit 
Sub test() 
    Dim a As Long 
    a = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("Ëèñò1").Range("A:A")) 
    ThisWorkbook.Sheets("Ëèñò1").Range("B1").Value = a 
End Sub 

ist
enter image description here
Zweitens:
vorsichtig sein, fügen Sie einen Verweis auf jeden range, sheet als

ThisWorkbook.Sheets("Data").Range("K5:K" & nmbRows) 

Dadurch können Sie immer sicher sein, dass Sie auf den richtigen Bereich verweisen, den Sie überprüfen möchten.

Noch ein Hinweis:
ich nicht VBA-Experte bin, aber wenn ich Sie bin ich Anzahl der Zeilen am Anfang des Makros jeweils für jedes Blatt zählen würde, in Schleife würde ich nextrow=nextrow + 1 Aufbau statt Aufruf Funktion jedes Mal.

+2

Für die Kompatibilität mit größeren Blättern wäre es klüger, 'nmbRows = Workbook (" WorkbookName ") zu verwenden. Worksheet (" SheetName "). Range (" K "& rows.Count) .End (xlUp) .Row' statt Reihe 65.500. – CLR

+1

@CLR Sie haben Recht, schlechte Angewohnheit von 2003 – AntiDrondert

+0

Sie sollten Ihre 'Zeilen' qualifizieren, um anzugeben, welches Arbeitsblatt Sie beziehen (besonders wenn mehrere Arbeitsmappen geöffnet sind, was bedeutet, dass einige einen' Rows.Count' von 65536 und andere können 1048576 haben). Verwenden Sie daher 'nmbRows = Arbeitsmappe ("Arbeitsmappename"). Arbeitsmappe ("Arbeitsmappename"). Bereich ("K" & Arbeitsmappe ("ArbeitsmappenName"). Arbeitsblatt ("Arbeitsmappename"). Rows.Count) .End (xlUp) .Row '. – YowE3K

Verwandte Themen