Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
240to244
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
240to244
240to244
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA Array abgleichen

VBA Array abgleichen
04.04.2003 11:45:10
ChrisL
Hallo Forum

Habe mein Problem Gestern schon beschrieben, doch leider nur ein Stichwort als Antwort bekommen.
https://www.herber.de/forum/messages/240012.html

Habe 3 Listbox (je mit 4 Spalten).

1. ListBox enthält ALLE Daten
2. ListBox enthält manche der Einträge aus ListBox 1 aber nicht alle.

Und in der 3. ListBox sollen nun alle Einträge aus ListBox 1, welche nicht schon in ListBox 2 enthalten sind aufgeführt werden. Also im Prinzip ListBox3 = ListBox1 - ListBox2.

Es wurde mir empfohlen, die ListBoxen in eine Array einzulesen und so zu vergleichen.

Nun habe ich das Einlesen wie folgt versucht:

ReDim MyArray1(1 To ListBox1.ListCount, 0 To 3)
MyArray1 = ListBox1.List

ReDim MyArray2(1 To ListBox2.ListCount, 0 To 3)
MyArray2 = ListBox2.List

Es kommt ein Fehler "can't assign to array". Also hier wäre das erste Problem.

Weiter muss ich vergleichen. Hierzu habe ich nachstehenden Beitrag gefunden:
https://www.herber.de/forum/archiv/140to144/t140959.htm

Ich denke die darin aufgeführte Funktion ist ein guter Ansatz. Jedoch weiss ich nicht, wie ich die Anwendung auf eine Array-Zeile beziehe. Im Beispiel stehts so...
MsgBox Vergleich(Array("A", "B", "C", "D"), Range("I10:I46"))

Bräuchte also etwas im Stil "Vergleich(Array1(Zeile1), Array2(Zeile2). Weiss leider nicht wie man Zeilen einer Array anspricht.

Und zum Schluss müsste man dann die Zeilen wieder in eine dritte Array einlesen. Damit habe ich mich aber noch nicht auseinander gesetzt. Würde mich auch hierzu über Vorschläge freuen.

Im Voraus herzlichen Dank an alle die etwas dazu beitragen können/wollen. Ich hoffe mein Problem ist nicht "too much". Bin gewillt mich mit dem Thema auseinander zu setzen, aber brauch ein kleiner Anstoss.

Gruss
Chris

PS: Ueber die Tabelle möchte ich nicht abgleichen aus Gründen beschrieben im letzten Beitrag.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: VBA Array abgleichen
04.04.2003 11:56:00
L.Vira
Wie kommen die Daten in die beiden Listboxen(code,RowSource)?
Re: VBA Array abgleichen
04.04.2003 12:16:20
ChrisL
Hallo L.Vira

Mit Code... sehr vereinfacht so...

ListBox1.ColumnCount = 4
ReDim MyArray(1 To 4, 0 To 3)
For i = 1 To 4
MyArray(i, 0) = "A" & i
MyArray(i, 1) = "B" & i
MyArray(i, 2) = "C" & i
MyArray(i, 3) = "D" & i
Next i
ListBox1.List = MyArray


Im Detail so...

UWJahr = Year(AUebersicht.LabelAblauf1)
ZeilenZahl = Sheets(UWJahr).Range("A65536").End(xlUp).Row

AUebersicht.ListStandort1.Clear
AUebersicht.ListStandort1.ColumnCount = 4

lngArr = 0

For i = 2 To ZeilenZahl
If Workbooks("DB2.xls").Sheets(UWJahr).Cells(i, 1) = Laufnummer Then lngArr = lngArr + 1
Next i
If lngArr = 0 Then Exit Sub
ReDim MyArray(1 To lngArr, 0 To 3)
lngArr = 0
For i = 2 To ZeilenZahl
If Workbooks("DB2.xls").Sheets(UWJahr).Cells(i, 1) = Laufnummer Then
lngArr = lngArr + 1
MyArray(lngArr, 0) = Workbooks("DB2.xls").Sheets(UWJahr).Cells(i, 2)
MyArray(lngArr, 1) = Workbooks("DB2.xls").Sheets(UWJahr).Cells(i, 3)
MyArray(lngArr, 2) = Workbooks("DB2.xls").Sheets(UWJahr).Cells(i, 6)
MyArray(lngArr, 3) = Workbooks("DB2.xls").Sheets(UWJahr).Cells(i, 7)
End If
Next i
AUebersicht.ListStandort1.List = MyArray

(Ist eine externe Datei, die zuerst geöffnet wird).


Gruss
Chris

Anzeige
Re: VBA Array abgleichen
04.04.2003 12:42:17
L.Vira
Das ist nur eine Listbox und die zweite?
Re: VBA Array abgleichen
04.04.2003 12:48:23
ChrisL
Sorry, die zweite nach dem genau gleichen Prinzip. Allerdings aus einer anderen Datei, die ebenfalls erst geöffnet wird. Auch hier wird anhand des Jahres das Blatt ausgesucht und in Spalte A die Einträge mit der richtigen Laufnummer gesucht.
Re: VBA Array abgleichen
04.04.2003 13:11:14
L.Vira
So wie dein Code aussieht, ist die Performance sicher nicht besonders gut. Du hast doch die Daten dann schon in Arrays, da kannst du sie doch vorher vergleichen und erst dann die Listboxen füllen.
Um wieviel Datensätze gehts denn eigentlich pro Array?
Re: VBA Array abgleichen
04.04.2003 13:26:47
ChrisL
Ja theoretisch ist das schon möglich, aber da die ListBox3 in einem anderen UF ist, das erst später geladen wird. OK könnte schon vorher schon laden oder über ein versteckte Listbox4 oder so ähnlich.

Tabelle 1 insgesamt etwa 1000 Einträge davon in ListBox1 vielleicht durchschnittlich 50 Einträge (manchmal 100)

Tabelle 2 insgesamt etwa 100, davon in ListBox2 etwa so 5-10.

In ListBox3 also die verbleibenden ca. 90-95.

Wenn das mit dem Array zu umständlich ist, kann ich wie gesagt schon über die Tabelle, aber dachte einfach statt 1000 Einträge in der Tabelle abgleichen ginge es besser mit der ListBox.

Danke dass du dich mit dem Problem auseinander setzt und Gruss

Chris


Anzeige
Re: VBA Array abgleichen
04.04.2003 14:54:18
GerdZ
Hallo Chris,

zu Deiner Ursprungsfrage:
Das Array, welche die Listeneinträge aufnehmen soll, muß als Variant deklariert werden und darf nicht dimensioniert sein.


    Dim MyArrayLB1 oder Dim MyArrayLB1()
MyArrayLB1 = ListBox1.List
Gruß
Gerd
Re: VBA Array abgleichen
04.04.2003 15:46:23
ChrisL
Hallo Gerd

Danke für die Antwort. Erster Schritt ist damit getan.

Hast du für das Problem insgesamt auch eine Idee oder ist es wirklich zu umständlich, so dass ich besser mit der Tabelle arbeite?

Gruss
Chris

Re: VBA Array abgleichen
04.04.2003 16:17:26
L.Vira
Dass die dritte Listbox in einem userform ist, das noch gar nicht geladen ist, ist natürlich eine neue Erkenntnis. In einem
userform würde es natürlich auch leicht mit RemoveItem gehen.
Aber dass nur eine der 4 Spalten verglichen werden muss ist noch richtig?
Du könntest auch, da ja die Arrays für LB1 und LB2 sowieso schon mal eingelesen sind, in zwei(temporäre)Blätter schreiben und dort
den Abgleich für LB3 machen.
Anzeige
Re: VBA Array abgleichen
04.04.2003 16:31:30
ChrisL
Hallo L.Vira

Es tut mir leid, dass ich mich scheinbar nicht klar ausgedrückt habe. Ich weiss wie nervig das ist, wenn plötzlich die Situation ganz anders aussieht, nach dem Motto "wieso hast du das nicht gleich gesagt!". Also vielmal sorry.

1. Alle 3 ListBoxen befinden sich in Userforms.

2. RemoveItem habe ich zuerst auch gedacht. In meinem gestrigen Beitrag habe ich folgenden Ansatz/Versuch gepostet:

For i = 0 To ListBox3.ListCount - 1
For ii = 0 To ListBox2.ListCount - 1
'If ListBox3.ListIndex(i) = ListBox2.ListIndex(ii) Then ListBox2.RemoveItem ListBox2.ListIndex(ii)
Next ii
Next i

Worauf mir empfohlen wurde das ganze in eine Array einzulesen und dort zu vergleichen.

3. Leider nein, alle 4 Spalten einer Zeile müssen übereinstimmen bzw. verglichen werden.

Und zum Schluss... in ein temporäres Blatt wäre zwar möglich, aber nicht günstig. Die eigentlich Datei ist auf ReadOnly gesetzt und wird durch mehrere User (max. 10) gleichzeitig benutzt. Müsste also für jeden User ein eigenes temporäres Blatt erstellen lassen. Damit es keinen Konflikt beim Oeffnen der externen Tabelle (dort wo die Listbox Daten her kommen) gibt, habe ich eine Sicherung eingebaut.

Wenn es mit Remove klappen würde wäre das Ideal, aber mein Code ist offensichtlich noch fehlerhaft.

Gruss
Chris

Anzeige
Re: VBA Array abgleichen
04.04.2003 16:46:42
L.Vira
Wenn du Removen willst, dann in der box, wo removed werden soll von unten anfangen, Beispiel:
Private Sub cmdClear_Click()
Dim i As Long, j As Long
For i = 0 To lis2.ListCount - 1
For j = lis3.ListCount - 1 To 0 Step -1
If lis2.Column(2, i) = lis3.Column(2, j) Then
lis3.RemoveItem (j)
End If
Next
Next
End Sub

Bei allen 4 Spalten muss die Bedingung natürlich erweitert werden.
Das mit dem temporären Blatt versteh ich nicht, da das ja nach der Aktion sofort wieder gelöscht wird.

Übrigens würde ich dir empfehlen, mit Objektvariablen oder
zumindest mit With Rahmen zu arbeiten um die ewigen Wiederholungen der Objektnamen zu vermeiden.

Anzeige
super judihuuu
04.04.2003 17:15:34
ChrisL
Hallo L.Vira

Yessss, dies ist die Lösung!!!

Also recht vielen Dank für Deine Geduld. Muss eine echte Tortur gewesen sein :-)

Das mit dem temporären Blatt lass ich nun mal... vielleicht hab ich tatsächlich einen Knopf in der Leitung.

Und das mit "With" hast du recht. Hab nämlich schon langsam wunde Finger vom Tippen.

Wünsche ein schönes Wochenende (meins ist nun definitv gerettet)

Gruss
Chris

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige