Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 2dimensionales Array speichern & wieder aufrufen

2dimensionales Array speichern & wieder aufrufen
18.09.2008 11:30:00
Nobi
Hallo zusammen,
ich versuche ein zweidimensionales Array (testweise 100 X 2) im Binärmodus zu speichern und wieder aufzurufen. Das Speichern klappt ohne Fehlermeldung, per debug.print habe ich auch getestet, ob die Dimensionen 100 und 2 richtig gespeichert sind (klappt auch).
Beim Aufrufen dagegen wird scheint es auf einmal ein 100 X 537133058 Array zu sein. Wie kann das sein? Weiß jemand, was da passiert ist bzw. wie ich das Programm generell dazu bringen kann, meine Matrix richtig abzuspeichern und wieder abzurufen?
Ich bin für jeden Hinweis sehr dankbar!
Viele Grüße
Nobi
Sub aufruf_SaveArray()
'Programmaufruf: ruft Sub SaveArray auf und übergibt Dateipfad und zu speicherndes Array
createMatrix
SaveArray "c:\saved arrays\Matrix.dat", Matrix
End Sub



Public Sub SaveArray(ByVal sFile As String, vArray As Variant)
' Array in Datei speichern
Dim F As Integer
Dim rowCount As Long
Dim columnCount As Integer
' Falls Datei vorhanden, Abfrage ob sie überschrieben werden soll
' ja: überschreiben, nein oder abbrechen: Programm wird abgebrochen und Array wird nicht  _
gespeichert.
If Dir$(sFile)  "" Then
Dim ja_nein
ja_nein = MsgBox("Eine Datei mit diesem Namen existiert bereits." & _
Chr(13) & Chr(13) & "Überschreiben?", 35)
Select Case ja_nein
Case vbYes
MsgBox "Datei wird überschrieben"
Case vbNo
Exit Sub
Case Else
Exit Sub
End Select
End If
' Datei im Binary-Mode öffnen
F = FreeFile
Open sFile For Binary As #F
' Anzahl Zeilen speichern
rowCount = UBound(vArray, 1)
Put #F, , rowCount
' Anzahl Teilunternehmen speichern
columnCount = UBound(vArray, 2)
Put #F, , columnCount
' Array-Elemente speichern
Put #F, , vArray
Close #F
MsgBox "Datei wurde gespeichert unter " & Chr(13) & sFile
End Sub


Sub aufruf_ReadArray()
'Programmaufruf: ruft Sub ReadArray auf und übergibt Pfad der auszulesenden Datei
Dim MyArray() As Variant
MyArray = ReadArray("c:\saved arrays\Matrix.dat")
End Sub



Public Function ReadArray(ByVal sFile As String) As Variant
' Array aus Datei einlesen
Dim F As Integer
Dim rowCount As Long
Dim columnCount As Long
Dim vArray As Variant
' Datei im BinaryMode öffnen
If Len(Dir$(sFile)) > 0 Then
F = FreeFile
Open sFile For Binary As #F
' Anzahl Zeilen lesen
Get #F, , rowCount
' Anzahl Spalten lesen
Get #F, , columnCount
' Array dimensionieren und einlesen
ReDim vArray(1 To rowCount, 1 To columnCount)
'!!! FEHLER: an dieser Stelle stoppt das Programm mit der Fehlermeldung, dass nicht genug
'Speicher vorhanden ist. Ich habe rowCount und columnCount mit debug.print getestet - rowCount
' ist 100, columnCount wird jedoch als 537133058 ausgelesen, obwohl als 2 gespeichert...
'(in Sub savearray hatte ich es genauso mit debug.print getestet, da war es korrekt 2)
Get #F, , vArray
Close #F
End If
ReadArray = vArray
MsgBox "function readarray ist durchgelaufen"
End Function


Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2dimensionales Array speichern & wieder aufruf
18.09.2008 11:56:46
Dieter
Hallo Nobi,
ich denke, daß es an den verschiedenen Variablentypen liegt. Die Zahl 537133058 entspricht binär
0010 0000 0000 0100 0000 0000 0000 0010.
Der Variablentyp Long sind 4 Byte. Außerdem schreibst Du den ColumnCount mit Integer, also 2 Byte.
Geschrieben werden also 0010 0000 0000 0000, aber gelesen wird o.g. Binärzahl.
Gelesen wird nach Low/High-Halbbyte, wenn ich mich richtig erinnere.
Demnach ist zwar 537133058 korrekt, weil ja 4 Byte gelesen werden, aber nicht richtig für Deine Anwendung.
Gruß
Dieter
Anzeige
AW: 2dimensionales Array speichern & wieder aufruf
18.09.2008 14:13:00
Nobi
Hallo Dieter,
vielen Dank für Deine schnelle Antwort! Ich habe in SaveArray die Variable ColumnCount jetzt auch als Long definiert, anstatt Integer, und jetzt wird das Array richtig abgespeichert. Super :-)
Jetzt habe ich allerdings das nächste Problem:
Die Function ReadArray funktioniert, ich komme bis MsgBox "function readarray ist durchgelaufen", aber bei der Übergabe vom Funktionswert ReadArray an die Prozedur Sub aufruf_ReadArray() an der Stelle
MyArray = ReadArray("c:\saved arrays\Matrix.dat")
erscheint jetzt eine Fehlermeldung: "Laufzeitfehler '13': Typen unverträglich"
ReDim MyArray(1 to 100, 1 to 2) vor Aufruf der Funktion habe ich schon versucht. Kannst Du mir da vielleicht auch helfen?
Vielen Dank für alle Hinweise vorab!
VG Nobi
Anzeige
AW: 2dimensionales Array speichern & wieder aufruf
18.09.2008 14:24:00
Dieter
Hallo Nobi,
wissen tue ich keine Lösung. Aber könnte es sein (würde ich zumindest probieren), daß die Pfad-Angabe statt mit einem mit zwei Backslashes geschrieben werden muß?
Ich lasse die Frage deswegen offen.
Gruß
Dieter
AW: 2dimensionales Array speichern & wieder aufruf
18.09.2008 14:36:00
Nobi
Hallo Dieter,
es lag wohl an den Klammern in Dim MyArray() As Variant, ohne Klammern geht es jetzt.
Vielen Dank für Deine Hilfe und viele Grüße!
Anzeige
AW: 2dimensionales Array speichern & wieder aufruf
18.09.2008 14:25:10
Nobi
Die zweite Frage hat sich schon erledigt... Es lag wohl an den Klammern in Dim MyArray() As Variant, ohne Klammern geht es jetzt. :-)
Vielen Dank nochmal für die Hilfe!
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

2-dimensionales Array speichern und aufrufen in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Array erstellen: Definiere zunächst ein zweidimensionales Array, das Du speichern möchtest. In diesem Beispiel verwenden wir ein Array mit 100 Zeilen und 2 Spalten.

    Dim Matrix(1 To 100, 1 To 2) As Variant
    ' Fülle das Array mit Testdaten
    For i = 1 To 100
        Matrix(i, 1) = i
        Matrix(i, 2) = "Test" & i
    Next i
  2. Array speichern: Verwende die Funktion SaveArray, um das Array im Binärmodus zu speichern. Stelle sicher, dass Du den Dateipfad korrekt angibst.

    SaveArray "c:\saved arrays\Matrix.dat", Matrix

    Hier wird das Array in einer Datei gespeichert. Achte darauf, dass die Datei nicht bereits existiert, oder stelle sicher, dass Du bereit bist, sie zu überschreiben.

  3. Array einlesen: Nutze die Funktion ReadArray, um das gespeicherte Array wieder in Dein Programm zu laden.

    Dim MyArray() As Variant
    MyArray = ReadArray("c:\saved arrays\Matrix.dat")
  4. Array verwenden: Jetzt kannst Du mit dem geladenen Array weiterarbeiten. Zum Beispiel:

    MsgBox MyArray(1, 1) ' Gibt den ersten Wert des Arrays aus

Häufige Fehler und Lösungen

  • Typen unverträglich (Laufzeitfehler '13'): Dieser Fehler tritt häufig auf, wenn Du versuchst, ein Array, das durch ReadArray zurückgegeben wird, in eine nicht passende Variable zuzuweisen. Achte darauf, dass Du die Klammern korrekt verwendest. Die Zeile sollte so aussehen:

    Dim MyArray() As Variant
    MyArray = ReadArray("c:\saved arrays\Matrix.dat")
  • Falsche Dimensionen beim Einlesen: Wenn Du beim Einlesen des Arrays falsche Dimensionen erhältst (z.B. columnCount wird als 537133058 angezeigt), stelle sicher, dass Du die Variablen rowCount und columnCount als Long und nicht als Integer definierst.

    Dim rowCount As Long
    Dim columnCount As Long

Alternative Methoden

Eine alternative Methode zum Speichern von Arrays besteht darin, sie als CSV-Datei zu speichern. Dies hat den Vorteil, dass die Daten in einem Textformat vorliegen und einfacher zu bearbeiten oder zu importieren sind.

Sub SaveArrayAsCSV(sFile As String, vArray As Variant)
    Dim F As Integer
    Dim i As Long, j As Long
    F = FreeFile
    Open sFile For Output As #F
    For i = LBound(vArray, 1) To UBound(vArray, 1)
        For j = LBound(vArray, 2) To UBound(vArray, 2)
            Print #F, vArray(i, j);
            If j < UBound(vArray, 2) Then Print #F, ",";
        Next j
        Print #F, ""
    Next i
    Close #F
End Sub

Praktische Beispiele

Hier ist ein Beispiel, wie Du das Speichern und Einlesen eines zweidimensionalen Arrays in Dein VBA-Projekt integrieren kannst:

Sub TestArray()
    Dim Matrix(1 To 100, 1 To 2) As Variant
    Dim MyArray() As Variant
    Dim i As Long

    ' Fülle das Array
    For i = 1 To 100
        Matrix(i, 1) = i
        Matrix(i, 2) = "Test" & i
    Next i

    ' Speichere das Array
    SaveArray "c:\saved arrays\Matrix.dat", Matrix

    ' Lese das Array ein
    MyArray = ReadArray("c:\saved arrays\Matrix.dat")

    ' Zeige den ersten Wert an
    MsgBox MyArray(1, 1) ' Gibt 1 aus
End Sub

Tipps für Profis

  • Debugging: Verwende Debug.Print, um die Werte von rowCount und columnCount während des Lesevorgangs zu überprüfen. Dies hilft, Probleme frühzeitig zu erkennen.

  • Fehlerbehandlung: Füge Fehlerbehandlungsroutinen hinzu, um sicherzustellen, dass Dein Programm auch bei unerwarteten Eingaben robust bleibt.

On Error GoTo ErrorHandler
' Dein Code hier
Exit Sub

ErrorHandler:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description

FAQ: Häufige Fragen

1. Warum kann ich das Array nicht einlesen? Stelle sicher, dass der Dateipfad korrekt ist und dass die Datei existiert. Überprüfe auch, ob der Dateityp mit dem in der Funktion ReadArray verwendeten Format übereinstimmt.

2. Wie kann ich die Größe des Arrays dynamisch anpassen? Verwende die Funktion ReDim innerhalb der ReadArray-Funktion, um die Dimensionen des Arrays basierend auf den gespeicherten Werten anzupassen.

3. Was mache ich, wenn ich einen Laufzeitfehler erhalte? Überprüfe den Code sorgfältig auf Typeninkompatibilitäten und stelle sicher, dass alle Variablen korrekt definiert sind. Verwende Debug.Print, um den aktuellen Status des Codes zu verfolgen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige