"variablen" Arraynamen deklarieren?

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Stefan2.

    "variablen" Arraynamen deklarieren?

    Hallo,
    ich beschäftige mich erst seit kurzem mit VBA und habe eine wahrscheinlich dumme Frage... hoffe aber, dass sie mir trotzdem jemand beantwortet ;)
    Ich möchte ein mehrdimensionales, dynamisches Array erstellen. Soweit so gut, das krieg ich hin. Heißen soll es data und hinten dran eine fortlaufende Nummerierung. Geht das? Um es noch mal genauer zu erklären, was ich meine: Ich habe eine zu Beginn unbekannte Anzahl von Datensätzen, die als data0(), data1(), data2() etc bis eben datan() abgespeichert werden sollen. Kann ich diesen "variablen" Namen irgendwie deklarieren? Ich kann sie ja nicht alle über dim data() deklarieren, da ich nicht weiß, wieviele Datensätze ich brauchen werde.

    Hoffe das war halbwegs verständlich ausgedrückt 8|
    Vielen Dank auf jeden Fall schon mal für Hilfe =))

    RE: "variablen" Arraynamen deklarieren?

    Ob das geht weiss ich zwar nicht. Mit Bordmitteln wäre mir jedenfalls nicht bewusst, wie man das anstellen könnte. Hingegen frage ich mich, inwiefern das sinnvoll sein könnte.

    Nafreyu schrieb:

    Ich möchte ein mehrdimensionales, dynamisches Array erstellen. Soweit so gut, das krieg ich hin.

    Kriegst Du das wirklich hin? Ich würde z.B. alle Datensätze in einen einzigen dynamischen Array aufnehmen und diesen jeweils mit "ReDim ... Preserve" in der Grösse anpassen. Oder ich würde dazu beispielsweise ein Recordset Objekt verwenden. In beiden Varianten hat man dann nur eine Variable, was m.E. auch deutlich einfacher zu verwalten ist.

    Was willst Du denn konkret machen?
    Was ich machen will, ist gar nicht so einfach zu erklären. Ich habe einen Datensatz, in meinem Fall ein Bild, in einer bestimmten Größe (in Pixeln). Dieses Bild will ich in n x m Teilbilder "aufteilen", dh ich habe Eingabefelder für die Anzahl Bilder in x und y Richtung, z.B. 3 mal 4 oder so. Das ginge ja noch, aber erstens muss ich mit diesen Teilbildern einzeln weiterarbeiten, deshalb brauche ich sie als individuell abrufbare Daten im Arbeitsspeicher, und zweitens müssen die sich auch noch jeweils an den Rändern um eine ebenfalls individuell einstellbare Anzahl Pixel überlappen :wacko: Sehr verwirrend alles glaube ich, sorry^^
    Da hatte ich halt die Idee, dass ich mein Ausgangsarray, data (den ich auch im Arbeitsspeicher behalten will), in Einzelarrays data0 bis data n umwandle, die ich dann einzeln aufrufen, weiterbearbeiten, und hinterher abspeichern kann.

    Hoffe es ist einigermaßen klar, was ich meine... das Hochladen der Ursprungsdaten ist kein Problem und das Weiterbearbeiten hinterher auch nicht, das mach ich mit Zusatzbibliotheken. Nur dafür brauche ich Arrays wenns geht ;)
    Ich versuche gerade diese Collections zu verstehen, da ich mit Sicherheit so etwas auch brauchen kann. Leider gibt es in meinem VB-Buch dazu keinerlei Hinweise, so dass ich auf die VB-Hilfe angewiesen bin, die hierzu leider etwas knapp ist.
    Dort steht, dass man in einer Collection verwandte Elemente auflisten kann. Könnt ihr mir sagen was mit „verwand“ gemeint ist, wenn der Datentyp unterschiedlich sein darf?
    Das wäre eigentlich die brennendste Frage, denn ich denke, dass ich die restlichen Unklarheiten durch ausprobieren heraus bekommen kann.
    Bin heute mal wieder online, daher zwar spät aber vielleicht hilft es:

    In der Hilfe ist die Verwandschaft so zu verstehen, wie Du es als Programmierer betrachtest ... z.B. alle Datenfelder eines Datensatzes sind für Dich als Ersteller des Datensatzes miteinander verwandt ... dem Programm ist es aber relativ schnuppe.

    Collections werden in fast keinen VBA Buch behandelt, was ich sehr schade finde da Collections zum programmieren fast schon genial sind. Gegnüber Arrays haben sie nur Vorteile, bis auf den einzigen Nachteil das sie langsamer als Arrays sind. Der Nachteil wird aber erst ab sehr großen Inhalten wirklich spürbar.

    Bei rd. 24.000 Inhalten (pro Collection/Array) liegt der Zeitvorteil in etwa bei rd. 50%. Weiss ich so genau, weil ich gerade das Thema hatte in einer ComboBox im Extremfall alle in der Mappe beinhalteten Schlüsselbegriffe zur Auswahl zur Verfügung zu stellen. Mit einer Collection lag ich da bei rund 4 Sekunden Ladezeit der ComboBox und bei der Befüllung der ComboBox über ein Array waren es knapp 2 Sekunden (gegenüber der direkten Befüllung der ComboBox die 14 Sekunden dauerte ^^).

    Allerdings gibt es für die Collection einen entscheidenden Vorteil ... man kann sie clearen über Set colXYZ = Nothing. Ein Array kannst Du solange es aktiv ist nicht clearen und es ist - zumindest in 2003 - solange aktiv wie man im Prozedurablauf ist. Bevor Schlaumeier kommen: Redim myArray() geht - aus welchen Gründe auch immer - in 2003 nicht und selbst per Schleife rückwärts Ubound clearen und um 1 runterdimensionieren geht nicht, spricht man innerhalb des kompletten Prozedurablaufes das Array wieder an ist es noch voll, obwohl Ubound 0 zeigt, befüllt man es wieder hat man die alten Inhalte trotzdem drinnen. ^^ Allerdings falls jmd eine Idee hat wie man ein Array löscht ... HER DAMIT! ;)

    Gruß

    Rainer
    *verneigtief*

    Hab's gleich ausprobiert ... tatsächlich, Speicher ist wie in der Hilfe beschrieben danach völlig leer. Bin begeistert: That's it!

    Besten Dank dann, danach habe ich krampfhaft gesucht ... in Büchern und im Internet und hier so nebenbei bekomme ich die Antwort. *g*

    Kommt davon, wenn man Programmieren nicht an irgendeinem Institut gelernt, sondern sich mühselig selber beigebracht hat. ;)

    Gruß

    Rainer
    Jetzt wollte ich zum ersten mal eine Collection verwenden und bin schon über das erste Problem gestolpert.
    Wie ändert man Werte in der Collection?
    Ich versuche das Problem mal anhand eines einfachen Beispieles zu verdeutlichen:

    Ich habe eine Fußballliga mit einer unbekannten Anzahl an Vereinen, die ich in einer Collection gespeichert habe.
    Bei einem der Vereine muss nach einem Sieg der Punktestand erhöht werden.
    Hier ein Codebeispiel, das aber leider nicht funktioniert:

    Visual Basic-Quellcode

    1. Sub Beispiel()
    2. Dim Liga As New Collection
    3. Dim Punkte As Integer
    4. '--- Liga erstellen ---
    5. Liga.Add Item:=10, key:="Real Madrid"
    6. Liga.Add Item:=5, key:="Inter Mailand"
    7. Liga.Add Item:=7, key:="Manchester United"
    8. '--- Mailand hat 3 Punkte gewonnen ---
    9. Punkte = Liga.Item("Inter Mailand")
    10. Punkte = Punkte + 3
    11. Liga.Item("Inter Mailand") = Punkte
    12. '--- Ausgabe neuer Punktestand ---
    13. Debug.Print Liga.Item("Inter Mailand")
    14. End Sub
    Ich wäre da mal der Ansicht, dass eine Collection nur Objekte aufnehmen kann, wobei die Objekten nicht vom gleichen Typ sein müssen.


    Beispiel:


    Modul1:

    Quellcode

    1. Public Sub Viecher()
    2. Dim Tiere As New Collection
    3. Dim einHund As New Hund
    4. Dim eineKatze As New Katze
    5. einHund.Name = "Bello"
    6. eineKatze.Name = "Mietze"
    7. Tiere.Add Item:=einHund, Key:=einHund.Name
    8. Tiere.Add Item:=eineKatze, Key:=eineKatze.Name
    9. Debug.Print Tiere("Bello").SayHello
    10. Debug.Print Tiere("Mietze").SayHello
    11. End Sub


    KlassenModul "Hund":

    Quellcode

    1. Private strName As String
    2. Public Property Let Name(Name As String)
    3. strName = Name
    4. End Property
    5. Public Property Get Name() As String
    6. Name = strName
    7. End Property
    8. Public Function SayHello() As String
    9. SayHello = "Wuff."
    10. End Function


    KlassenModul "Katze":

    Quellcode

    1. Private strName As String
    2. Public Property Let Name(Name As String)
    3. strName = Name
    4. End Property
    5. Public Property Get Name() As String
    6. Name = strName
    7. End Property
    8. Public Function SayHello() As String
    9. SayHello = "Miau."
    10. End Function




    Somit würde ich dir empfehlen, eine Klasse "FussballClub" zu implementieren, z.B. mit den Properties "Punkte" und "Name". Dann kannst Du beim einfügen in die Collection jeweils den FussballClub.Name als Key verwenden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „harryhirsch“ ()

    So jetzt bin ich endlich dazu gekommen weiter zu programmieren.
    Und tatsächlich, wenn man Objekte von Klassen verwendet, dann geht es.
    Wenn man es genau bedenkt hätte ich sogar selber drauf kommen können, aber danke für den Hinweis.