2017-12-13 6 views
0

Also die Situation ist, dass ich 4 Spalten mit variablen Längen in eine Spalte mit allen Daten aus diesen 4 kopieren möchte. Das Problem ist, ich lose Daten in dem Prozess.Kombinieren Sie bestimmte Spalten (variable Länge) in eine Spalte - Excel VBA

Als ein Beispiel sollte es 693 Zeilen sein, aber ich bekomme nur 648 Zeilen insgesamt. Ich bin relativ neu in VBA und habe diese Codezeilen entwickelt.

Sub Copy() 

Dim RngA As Range, RngB As Range, RngC As Range, RngD As Range, Rng As Range 
Set RngA = Range(Range("I2"), Range("I" & Rows.Count).End(xlUp)) 
Set RngB = Range(Range("J2"), Range("J" & Rows.Count).End(xlUp)) 
Set RngC = Range(Range("K2"), Range("K" & Rows.Count).End(xlUp)) 
Set RngD = Range(Range("L2"), Range("L" & Rows.Count).End(xlUp)) 
    Range("O2").Resize(RngA.Count).Value = RngA.Value 
    Range("O" & RngA.Count + 1).Resize(RngB.Count).Value = RngB.Value 
    Range("O" & RngB.Count + 1).Resize(RngC.Count).Value = RngC.Value 
    Range("O" & RngC.Count + 1).Resize(RngD.Count).Value = RngD.Value 


With Sheets("Keywords") 
    Columns("O:O").Sort Key1:=.Range("=O1"), Order1:=xlAscending, Header:=xlYes 
End With 

End Sub 
+2

Sie addieren nicht kumulativ die Anzahl der Zellen aller vorherigen Bereiche, z 'Range (" O "& RngB.Count + 1)' berücksichtigt nicht die Größe von RngA. – SJR

+0

Aus irgendeinem Grund verwenden Sie nicht die ['CONCATENATE()' -Funktion] (https://support.office.com/en-us/article/CONCATENATE-function-8f8ae884-2ca8-4f7a-b093-75d702bea31d) als Formel anstelle von VBA? In der Spalte O verwende '= CONCATENATE (I: I, J: J, K: K, L: L)'. –

+1

@Peh CONCATENATE wird nicht jede Spalte unter der nächsten Zeile auszeichnen, es wird alle vier dieser Zeile in der einen Zelle zurückgeben. –

Antwort

1

Siehe meinen Kommentar oben, aber hier ist ein alternativer Ansatz Arrays, die mehrere ähnlich benannten Bereichsvariablen einzurichten erspart. (Btw ich davon aus, alles auf der Keywords-Blatt ist.)

Sub Copy() 

Dim vRng(1 To 4) As Range, i As Long 

With Sheets("Keywords") 
    For i = LBound(vRng) To UBound(vRng) 
     Set vRng(i) = .Range(.Cells(2, i + 8), .Cells(.Rows.Count, i + 8).End(xlUp)) 
    Next i 
    For i = LBound(vRng) To UBound(vRng) 
     .Range("O" & Rows.Count).End(xlUp)(2).Resize(vRng(i).Count).Value = vRng(i).Value 
    Next i 
    .Columns("O:O").Sort Key1:=.Range("O1"), Order1:=xlAscending, Header:=xlYes 
End With 

End Sub 
+1

Danke für die schnelle Lösung! Es funktioniert wie ein Charme :) – JayJay

Verwandte Themen