2016-12-04 3 views
0

ich eine Reihe von Spalten haben, wobei einige Spalten dazwischen, und dann einen weiteren Satz von Spalten, das heißt:VBA: Die Kombination von zwei Gruppen von Spalten dynamisch

Vorher:

ColA ColB ColC ColA ColB ColC RandomCol1 RandomCol2 ColA ColB ColC ColA ColB ColC 
1 2  3 4 5 6 N/A   N/A  7 8 9 10 11 12 

Nach:

ColA  ColB  ColC  RandomCol1 RandomCol2 
1;4;7;10 2;5;8;11 3;6;9;12  N/A   N/A 

Wenn die erste Gruppe ist "leer":

Vorher:

ColA ColB ColC ColA ColB ColC RandomCol1 RandomCol2 ColA ColB ColC ColA ColB ColC 
blank blank blank blank blank blank N/A   N/A   7  8 9 10  11  12 

Nach:

ColA  ColB  ColC  RandomCol1 RandomCol2 
7;10  8;11  9;12  N/A   N/A 

Ich möchte die Werte in jeder Zeile jeder Spalte mit dem gleichen Namen von ; getrennt kombinieren, während dann die übrig gebliebenen Spalten zu löschen. Des Weiteren, wenn die Werte in der ersten Gruppe „leer“ sind, dann sollten sie nur die Werte aus der zweiten Gruppe übernehmen (nach Zufalls Spalten)

Die Zufalls Spalten nicht

kombiniert werden sollten

Ich habe dies versucht, das tut scheinen nicht zu funktionieren, wenn es zufällig Spalten dazwischen (auch nicht sicher, wie Logik hinzufügen, die erste „Gruppe“ überspringt, wenn der Wert „leer“ ist:

For DestCol = StartCol To EndCol 
    For ReadCol = DestCol + 1 To EndCol 
     If Cells(1, DestCol) = Cells(1, ReadCol) Then 
     For i = 2 To lastRow 
      If Cells(i, ReadCol) <> "" Then 
       Cells(i, DestCol) = Cells(i, DestCol) & ";" & Cells(i, ReadCol) 
      End If 
     Next i 
     End If 
    Next ReadCol 
Next DestCol 
+1

Verwenden Sie Excel unter Windows, da dies eine SQL-Anforderung ohne verschachtelte For-Schleifen ist? – Parfait

+0

Ich benutze Excel auf Windows, ja. Ich kann nicht sql für diese verwenden – MJ95

+0

Eigentlich können Sie SQL dafür verwenden - Sie können sql in VBA gegen Arbeitsmappen schreiben. Parfait ist eigentlich derjenige, der mir das in einer anderen Frage beigebracht hat. –

Antwort

1

Sie müssen die duplizierten Spalte löschen, nachdem sie verarbeitet

Hinweis: Sie werden feststellen, dass ich den Namen der Zähler gekürzt habe. Ich verwende immer 1 Buchstabennamen für den ersten Zähler und einen Buchstaben mit einer Nummer für ähnliche Zähler. Zum Beispiel: Wenn ich Cells(x, y) für die äußere Schleife verwende, verwende ich Cells(x1, y1) für die nächste innere Schleife. Der Grund, warum ich dies tue, ist, dass Zähler in der Regel mehrere Male im Code wiederholt werden und lange beschreibende Zählernamen Unordnung verursachen. Dies macht den Code schwerer lesbar.

Sub CombineColumns() 
    Const STARTCOLUMN As Long = 1 
    Const ENDCOLUMN As Long = 14 

    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    Dim lastRow As Long, i As Long, y As Long, y1 As Long 

    lastRow = Range(Columns(STARTCOLUMN), Columns(ENDCOLUMN)).Find(What:="*", After:=Cells(1, STARTCOLUMN), SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 

    For y = STARTCOLUMN To ENDCOLUMN 
     For y1 = y + 1 To ENDCOLUMN 
      If Cells(1, y) <> "" And Cells(1, y) = Cells(1, y1) Then 
       For i = 2 To lastRow 
        If Cells(i, y1) <> "" Then 
         Cells(i, y) = IIf(Cells(i, y) <> "", Cells(i, y) & ";", "") & Cells(i, y1) 
        End If 
       Next i 
       Columns(y1).Delete 
       y1 = y1 - 1 
      End If 
     Next y1 
    Next y 

    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 

End Sub 
Verwandte Themen