Variable erstellen, die immer den aktuellen Inhalt einer Datei enthält

    • VBA: Sonstige

      Variable erstellen, die immer den aktuellen Inhalt einer Datei enthält

      Ich arbeite privat mit kleinen selbstgestrickten "Datenbanken". Ich speichere meine Daten in Textdateien. In einem meiner VB-Projekte rufe ich immer wieder Daten aus verschiedenen Dateien ab und ändere Daten. Das klappt auch recht gut, nur war das etwas umständlich. Nun habe ich eine Möglichkeit gefunden, wie man eine Variable erzeugen kann (genauer gesagt eine Property), die immer den aktuellen (Text-)Inhalt einer Datei enthält, jedoch nur dann die Datei neu lädt, wenn sie geändert wurde.

      Hierzu benutze ich zunächst folgendes Grundgerüst:

      Visual Basic-Quellcode

      1. Type Dateiinfo
      2. Pfad As String
      3. Inhalt As String
      4. Datum As Date
      5. End Type
      6. Property Get Dateitext(DatVar As Dateiinfo) As String
      7. Dim FSO As Object, Datei As Object
      8. Set FSO = CreateObject("Scripting.FileSystemObject")
      9. If FSO.FileExists(DatVar.Pfad) Then
      10. If FileDateTime(DatVar.Pfad) <> DatVar.Datum Then
      11. DatVar.Datum = FileDateTime(DatVar.Pfad)
      12. Set Datei = FSO.OpenTextFile(DatVar.Pfad, 1, False)
      13. DatVar.Inhalt = ""
      14. While Not Datei.AtEndOfStream
      15. DatVar.Inhalt = DatVar.Inhalt & Datei.Read(1024)
      16. Wend
      17. Datei.Close
      18. End If
      19. Else
      20. DatVar.Inhalt = ""
      21. DatVar.Datum = 0
      22. End If
      23. Dateitext = DatVar.Inhalt
      24. End Property
      25. Property Let Dateitext(DatVar As Dateiinfo, Text As String)
      26. Dim FSO As Object, Datei As Object
      27. If DatVar.Inhalt <> Text Then
      28. Set FSO = CreateObject("Scripting.FileSystemObject")
      29. If FSO.FileExists(DatVar.Pfad) Then Kill DatVar.Pfad
      30. If Text <> "" Then
      31. Set Datei = FSO.OpenTextFile(DatVar.Pfad, 8, True)
      32. Datei.Write Text
      33. DatVar.Inhalt = Text
      34. DatVar.Datum = FileDateTime(DatVar.Pfad)
      35. End If
      36. End If
      37. End Property


      Ich habe es bei mir so eingestellt, dass ein Nullstring ("") zurückgegeben wird, wenn die Datei nicht existiert (Zeile 21), und die Datei gelöscht wird, wenn man der Variablen einen Nullstring zuweist (Zeilen 31/32).


      Nun ein Beispiel, bei dem die Variable "DatVar1" die Datei "C:\Test1.txt" darstellen soll, und "DatVar2" die Datei "C:\Test2.txt".
      Hierzu brauche ich für beide Variablen je eine Hilfsvariable, die ich außerhalb der Prozeduren deklariere:

      Visual Basic-Quellcode

      1. Dim HilfsDatVar1 As Dateiinfo
      2. Dim HilfsDatVar2 As Dateiinfo


      Nun lege ich noch fest, welche Variable welcher Datei zugeordnet wird, und definiere, dass beim Abrufen der Variablen der Dateitext abgerufen wird und beim Zuweisen der Dateitext zugewiesen wird, sprich: der Text in die Datei geschrieben wird, die zuvor gelöscht wird:

      Visual Basic-Quellcode

      1. Property Get DatVar1() As String
      2. If HilfsDatVar1.Pfad = Empty Then HilfsDatVar1.Pfad = "C:\Test1.txt"
      3. DatVar1 = Dateitext(HilfsDatVar1)
      4. End Property
      5. Property Let DatVar1(Text As String)
      6. If HilfsDatVar1.Pfad = Empty Then HilfsDatVar1.Pfad = "C:\Test1.txt"
      7. Dateitext(HilfsDatVar1) = Text
      8. End Property
      9. Property Get DatVar2() As String
      10. If HilfsDatVar2.Pfad = Empty Then HilfsDatVar2.Pfad = "C:\Test2.txt"
      11. DatVar2 = Dateitext(HilfsDatVar2)
      12. End Property
      13. Property Let DatVar2(Text As String)
      14. If HilfsDatVar2.Pfad = Empty Then HilfsDatVar2.Pfad = "C:\Test2.txt"
      15. Dateitext(HilfsDatVar2) = Text
      16. End Property


      Dieses Beispiel soll die Funktionalität verdeutlichen:

      Visual Basic-Quellcode

      1. Sub Beispiel()
      2. MsgBox DatVar1
      3. 'Gibt bei mir "Test" aus, da die Datei bei mir bereits existiert und "Test" drinsteht.
      4. DatVar1 = "Test1" 'Schreibt "Test1" in die Datei "C:\Test1.txt".
      5. MsgBox DatVar1 'Gibt "Test1" aus.
      6. Kill "C:\Test1.txt"
      7. MsgBox DatVar1 'Gibt "" aus, da "C:\Test1.txt" nicht mehr existiert.
      8. DatVar1 = "Test1" 'Schreibt "Test1" in die Datei "C:\Test1.txt".
      9. DatVar2 = "Test2" 'Schreibt "Test2" in die Datei "C:\Test2.txt".
      10. MsgBox DatVar2 'Gibt "Test2" aus.
      11. DatVar2 = "" 'Löscht "C:\Test2.txt"
      12. MsgBox DatVar2 'Gibt "" aus, da "C:\Test2.txt" nicht mehr existiert.
      13. FileCopy "C:\Test1.txt", "C:\Test2.txt"
      14. MsgBox DatVar1 'Gibt "Test1" aus.
      15. MsgBox DatVar2 'Gibt "Test1" aus, da "C:\Test1.txt" kopiert wurde.
      16. End Sub


      EDIT: (01.10.2008)

      Ich habe das Grundgerüst leicht geändert, da ich mit "ReadAll" (war in Zeile 14) merkwürdige Ergebnisse beim Auslesen der Dateien hatte. Jetzt klappts bei mir.

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „roddy“ ()