ReDim und UBound bei mehrdimensionalem Array

  • Word

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von helpme.

    ReDim und UBound bei mehrdimensionalem Array

    Guten Morgen,

    ich habe mich bereits ein bisschen umgeschaut hier und bin auch auf folgendene Thread gestoßen:
    2-dimensionales dynamisches Array

    Dieser hilft mir aber auch nicht wirklich weiter. Zu meinem Problem:

    Ich habe ein Array mit 4 Spalten und n Zeilen. In meinem Projekt lese ich aus einer XML-Datei Daten ein und möchte diese in ein dynamisches Array speichern. Der Sub sieht wie folgt aus:

    Quellcode

    1. Sub FillSkillArray()
    2. Dim lngArray As Long
    3. ReDim ASkills((UBound(ASkills, 1) + 1), 4) 'Preserve?
    4. ASkills((UBound(ASkills)), 1) = sklstrBereich
    5. ASkills((UBound(ASkills)), 2) = sklstrKategorie
    6. ASkills((UBound(ASkills)), 3) = skllngRating
    7. ASkills((UBound(ASkills)), 4) = sklstrSkill
    8. End Sub


    In der Codezeile mit ReDim bekomme ich einen Fehler, dass es eine Typenunverträglichkeit gibt. Das ganze findet in einer Klasse statt, die Variablen sind gefüllt mit Werten. Für jedes Mal wenn das Programm in diese Sub kommt soll das Array eine weitere Zeile dazu bekommen. Ist das grundsätzlich möglich? Kann alternativ immer eine Spalte hinzugefügt werden? Wie funktioniert das mit dem Preserve?

    Vielen Dank im Vorraus und liebe Grüße,
    helpme. 8o

    edit:
    lngArray war ursprünglich zu Testzwecken um die aktuelle Größe des Arrays abzuspeichern. Funktioniert aber auch nicht

    edit:
    Ich habe den Dreh jetzt fast raus. Ich hatte das Array falsch deklariert. Trotzdem laufe ich immernoch auf den Fehler, dass das Array "bereits redimensioniert wurde", wenn ich in besagte Zeile komme.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „helpme“ ()

    Wie ist ASkills ursprünglich deklariert?

    Ohne Preserve verlierst du den Inhalt des Arrays und erzeugst ein leeres neues.
    Mit Preserve verlierst du den Inhalt nicht, sondern du erzeugst ein neues Array und kopierst die alten Daten da rein.

    Je nach Arraygröße und -Typ kann das ganz schön in die Performance gehen.
    Einfacher ist von Anfang an ein Array zu füllen, das groß genug ist, als bei jedem Eintrag per ReDim Preserve ein neues Array zu erzeugen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    ich habe derzeit selber ein bisschen rumprobiert und habe bemerkt, dass ich das Array falsch deklariert hatte. Nun ist es anfangs mit ASkills() deklariert und später in der Initialisierung mit ASkills(3,0). Da ich das Projekt möglichst dynamisch aufbauen möchte dachte ich mir das sei eine gute Möglichkeit dies zu tun. Für jeden Eintrag der hinzukommt, wird das Array um eine Spalte (dies, da man ja nur die letzte Dimension verändern kann) erweitert und um den Inhalt ergänzt.

    Was ich eben vergessen hatte zu erwähnen war folgendes: Das Array dient als nur als Zwischenspeicher. Der Inhalt des Arrays wird im Anschluss direkt in eine Tabelle eingelesen. Bisher klappt also alles wie es soll, perfomancetechnisch lässt sich allerdings darüber streiten, ob es nicht doch etwas besseres gibt. ;)

    edit:
    Array(3,0), da Null-Basiert