Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1616to1620
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
Inhaltsverzeichnis

Doppelte Array´s vermeiden

Doppelte Array´s vermeiden
07.04.2018 12:43:54
Tim
Hallo zusammen,
ich brauch mal wieder euren Rat, sitze da jetzt seit fast 2 Tagen dran und komme nicht weiter. Bestimmt ballere ich wieder mit Kanonenkugeln aus Spatzen und es geht anders ganz einfach.
Hier die Beschreibung des Problems.
Eine kleine Liste
Userbild
Filtere ich diese Liste nach einem Artikel...
Userbild
...dann sieht man auf dem Ersten Blick: Es gibt 4 verschiedene Einträge bei diesem Artikel
Userbild
Wie befülle ich meine Arrays mit genau diesen Werten.
Das Problem was ich habe, Ich weiß gar nicht im Vorfeld, wie viele Arryas ich benötige. Es sind so etwa zwischen 1 und 10, daher werde ich wohl immer leere haben? Und ich müsste bevor ich ein Arry befülle, alle schon befüllten überprüfen ob es diesen Wert nicht schon gibt.
Und wie bringe ich die Arrays dann in einer Chronologischen Reihenfolge.
BCDX
Wie in diesem Beispiel
Array (1)= B Array (2)= C Array (3)= D Array (4)= X
Hier mal mein Versuch
Sub Mengen_prüfen()
Dim i As Long, u As Long, z As Integer
Dim Artikel_1, Artikel_2, Artikel_3 As String
Dim Artikel_1_max, Artikel_2_max, Artikel_3_max As Long
Dim ws As Worksheet
Dim Artikel_1_Arry(100) As Variant
Set ws = Worksheets(1)
Artikel_1 = "Flasche"
Artikel_2 = "Tisch"
Artikel_3 = "Apfel"
'Artikel_1 wird überprüft
For i = 2 To 100 ' to Listenende
If Cells(i, 1) Like Artikel_1 Then
u = u + 1
Artikel_1_max = u
If u = 1 Then Artikel_1_Arry(u) = Cells(i, 2) 'beim 1. Eintrag müssen keine doppelten geprü _
ft werden
If u > 1 Then 'Grösser 1, es muss geprüft werden ob es doppelete gibt
For z = 1 To 100 'es gibt max 100 Array
If Cells(i, 2).Value  Artikel_1_Arry(z) Then 'wie überprüfe ich alle, bevor  _
neuer Arry geschrieben wird?
Artikel_1_Arry(u) = Cells(i, 2)
End If
Next z
End If
End If
Next i
'Nur für den test
For z = 1 To 20
Debug.Print "Artikel_1_Arry(" & z & ") = " & Artikel_1_Arry(z)
' Das richtige Ergebnis sollte hier sein:
' Artikel_1_Arry(1)= B  Artikel_1_Arry(2)= C  Artikel_1_Arry(3)= D  Artikel_1_Arry(4)= X
Next z
Debug.Print Artikel_1 & "hat " & Artikel_1_max & " verschiedene  Einträge"
' Bei Artikel 1 sollte das Ergebnis 4 sein nicht 14
End Sub
Meine Beispiel Datei:
https://www.herber.de/bbs/user/120910.zip
Vielleicht hab Ihr ja eine Lösung für dieses kniffelige Problem.
Gruß & Danke Tim

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Doppelte Array´s vermeiden
07.04.2018 14:29:16
Zwenn
Hallo Tim,
ich habe zwar Dein Problem nicht ganz durchdrungen (Deine Beschreibung sieht für mich erstmal so aus, als speicherst Du pro Array nur einen Wert), aber wenn Du vor dem Start des Makros nicht weißt, wieviele Listen Du anlegen musst, dann bieten sich wahrscheinlich eher Collections für Dein Anliegen an. Eine Collection ist ein Objekt, weshalb Du z.B. innerhalb einer Collection zur Laufzeit eine neue Collection hinzufügen kannst. Genau das geht mit Arrays nicht. Da musst Du durch die Anzahl der Deklarationen für Arrays statisch festlegen, wieviele zur Laufzeit zur Verfügung stehen.
Zu Collections kannst Du Dich hier mal belesen:
(Ab Seite 89 unten)
http://books.google.de/books?id=aJSvqBYrHlgC&pg=PA89&dq=collections+isbn:3827325250
Ein sehr gutes Tutorial zu Arrays und vor allem Collections findest Du hier:
(Eigentlich für Access, aber da es eine reine Sprachbeschreibung ist, sollte das Egal sein. Hier wird auch beschrieben, wie Du zur Laufzeit weitere Collections erzeugst. Den Link habe ich aus einem Beitrag von Mullit übernommen)
http://www.office-loesung.de/ftopic429248_0_0_asc.php
Viele Grüße,
Zwenn
Anzeige
AW: Doppelte Array´s vermeiden
07.04.2018 15:04:42
Tim
Danke Für die Antwort.
Zeitgleich bin ich scheinbar auch über "Collection" und habe mir das zusammen gezimmert:
Diese "Collection" ist noch absolutes Neuland für mich, war heute mein erster Kontakt damit
Sub Mengen_prüfen()
Dim i As Long, u As Long, z As Integer
Dim Artikel_1, Artikel_2, Artikel_3 As String
Dim Artikel_1_max, Artikel_2_max, Artikel_3_max As Long
Dim ws As Worksheet
Dim Artikel_1_Arry(100) As Variant
Dim SL As Object
Set ws = Worksheets(1)
Artikel_1 = "Flasche"
Artikel_2 = "Tisch"
Artikel_3 = "Apfel"
'Artikel_1 wird überprüft
For i = 2 To 100 ' to Listenende
If Cells(i, 1) Like Artikel_1 Then
z = z + 1
Artikel_1_Arry(z) = Cells(i, 2)
End If
Next i
'doppelte löschen & sortieren
Set SL = CreateObject("System.Collections.sortedlist")
For i = 1 To UBound(Artikel_1_Arry) - 1
If Artikel_1_Arry(i)  "" Then _
SL(Artikel_1_Arry(i)) = ""
Next i
Artikel_1_max = SL.Count
Debug.Print Artikel_1 & " hat " & Artikel_1_max & " verschiedene  Einträge"
Erase Artikel_1_Arry ' löscht den Array
For i = 0 To Artikel_1_max - 1
Artikel_1_Arry(i) = SL.GetKey(i)
Debug.Print "Artikel_1_Arry(" & i & ") = " & Artikel_1_Arry(i)
Next i
End Sub
Irgendwie scheint es zu klappen :)
Ich befülle erst alle Array´s sortiere sie mit der Collection und schreibe sie danach zurück in die Arrays. Ihr werdet wahrscheinlich die Hände über den Kopf schlagen. Momentan weiß ich es noch nicht besser.
lg Tim
Anzeige
AW: Doppelte Array´s vermeiden
07.04.2018 15:12:20
onur
In Arr(0,0) steht Anz aller Artikel, Arr(0,x) die Aritkelbez.
AW: Doppelte Array´s vermeiden
07.04.2018 15:16:09
onur
In Arr(0,0) steht Anz aller Artikel, Arr(0,x) die Aritkelbez.
In Arr(x,0) Anzahl Kennungen des Artikels, In Arr(x,y) die jeweilgen Kennungen.
https://www.herber.de/bbs/user/120915.xlsm
AW: Doppelte Array´s vermeiden
07.04.2018 17:12:08
Tim
Oh krass Onur, da hast du mir aber einen harten Brocken hin geworfen.
Das ist ja universal All in one :). Wie lange hast Du dafür gebraucht?
Es macht echt Spaß damit rum zu spielen.
Das Ergibt....
'Arr(0, 0) ' Anzahl der Artikel
'Arr(x, 0) ' Anzahl von Kennungen von x
'Arr(0, x) ' Artikelbezeichnung von x
'Arr(x, y) ' x Artikel, y Kennung
For i = 1 To Arr(0, 0) ' Anzahl der Artikel
Debug.Print i & ". " & Arr(0, i) & " mit  " & Arr(i, 0) & "" & " Kennungen"
Next i
Debug.Print " "
For z = 1 To Arr(0, 0) 'Für alle Artikel
Debug.Print "Ergebnis von " & Arr(0, z) 'Flasche
For i = 1 To Arr(z, 0) 'Arr(z, 0) 'max von Flasche
Debug.Print "Kennung " & i & "= " & Arr(z, i)
Next i
Debug.Print " "
Next z
das...
1. Apfel mit  4 Kennungen
2. Tisch mit  2 Kennungen
3. Flasche mit  4 Kennungen
4. Hemd mit  1 Kennungen
Ergebnis von Apfel
Kennung 1= A
Kennung 2= B
Kennung 3= C
Kennung 4= Z
Ergebnis von Tisch
Kennung 1= A
Kennung 2= C
Ergebnis von Flasche
Kennung 1= C
Kennung 2= D
Kennung 3= X
Kennung 4= B
Ergebnis von Hemd
Kennung 1= Z
Ich habe mal die Tabellenwerte verändert, das einzige Manko ist, dass es nicht chronologisch ist.
aus C,D,X,B müsste B,C,D,X werden. Die Reihenfolge ist genau so wie es zu erst kommt. Hast du dafür auch noch eine Lösung?
lg Tim
Anzeige
AW: Doppelte Array´s vermeiden
07.04.2018 15:50:10
Daniel
Hi
Schau dir mal das Dictionary-Objekt an.
Das ist im Prinzip ein eindimensionales Variant-Array, bei dem der index durch einen beliebigen Freitext gebildet wird.
Gruß Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige