Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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)
Antworten Top
#2
Hola,

siehe auch....

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

Gruß,
steve1da
Antworten 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)
Antworten Top
#4
(14.09.2015, 03: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
Antworten 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)
Antworten 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)
Antworten 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)
Antworten Top


Gehe zu:


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