Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array -> klassisch oder Jagged?

Forumthread: Array -> klassisch oder Jagged?

Array -> klassisch oder Jagged?
16.10.2024 08:27:28
djflyer
Hallo an @lle,

ich stehe vor einer Frage und dann ggf. auch vor einem Problem (klar, sonst würde ich hja keinen Beitrag verfassen *lach*)

Die Frage die ich habe steht auch schon im Betreff. Ich habe verschiedene Produkte in je eigener Reihe. Jedes Produkt hat folgende wichtige Spalten die ich dann für mein Array brauche. Das wäre einmal das System (wird dann in eine Zahl umgewandelt), die Kategorienummer und eine Produktnummer (beides ist schon fest vergeben). Dann sind noch weitere Spalten, die in dem Array sein müssen, aber nicht relevant für das Array sind
Jetzt könnte ich 2 unterschiedliche Arrays haben:

1. Produkt(iSystem, iCategory, iItemNumber, Spalten von der Reihe) - Nachteil, feste Größe der Dimensionen (iCategory = 1 kann z.B. 3 Produkte haben, während iCategory = 2 nur ein Produkt hat)
2. Produkt(iSystem)(iCategory)(iItemNumber)(Spalten von der Reihe) - Nachteil: kenne jetzt keinen, allerdings verzweifle ich beim erstellen

Wie es bei der Preformance bei einem Jagged Array aussieht, weiß ich nicht, aber ich gehe davon aus dass es eigentlich die schlechtere Variante wäre.
Bei dem klassischen Array kann ich halt nicht mit "UBound" arbeiten, aber genau diese Info brauche ich (natürlich könnte ich mit Variablen die Public sind arbeiten, aber ich glaube das wäre auch nicht so eine gute Lösung. Was würdet ihr also empfehlen bzw. wie würdet ihr an das Problem rangehen?

Für Ideen und Antworten bin ich gerne offen
djflyer


Beispieldatei: https://www.herber.de/bbs/user/172909.xlsm
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 09:49:48
Alwin Weisangler
Hallo,

das geht mit einem 2D Array ganz flexibel zu lösen.
Das/die in der Zelle stehenden Produkte liest du mit einem Trenner "###" via Replace ins Array ein.
Auslesen machst du mit Split und als Delimiter nutzt du "###".
Kommst du damit nicht klar, versehe deine Liste mit den entsprechenden Teilprodukten.

Gruß Uwe
Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 10:18:44
djflyer
Danke dir Uwe für deine Antwort. Ein 2D Array hab ich ja so schon hinbekommen, aber ich brauche es mindestens in 3D.
Ich hoffe meine Beispieldatei ist verständlich :-)
AW: Array -> klassisch oder Jagged?
16.10.2024 10:27:27
Alwin Weisangler
Hallo,

nein brauchst du dafür mit Sicherheit nicht.
https://www.herber.de/bbs/user/172913.xlsm
Ein Abfragebeispiel zu deiner Tabelle habe ich eingebaut.
Ein weiteres Array in einer Arrayzelle zu erzeugen ist unsinnig. Dafür gibt es Delimiter.

Gruß Uwe
Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 11:32:32
djflyer
Ich glaube mein Anliegen hab ich nicht verständlich rüber gebracht. Hab deine Datei gestestet und auch verstanden. Aber das löst mein Anliegen nicht.
In meiner Originaldatei kann man mittels Listenfelder was auswählen. Wähle ich in deiner Datei mittels einem Listenfeld das Produkt 9 aus, so müsste in dem Array "Produkt" alle Spalten dieser Reihe sein. Also in der Testdatei müsste dann es dann Quasi so aussehen (die erste Dimension ist das System):

Produkt(1, 3, 2) = Allen nötigen Spalten von Reihe 10, also Produkt(1, 3, 2, Spalten) = Wert jeder Zelle
Produkt(1)(3)(2) = Allen nötigen Spalten von Reihe 10, also Produkt(1)(3)(2, Spalten) = Wert jeder Zelle

Aber ggf. denke ich zu umständlich. Zur Vereinfachung.
Ich habe 3 Listenfelder. In dem ersten Wähle ich das System. Im 2. kommen dann nur Einträge von der Kategorie die das System haben (im ersten Listefeld gewählt). Im 3. Listenfeld dann alle Produke von der gewählten Kategorie. Und wenn ich ein Produkt habe, soll mir die Texte, die in den einzelnen Spalten sind, dann in mehrere Formen ausgegeben werden.
Durch den Listenindex des jeweilgen Listenfeldes möchte ich quasi das Array aufrufen.

Ich hoffe dass es jetzt verständlicher wird was mein Anliegen ist *lach*
Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 12:11:03
Alwin Weisangler
Hallo,

du brauchst für den bisschen Kram keine 3 Listboxen. Du brauchst 2 Comboboxen (Filterstufe 1 + 2) und 1 Listbox (für Daten schick abbilden zwecks Auswahl).
Die Listbox ist 2D und das AusgabeArray (Klick in Listbox) ist es ebenfalls. Da sehe ich aus der Ferne (fehlende Datenlage in Beispieldatei, welche dies unbedingt erforderlich macht) keinen Grund etwas zu verbiegen.
Lade mal mit nachvollziehbaren Datensätzen hoch, was du hast.

Gruß Uwe

Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 15:47:30
djflyer
So Uwe, ich hab mal das Original etwas abgespeckt und dir hochgeladen.
Hier hatte ich Listenfelder angegeben, aber im Original nutze ich Formen als Buttons.

Auf das Optische hab ich erstmal versichtet, es geht ja um die Funktion. Falls noch was unklar ist, gerne melden :-)

Gruß
Markus


https://www.herber.de/bbs/user/172932.xlsm
Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 22:33:49
Alwin Weisangler
Hallo Markus,

Was du hochgeladen hast hat nicht viel mit deiner Beschreibung zutun. Aber wenn du unbedingt für so ein paar Datensätze auszuwählen/anzuzeigen solchen einen Aufwand betreiben willst ist es natürliche deine Sache.

Vielleicht nur so viel von mir:
Das Array varItems hat doch eine zusätzliche Dimension. Das solltest du eigentlich wissen. Es sei denn der Code ist nicht von dir.
Sollte dies wirklich aus dem Netz stammen und dir der Inhalt dieser Variable unbekannt sein, kannst du im Lokalfenster diese Public Variable durch eine zusätzliche private Variable wie folgt sichtbar machen:

Dimensioniere in der Sub "UpdateItemButtons" eine zusätzliche private Variable z.B.: arrTest()
und schreibe unterhalb der Dimensionierungen dieser Sub: arrTest=varItems.

Setze einen Haltepunkt an dieser Stelle und klicke auf das Shape Alarmsystem --> trippe 1x F8 und schaue im Direktfenster dir das Array arrTest an.
Dieses zeigt dir dann den kompletten Inhalt des Arrays varItems an.

Diese Ansicht der Ausgaben kannst du für deine weitere Arbeit/Fehleranalyse etc. an diesem Projekt zu Nutze machen.

Ich würde für so ein bisschen Kram niemals einen derartigen Aufwand betreiben, zumal das kritische Array eine Public Variable ist und bei zügiger Handhabung es zum Absturz kommt (ist mir bereits passiert). Die hat zur Folge, dass das Array abschmiert (passiert immer bei auf Public gesetzten Variablen). Da muss man die Startprozedur wieder neu starten, um weiterarbeiten zu können.
Solche Arrays sollte man besser nicht Public vorhalten.

Dies habe ich dir mal entsprechend umgebaut und im Init die Erzeugung des Arrays separiert, damit das ehemals Public varItems nun eine Property ist und nebenbei bei einem Fehler das Array erhalten bleibt.
https://www.herber.de/bbs/user/172938.xlsm

Gruß Uwe
Anzeige
AW: Array -> klassisch oder Jagged?
16.10.2024 22:43:35
Alwin Weisangler
Ach ja, noch was vergessen.
Beschäftige dich mit den Property Eigenschaftenprozeduren und baue die restlichen Public Variablen ebenfalls um. Diese Variablen sind dann zumindest beim Durchlauf im Lokalfenster sichtbar und sorgen für mehr Stabilität/Selbstheilung.

Gruß Uwe
AW: Array -> klassisch oder Jagged?
17.10.2024 07:32:03
djflyer
Hallo Uwe,

danke dir für deine Rückmeldung und deiner Beispieldatei. Der Code ist von mir und ich bin mir auch bewußt dass meine varItems 4 Dimensionen hat (es werden ja alle benutzt). Zudem ist der Aufand für eine viel größere Datei und ich hatte hier in der Testdatei nur einen Bruchteil davon benutzt :-)

Ich hab sie als Public deklariert weil ich noch viel mehr Module benutze und diese Daten überall brauche. Bisher hatte ich noch keine Probleme mit öffentlichen Variablen, aber das hat ja auch nichts zu heißen. Und tatsächlich hab ich "Proberty Let & Get" noch nicht wirklich in Beispieldateien gesehen oder was darüber gelesen. Ich werde mich da mal durcharbeiten. Bevor ich es benutze, muss ich mich damit erstmal beschäftigen und verstehen.

Mein eigentliches Problem ist ja, dass ich kein Array haben wollte dass viele leere Werte hat. Wenn es unter dem System "Alarm" und Kategorie "1" 20 Produkte gibt, kann es im System "Video" in Kategorie "2" nur 2 Produkte geben, trotzdem wäre mein UBound in dieser Dimension 20. Also 18 leere Einträge. Dies wollte ich wegen der Preformance vermeiden. Aber ggf. mache ich da mir zu viele oder gar unnötige Gedanken. Ich denke oft zu kompliziert *lach*

Aber nichts desto trotz Danke ich dir für deine Mühe und Tips. Man lernt ja nie aus, gerade was das Pgrogrammieren angeht ;-)

Gruß
Markus
Anzeige
AW: Array -> klassisch oder Jagged?
17.10.2024 08:56:37
Alwin Weisangler
Hallo Markus,

es gibt für deine Frage eine kleine Hintertür.
Mit der Anweisung Redim Preserve kann man ein vorhandenes bzw. initialisiertes Array in der letzten Dimension die Größe (Anzahl der Elemente - in deinem Fall "1 to 11") verändern.
Das bedeutet aber, dass du mit der Zahl der vorhandenen Einträge die Größe (Anzahl Elemente) der letzten Dimension entweder vor dem befüllen (größtmögliche anzunehmende Anzahl an Elementen) der Elemente oder im Nachgang die Anzahl der benötigten Elemente dieser Dimension anpassen kannst.
Dies geht aber wie schon beschrieben nur mit der letzten Dimension.
kleiner Nachsatz noch: Integer macht eigentlich in den neueren Versionen keinen Sinn mehr, da VBA intern dies sowieso in Long umrechnet.

Gruß Uwe
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige