VBA Kombinationen von zwei Spalten bilden
#1
Hallo zusammen,
ich möchte alle möglichen Kombination von den Werten in der Spalte A und Spalte B bilden.
Mit der bisherigen Codierung erhalte ich mit dem Klicken auf "Schaltfläche" das in schwarz geschriebene Ergebnis.
Ich möchte jedoch das rote Ergebnis erreichen.
Anbei ist die Excel Datei zu finden.
Dateiupload bitte im Forum! So geht es: Klick mich!
" border="0">


Angehängte Dateien
.xlsm   Mappe2.xlsm (Größe: 20,26 KB / Downloads: 4)
Top
#2
Hola,

siehe auch....

http://ms-office-forum.net/forum/showthr...p?t=325861

Gruß,
steve1da
Top
#3
Hallöchen,

in Deiner Beispieltabelle sind die Daten zuerst nach Spalte A sortiert. Dadurch könntest Du beim Eintrag in die Tabelle vom einzutragenden Inhalt die Buchstabenkombination mit dem entsprechenden vorherigen Wert Deiner Collection vergleichen, z.B. mit der MID - Funktion.
Sind die Einträge unterschiedlich, schiebst Du den zusätzlichen "kurzen" davor und erst eine Zeile später den richtigen ...

Wenn der Code von Dir ist, sollte die Programmierung kein Problem sein. Falls nicht, melde Dich nochmal.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#4
(14.09.2015, 04:58)schauan schrieb: Hallöchen,

in Deiner Beispieltabelle sind die Daten zuerst nach Spalte A sortiert. Dadurch könntest Du beim Eintrag in die Tabelle vom einzutragenden Inhalt die Buchstabenkombination mit dem entsprechenden vorherigen Wert Deiner Collection vergleichen, z.B. mit der MID - Funktion.
Sind die Einträge unterschiedlich, schiebst Du den zusätzlichen "kurzen" davor und erst eine Zeile später den richtigen ...

Wenn der Code von Dir ist, sollte die Programmierung kein Problem sein. Falls nicht, melde Dich nochmal.

Hallo schauan,
die Codierung gehört nicht mir. Kannst du bitte dabei helfen?
Danke
Vg
Juilias
Top
#5
Halo Julias,

hier ist mal ein geänderter codeteil. Du kannst hier den Teil von For ... bis Next nehmen und austauschen.

Da ist aber noch ein Fehler mit der letzten Zeile. Ich muss aber jetzt erst mal Offline gehen, schaue morgen wieder rein.


Code:
     For lngIndexB = 1 To colB.Count
       iavntErgebnis = iavntErgebnis + 1 'Counter
       ptMatchingPart = ptMatchingPart + 1 'Counter
       If lngIndexA > 1 Then
         If Mid(avntErgebnis(iavntErgebnis - 1, 1), 28, 2) <> colA(lngIndexA) Then
           avntErgebnis(iavntErgebnis, 1) = "Total " & Chr(34) & " CODE " & vehicleCodeNumber & Chr(34) & " " & Chr(34) & "PART " & ptMatchingPart & Chr(34) & " - " & colA(lngIndexA - 1)
           iavntErgebnis = iavntErgebnis + 1
         End If
       End If
       avntErgebnis(iavntErgebnis, 1) = "Total " & Chr(34) & " CODE " & vehicleCodeNumber & Chr(34) & " " & Chr(34) & "PART " & ptMatchingPart & Chr(34) & " - " & colA(lngIndexA) & "  " & " " & colB(lngIndexB)
     Next
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#6
Hallo Julias,

zum Beispielcode gehört noch die größere Dimensionierung des Arrays
Code:
ReDim avntErgebnis(1 To colA.Count * colB.Count + colA.Count, 1 To 1)

Eine fehlerhafte Zusammenstellung gibts übrigens nicht nur am Ende. Wenn Du mal irgendwo einen Namen änderst, z.B. in Otto, dann bekommst Du diesen in allen Gruppen und nicht nur dort, wo Du ihn geändert hast.

Als Lösung würde sich da eine Collection anbieten und nicht zwei. Schaue ich mir heute Abend noch mal an.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#7
Hallo Julias,

hier ist jetzt der code. Ich habe einige Kommentare drin und hoffe, dass Dir das weiter hilft.

Code:
Sub Schaltfläche1_Klicken()

  Dim vntElement As Variant
  Dim arrElement As Variant
  Dim colA As Collection
  Dim lngIndexA As Long
  
  Dim avntErgebnis() As Variant
  Dim iavntErgebnis As Long
  Dim vehicleCodeNumber As Long
  Dim ptMatchingPart As Long
  
  Set colA = New Collection
  'Daten in Array uebernehmen
  arrElement = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp).Offset(1, 1)).Value
  'Schleife ueber alle Arrayelemente
  For icnt = LBound(arrElement, 1) To UBound(arrElement, 1)
    'wenn erstes Feld des aktuellen Arrayeintrags nicht leer ist, dann
    If Not IsEmpty(arrElement(icnt, 1)) Then
      'Collectionelement aus erstem und zweitem Feld des aktuellen Arrayeintrages bilden
      Call UnikateSammeln(colA, arrElement(icnt, 1) & " " & arrElement(icnt, 2)) ' Element in Array hinzufügen
      'ab dem zweiten Schleifendurchlauf
      If icnt > 1 Then
        'Wenn sich die Vehiclecodenummer aendert, dann
        If arrElement(icnt, 1) <> arrElement(icnt - 1, 1) Then
          'Vehiclecodenummer 1 hochsetzen
          vehicleCodeNumber = vehicleCodeNumber + 1
        'Ende Wenn sich die Vehiclecodenummer aendert, dann
        End If
      'Ende ab dem zweiten Schleifendurchlauf
      End If
    'Ende wenn erstes Feld des aktuellen Arrayeintrags nicht leer ist, dann
    End If
  'Ende Schleife ueber alle Arrayelemente
  Next
  Range(Cells(2, 3), Cells(2, 3).End(xlDown)).ClearContents
  'Array dimensioniren anhand collectioneintraegen und vehiclecodenummern
  ReDim avntErgebnis(1 To colA.Count + vehicleCodeNumber + 1, 1 To 1)
  'Zaehler auf Startwert setzen
  vehicleCodeNumber = 1
  iavntErgebnis = 1
  ptMatchingPart = 1
  'Schleife ueber alle Collectioneintraege
  For lngIndexA = 1 To colA.Count
    'Wenn der Schleifenzaehler groesser 1 ist, dann
    If lngIndexA > 1 Then
      'Wenn der vehiclecode sich aendert
      If Split(colA(lngIndexA - 1), " ")(0) <> Split(colA(lngIndexA), " ")(0) Then
        'arrayeintrag ohne Name bilden
        avntErgebnis(iavntErgebnis, 1) = "Total " & Chr(34) & " CODE " & _
           vehicleCodeNumber & Chr(34) & " " & Chr(34) & "PART " & ptMatchingPart & Chr(34) & " - " & Split(colA(lngIndexA - 1), " ")(0)
        'Zaehler setzen
        vehicleCodeNumber = vehicleCodeNumber + 1
        iavntErgebnis = iavntErgebnis + 1 'Counter
        ptMatchingPart = 1
      'Ende Wenn der vehiclecode sich aendert
      End If
    'Ende Wenn der Schleifenzaehler groesser 1 ist, dann
    End If
    'arrayeintrag mit Name bilden
    avntErgebnis(iavntErgebnis, 1) = "Total " & Chr(34) & " CODE " & _
       vehicleCodeNumber & Chr(34) & " " & Chr(34) & "PART " & ptMatchingPart & Chr(34) & " - " & _
          colA(lngIndexA)
    'Zaehler setzen
    ptMatchingPart = ptMatchingPart + 1 'Counter
    iavntErgebnis = iavntErgebnis + 1 'Counter
  'Ende Schleife ueber alle Collectioneintraege
  Next
  'letzter Vehicle-Eintrag
  avntErgebnis(iavntErgebnis, 1) = "Total " & Chr(34) & " CODE " & _
     vehicleCodeNumber & Chr(34) & " " & Chr(34) & "PART " & ptMatchingPart & Chr(34) & " - " & Split(colA(lngIndexA - 1), " ")(0)
  'Ausgabe
  Cells(2, 3).Resize(iavntErgebnis).Value = avntErgebnis
  Set colA = Nothing ' referenzierten Objekts freigegeben
End Sub

Private Sub UnikateSammeln(ByRef colSammlung As Collection, ByVal vntElement As Variant)
    On Error Resume Next
        colSammlung.Add vntElement, CStr(vntElement)
    On Error GoTo 0
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste