2D Array an 2D Array anhängen?
28.04.2022 16:48:13
Marc
ich bin auf eine Frage gestossen, die nicht wirklich wichtig für ein Projekt ist, mich aber doch interessiert. Vielleicht könnt Ihr mir hier weiterhelfen?
Ich würde gerne ein 2D-Array an ein 2. 2D-Array mit gleicher 2. Dimensionierung anhängen (analog bei einem Excelbereich einen 2. Bereich mit identischer Spaltenanzahl unten anfügen, ich hoffe, so ist es klar formuliert). Dabei möchte ich wenn möglich die folgenden Vorgaben einhalten:
- Exakt gleiche Reihenfolge
- Falls ein gleicher Eintrag im 1. Array bereits existiert, soll er ausgelassen werden
- Ich möchte die 2 Arrays nicht in einem Tabellenblatt zwischenspeichern
Hintergrund: Ich habe in einer Anwendung ein Formular mit 2 Listboxen. Listbox 1 enthält Einträge aus einer Suche, Listbox 2 die bereits ausgewählten Einträge. Es wird dabei nur jeweils die "1. Spalte" der 2. Dimension angezeigt, über die restlichen "Spalten" der 2. Dimension werden so "versteckte" Attribute für die weitere Verarbeitung übergeben. Über Schaltflächen "Hinzufügen" werden die Einträge der Listbox 1 in der Listbox 2 unter den bestehenden Einträgen hinzugefügt, Doppeleinträge werden dabei übersprungen. Das funktioniert auch einwandfrei mittels 2 For-Schleifen und Listbox.AddItem. Anbei zur Info der funktionierende Code:
Private Sub cmdAddAll_Click()
Dim lIndex As Integer
Dim lIndex2 As Integer
Dim varZaehler As Integer
Dim varExist As Boolean
varZaehler = 0
For lIndex2 = 0 To ListBoxLieferanten.ListCount - 1
varExist = False
For lIndex = 0 To ListBoxAuswahl.ListCount - 1
If Val(ListBoxAuswahl.List(lIndex, 9)) = Val(ListBoxLieferanten.List(lIndex2, 9)) Then varExist = True
Next lIndex
If varExist = False Then
ListBoxAuswahl.AddItem
ListBoxAuswahl.List(lIndex, 0) = ListBoxLieferanten.List(lIndex2, 0)
ListBoxAuswahl.List(lIndex, 1) = ListBoxLieferanten.List(lIndex2, 1)
ListBoxAuswahl.List(lIndex, 2) = ListBoxLieferanten.List(lIndex2, 2)
ListBoxAuswahl.List(lIndex, 3) = ListBoxLieferanten.List(lIndex2, 3)
ListBoxAuswahl.List(lIndex, 4) = ListBoxLieferanten.List(lIndex2, 4)
ListBoxAuswahl.List(lIndex, 5) = ListBoxLieferanten.List(lIndex2, 5)
ListBoxAuswahl.List(lIndex, 6) = ListBoxLieferanten.List(lIndex2, 6)
ListBoxAuswahl.List(lIndex, 7) = ListBoxLieferanten.List(lIndex2, 7)
ListBoxAuswahl.List(lIndex, 8) = ListBoxLieferanten.List(lIndex2, 8)
ListBoxAuswahl.List(lIndex, 9) = ListBoxLieferanten.List(lIndex2, 9) ' ID
Else
varZaehler = varZaehler + 1
End If
Next lIndex2
End Sub
Mein Luxus-Problem: Wenn ohne Selektionskriterien einfach alles übernommen wird, dann können dies auch mal 10.000 Einträge sein, die übernommen werden. Und dann ist das laaaangsam;-). Ich versuche das irgendwie zu beschleunigen. Eine Idee war nun, anstelle mit den Listbox-Inhalten einfach mit 2 Arrays zu arbeiten. Die Pros werden mir wahrscheinlich sagen, dass dies keine Verbesserung bringen würde, das ist mir klar (oder?). Aber die theoretische Idee hat mich nun gepackt.Meine Fragen: Gehe ich über ein temporäres 3. Array? Aber wie dimensioniere ich da die 1. Dimension wenn ja Doubletten rausfallen sollen? Loope ich vorher einmal durch und zähle die Doubletten?
Hat einer von Euch eine coole Idee? Danke im Voraus für Eure Ideen!
Lg
Marc