Mehrdimensionales Array speichern

  • Excel

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

    Mehrdimensionales Array speichern

    Hallo zusammen,
    ich sitze schon seit längeren an einen Problem und habe schon einiges im Internet und auch hier gesucht und probiert. Ich habe in Excel eine Userform entwickelt.Daten, die in diese Userform eingetragen werden, werden in Arrays gespeichert. (Das Programm ist zur Ursachenanalyse von Fehlern gedacht und hat 10 Reiter mit Textboxen die wiederum 10 Reiter mit Textboxen beinhalten usw. 10x10x10x6) Der Aufbau der Userfrom ist trotzdem Simpel, da ich trotzdem nur 4 Textboxen erstellen musste, aber das weicht von meiner Frage ab.

    Um dise ganze Daten während der Laufzeit abzufragen, werden diese in Arrays gespeichert. Das Problem ist, dass wenn ich die Datei schliese, diese Daten logischerweise nicht mehr vorhanden sind. Wie ich die einzelnen Daten der Arrays in eine Textdatei schreibe und nach bedarf wieder einlese ist mir bekannt und das würde Theordisch auf Funktionieren, doch da macht mir die Zeit einen Strich durch die Rechnung. Aufgrund der großen Breite und Menge der Array, dauert das ein und Auslesen der Arrays ca. 5 Minuten und das ist absolut inakzeptabel, da dies beim wechseln zwischen einzelnen Projekten geschehen soll.

    Nun habe ich im Internet etwas gefunden

    http://www.vbarchiv.net/tipps/tipp_1093-array-schnell-speichern-und-wieder-laden.html

    jedoch funktioniert das für mein vorhaben nicht wirklich

    hier mal meine ganzen Arrays, die ich abspeichern nöchte. Eine Datei, je Array wäre Super. Zu beachten ist, das es auch sein kann, das bestimmte Daten "Leer" sein können und es sich hauptsächlich um Lange Texte mit Absätzen usw. handelt.

    Visual Basic-Quellcode

    1. Dim Ursache_0(9) As String
    2. Dim Ursache_1(9, 9) As String
    3. Dim Ursache_2(9, 9, 9) As String
    4. Dim Ursache_3(9, 9, 9, 5) As String
    5. Dim Abstell_Verantw(9, 9, 9, 5) As String
    6. Dim Abstell_Termin(9, 9, 9, 5) As String
    7. Dim Wirksam_Verantw(9, 9, 9, 5) As String
    8. Dim Wirksam_Termin(9, 9, 9, 5)
    9. Dim Erledigt_0(9) As Boolean
    10. Dim Erledigt_1(9, 9) As Boolean
    11. Dim Erledigt_2(9, 9, 9) As Boolean
    12. Dim Erledigt_3(9, 9, 9, 5) As Boolean
    13. Dim Erledigt_3_1(9, 9, 9, 5) As Boolean
    14. Dim Verfolgen_0(9) As Boolean
    15. Dim Verfolgen_1(9, 9) As Boolean
    16. Dim Verfolgen_2(9, 9, 9) As Boolean
    17. Dim Nicht_Verfolgen_0(9) As Boolean
    18. Dim Nicht_Verfolgen_1(9, 9) As Boolean
    19. Dim Nicht_Verfolgen_2(9, 9, 9) As Boolean
    20. Dim Zurückstellen_0(9) As Boolean
    21. Dim Zurückstellen_1(9, 9) As Boolean
    22. Dim Zurückstellen_2(9, 9, 9) As Boolean


    Mein Versuch, die Datenfelder in Dateien auszulager sieht wie folgt aus. (Die Zahl die nach Datenfeld kommt, soll aussagen wie viele Felder das Array beinhaltet

    Beispiel für ein Array mit 2 Datenfeldern (Speichern)

    Visual Basic-Quellcode

    1. Function Datenfeld_2_Speichern(Pfad As String, Dateiname As String, Datenfeld, Anzahl_Feld1 As Integer, Anzahl_Feld2, Dateiendung As String)
    2. Dim i1 As Long
    3. Dim i2 As Long
    4. For i1 = 0 To Anzahl_Feld1
    5. For i2 = 0 To Anzahl_Feld2
    6. Filpat = Pfad & Dateiname & i1 & "_" & i2 & Dateiendung
    7. If Datenfeld(i1, i2) <> "" Then
    8. Open Filpat For Output As #1
    9. Print #1, Datenfeld(i1, i2)
    10. Close #1
    11. Else
    12. If Dir(Filpat) <> "" Then
    13. Kill (Filpat)
    14. End If
    15. End If
    16. Next i2
    17. Next i1
    18. End Function


    Beispiel für ein Array mit 4 Datenfeldern (Speichern)

    Visual Basic-Quellcode

    1. Function Datenfeld_4_Speichern(Pfad As String, Dateiname As String, Datenfeld, Anzahl_Feld1 As Integer, Anzahl_Feld2, Anzahl_Feld3, Anzahl_Feld4, Dateiendung As String)
    2. Dim i1 As Long
    3. Dim i2 As Long
    4. Dim i3 As Long
    5. Dim i4 As Long
    6. For i1 = 0 To Anzahl_Feld1
    7. For i2 = 0 To Anzahl_Feld2
    8. For i3 = 0 To Anzahl_Feld3
    9. For i4 = 0 To Anzahl_Feld4
    10. Filpat = Pfad & Dateiname & i1 & "_" & i2 & "_" & i3 & "_" & i4 & Dateiendung
    11. If Datenfeld(i1, i2, i3, i4) <> "" Then
    12. Open Filpat For Output As #1
    13. Print #1, Datenfeld(i1, i2, i3, i4)
    14. Close #1
    15. Else
    16. If Dir(Filpat) <> "" Then
    17. Kill (Filpat)
    18. End If
    19. End If
    20. Next i4
    21. Next i3
    22. Next i2
    23. Next i1
    24. End Function


    Und umgekehrt ein Array mit 4 Datenfeldern wieder einlesen

    Visual Basic-Quellcode

    1. Function Datenfeld_4_Laden(Pfad As String, Dateiname As String, Datenfeld, Anzahl_Feld1 As Integer, Anzahl_Feld2, Anzahl_Feld3, Anzahl_Feld4, Dateiendung As String)
    2. Dim i1 As Long
    3. Dim i2 As Long
    4. Dim i3 As Long
    5. Dim i4 As Long
    6. Dim Ausgabetext As String
    7. For i1 = 0 To Anzahl_Feld1
    8. For i2 = 0 To Anzahl_Feld2
    9. For i3 = 0 To Anzahl_Feld3
    10. For i4 = 0 To Anzahl_Feld4
    11. Filpat = Pfad & Dateiname & i1 & "_" & i2 & "_" & i3 & "_" & i4 & Dateiendung
    12. If Dir(Filpat) <> "" Then
    13. Open Filpat For Input As #1
    14. Datenfeld(i1, i2, i3, i4) = ""
    15. Do While Not EOF(1)
    16. Input #1, Ausgabetext
    17. Datenfeld(i1, i2, i3, i4) = Datenfeld(i1, i2, i3, i4) & Ausgabetext & vbCr
    18. Loop
    19. Close #1
    20. End If
    21. Next i4
    22. Next i3
    23. Next i2
    24. Next i1
    25. End Function


    Wie gesagt, dass ganze funktioniert schon, allerdings viel zu langsam.

    Am besten wäre, wenn ich eine Function hätte, in der ich z.b. Ursache_3 übergebe und dieses wird komplett als Datei gespeichert und kann umgekehrt wieder genau so gefüllt werden. Kann mir jemand helfen?

    Danke im Vorraus
    So was wie XML-Serialisierung gibt's in Excel nicht.

    Was du machen kannst: Arrays in Excel-Worksheets zu speichern.
    Ranges kannst du nämlich relativ einfach in und von Arrays kopieren.

    Aber das funktioniert nur bis zweidimensional.
    Wenn du vierdimensionale Arrays hast, wird's eng.

    Ich bin mir allerdings nicht sicher, ob deine Methode
    10 Reiter mit Textboxen die wiederum 10 Reiter mit Textboxen beinhalten
    so elegant ist, wie du behauptest, möchte aber auch nicht weiter darüber nachdenken, wie das gemeint ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Auch wenn sichs nicht wirklich um meine Frage handelt.
    weils ein bischen schwer zu erklären ist, hier ein Ausschnitt aus der Userform (Man hat den eindruck, dass hinter jedem Reiter eine seperate Textbox steckt, so ist es aber nicht. In dieser Userform exestieren nur die 8 Sichtbaren Textboxen und auch nur die anderen Sichtbaren Steuerelemente. Gesteuert wird das ganze durch den Index der durch den ausgwählten reiter angewählt wird)
    Daher auch diese viele Mehrdimensionalen Arrays.
    Bilder
    • 24-01-2013 14-43-08.jpg

      125,38 kB, 728×753, 463 mal angesehen
    Also deim Ansatz nach zu urteilen, und aufgrund der Tatsache, dass iwelche Methoden Minuten brauchen, drängt sich mir der Eindruck auf, dass Excel mit deiner Anwendung überfordert ist.
    Eine sinnvollere Technologie, um drauf zu setzen wäre sicherlich ein ordentliches VB.Net-Proggi mit einem durchdachten Datenmodell, im Extremfall sogar eine Datenbank (so ab 30MB Daten).

    Ist jetzt nicht konkret gemeint, weil sowas aufzuziehen erfordert ein enormes Lernpensum, falls du in vb.net neu bist. Nurso für den Hinterkopf, denn iwann wird der Umstieg sowieso fällig.
    naja, vlt. auch nicht, aber sone Excel-Wurstelei als Dauerlösung...
    Hi ErfinderDesRades,

    Danke für die Antwort! Also eigentlich habe ich mit VB 2010 angefangen und bin ehr später auf das VBA umgestiegen, da ich es mehr auf der Arbeit anwende und dort nur VBA Verfügbar war.
    Das ganze auf VB umzustellen wäre daher nicht das große Problem und ich wäre auch nicht abgeneigt davon. Aber am Ende stehe ich im VB dann wieder vor der gleichen Frage, da ich "bisher" keine Kenntnisse
    habe, wie man Daten aus einem Programm richtig und Sinnvoll abspeichert.
    Daten laden, speichern, verarbeiten

    Aber Knackpunkt wird die Datenmodellierung werden. die relationale GrundIdee ist zwar exorbitant viel mächtiger als das Excel-Array-Gefuchtel - aber das muß erstmal in seiner ganzen Tiefe erfasst sein (nämlich, dass man damit alles modellieren kann, und zwar redundanzfrei).

    Annerer Knackpunkt ist Databinding - wenn man bisher immer Controls befüllt und ausgelesen hat, dann kann mans üblicherweise nicht auffassen, wie mächtig und einfach anzuwenden das Binding-Konzept ist.

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

    Am besten wäre, wenn ich eine Function hätte, in der ich z.b. Ursache_3 übergebe und dieses wird komplett als Datei gespeichert und kann umgekehrt wieder genau so gefüllt werden. Kann mir jemand helfen?


    Z. B. so:

    Visual Basic-Quellcode

    1. Sub arr_speichern()
    2. Dim arr(3, 3, 3) As String
    3. arr(1, 1, 1) = "a"
    4. arr(1, 2, 1) = "b"
    5. arr(1, 1, 2) = "c"
    6. Debug.Print "Array vor speichern"
    7. Debug.Print arr(1, 1, 1)
    8. Debug.Print arr(1, 2, 1)
    9. Debug.Print arr(2, 1, 1)
    10. Debug.Print arr(1, 1, 2)
    11. Open "arr.txt" For Binary As #1
    12. Put #1, , arr()
    13. Close
    14. End Sub
    15. Sub arr_lesen()
    16. Dim arr2(3, 3, 3) As String
    17. Open "arr.txt" For Binary As #1
    18. Get #1, , arr2()
    19. Close
    20. Debug.Print ""
    21. Debug.Print "Array nach lesen"
    22. Debug.Print arr2(1, 1, 1)
    23. Debug.Print arr2(1, 2, 1)
    24. Debug.Print arr2(2, 1, 1)
    25. Debug.Print arr2(1, 1, 2)
    26. End Sub


    Anwendungsbeispiel:
    (Für Boolean Arrays musste du eigene Subs erstellen).

    Visual Basic-Quellcode

    1. ...
    2. Dim Abstell_Termin(9, 9, 9, 5) As String
    3. ...
    4. 'array speichern
    5. Datenfeld_speichern Abstell_Termin(), "Abstell_Termin", "c:\test\", ".dat"
    6. ...
    7. 'und wieder laden
    8. Datenfeld_laden Abstell_Termin(), "Abstell_Termin", "c:\test\", ".dat"
    9. ...
    10. Sub Datenfeld_speichern(arr_name() As String, dateiname As String, pfad As String, dateiendung As String)
    11. Open pfad & dateiname & dateiendung For Binary As #1
    12. Put #1, , arr_name()
    13. Close
    14. End Sub
    15. Sub Datenfeld_laden(arr_name() As String, dateiname As String, pfad As String, dateiendung As String)
    16. Open pfad & dateiname & dateiendung For Binary As #1
    17. Get #1, , arr_name()
    18. Close
    19. End Sub

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

    Hi Eierlein,

    Danke! :)
    Es funktioniert einwandfrei und ist auch schnell, paar sekunden und es ist gespeichert. (Ich glaube ich habe einfach zu kompleziert gedacht)
    Hab das auch soweit getestet, allerdings machen mir jetzt erstmal die Boolean Arrays Probleme (Muss mir noch mal angucken wie ich das Löse)
    Da kommt der Fehler Typen Unverträglich, Warum er jetzt damit ein Problem hat weis ich nicht. Vielleicht kann ich die Boolean Arrays irgendwie in String ummodeln... :S
    Werde euch noch informieren sobald ichs hab. (Oder hast jemand von euch noch ne Idee)


    Gruß glanner
    Mach dir einfach zwei neue Methoden für Boolean Arrays

    Visual Basic-Quellcode

    1. Sub Datenfeld_speichern(arr_name() As Boolean, dateiname As String, pfad As String, dateiendung As String)
    2. Open pfad & dateiname & dateiendung For Binary As #1
    3. Put #1, , arr_name()
    4. Close
    5. End Sub
    6. Sub Datenfeld_laden(arr_name() As Boolean, dateiname As String, pfad As String, dateiendung As String)
    7. Open pfad & dateiname & dateiendung For Binary As #1
    8. Get #1, , arr_name()
    9. Close
    10. End Sub
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Zusätzliche Info

    Ich möchte noch etwas ergänzen (Der Vollständigkeit halber):

    Wenn man ein Array füllt, aber den ersten Eintrag Leer lässt und die oben genannte Methode anwendet, wird das ganze Array als "Leer" abgespeichert.
    Kommt dazwischen ein Leerer Eintrag, werden die darauffolgenden Daten trotzdem gespeichert.


    Warum das so ist, kann ich mir nicht erklären. Aber dieses Problem lässt sich lösen.
    Hi

    Naja also wenn das Array z.b. so gefüllt wurde:

    Dim arr_name(10,10) As String

    arr_name(0,0) = ""
    arr_name(1,0) = "Text1"
    arr_name(2,0) = "Text2"

    wendet man nun die o.g. Methode an und liest das Array wieder ein kommt das dabei raus:

    arr_name(0,0) = ""
    arr_name(1,0) = ""
    arr_name(2,0) = ""

    wird das ganze so gefüllt

    arr_name(0,0) = "Text1"
    arr_name(1,0) = ""
    arr_name(2,0) = "Text2"



    erhält man nach Anwendung wieder das richtige Ergebnis

    arr_name(0,0) = "Text1"
    arr_name(1,0) = ""
    arr_name(2,0) = "Text2"

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