2016-10-31 7 views
0

Ich habe mehrere Spalten und ich versuche, die allerletzte Zelle jeder Spalte in eine Spalte (in einem anderen Arbeitsblatt) zu kopieren.VBA: Wählen Sie die letzte Zelle im Spaltenbereich und kopieren Sie Zellen in Arbeitsblatt

Dies ist mein Code, der nicht funktioniert (ich durch Zeilen und Spalten am Looping):

Sub lastcell() 

Dim lRow As Long 
Dim lCol As Long 

Dim i As Long 


Worksheets("input").Select 

With Worksheets("input") 
Worksheets("output").Cells.ClearContents 

lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 

Set ColRange = .Range(.Cells(1, 1), .Cells(5, lCol)) 

For Each ccol In ColRange 
    lRow = .Cells(.Rows.Count, ccol).End(xlUp).Rows.Count 

    For i = 2 To 6 
    Worksheets("output").Cells(i, 1) = .Cells(lRow, ccol) 

Next i 
Next ccol 


End With 

End Sub 

Antwort

1

Sie haben eine zu viele Schleifen.

Die lRow = .Cells(.Rows.Count, ccol).End(xlUp).Rows.Count sollte mit Set ColRange = .Range(.Cells(1, 1), .Cells(5, lCol)) mit nicht .Rows.Count

auch beenden Sie durch jede Spalte Loop 5 mal gehen. Die 5 sollte eine 1

sein. Es ist nicht erforderlich, das Eingabeblatt am Anfang des Codes zu aktivieren oder auszuwählen.

ccol sollte

Sub lastcell() 

Dim lRow As Long 
Dim lCol As Long 
Dim ccol as Range 
Dim i As Long 

With Worksheets("input") 
    Worksheets("output").Cells.ClearContents 
    lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 

    Set colrange = .Range(.Cells(1, 1), .Cells(1, lCol)) 
    i = 1 
    For Each ccol In colrange 
     lRow = .Cells(.Rows.Count, ccol.Column).End(xlUp).Row 
     Worksheets("output").Cells(i, 1).Value = .Cells(lRow, ccol.Column).Value 
     i = i + 1 
    Next ccol 


End With 

End Sub 

Wir haben es mit einem einfachen deklariert werden noch weiter für Schleife vereinfachen kann:

Sub lastcell() 

Dim lRow As Long 
Dim lCol As Long 
Dim i As Long 

With Worksheets("input") 
    Worksheets("output").Cells.ClearContents 
    lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 

    For i = 1 To lCol 
     lRow = .Cells(.Rows.Count, i).End(xlUp).Row 
     Worksheets("output").Cells(i, 1).Value = .Cells(lRow, i).Value 
    Next i 

End With 

einfach einen FYI, kann dies auch getan werden mit einer Formel.

In Ihrem ersten Zelle auf dem Ausgabeblatt setzen diese Formel:

=INDEX(input!A:Z,MAX(IFERROR(MATCH("ZZZ",INDEX(input!A:Z,0,ROW(1:1))),0),IFERROR(MATCH(1E+99,INDEX(input!A:Z,0,ROW(1:1))),0)),ROW(1:1)) 

Und dann kopieren/ziehen die Formel nach unten, bis Sie erhalten 0 s

Verwandte Themen