102 Aufrufe
Gefragt in Tabellenkalkulation von heiko1985 Einsteiger_in (93 Punkte)
Bearbeitet von heiko1985

Hallo zusammen

Über Excel/VBA lese ich Dateien aus einem Ordner aus und schreibe sie in einen Array, und zwar so:

(Der Code ist auf das Wesentliche gekürzt.)

Sub Read_Files()

Dim Files() As Object
Dim fobjFSO As Object
Dim ffsoFolder As Object
Dim ffsoFile As Object

Dim MyPath As String
MyPath = "C:\Test"

Set fobjFSO = CreateObject("Scripting.FileSystemObject")
Set ffsoFolder = fobjFSO.GetFolder(MyPath)

For Each ffsoFile In ffsoFolder.Files
    If Not ffsoFile Is Nothing Then
        If IsArray(Files) Then
            ReDim Preserve Files(UBound(Files) + 1)
        Else
            ReDim Files(0)
        End If
        Set Files(UBound(Files)) = ffsoFile
    End If
Next

Set fobjFSO = Nothing
Set ffsoFolder = Nothing

End Sub

Das funktioniert sehr gut. Die einzelnen Einträge im Array enthalten diverse Attribute der jeweiligen Dateien, zum Beispiel "Size" und "Path".

Auf diese Attribute kann ich so zugreifen:

Dim MySize as Long
MySize = Files(0).Size

Dim MyPath as String
MyPath = Files(0).Path

Soweit so gut.

Jetzt würde ich die Attribute der Dateien aber gerne im Array verändern.

Nur leider geht das hier nicht:

Files(0).Path = "MyText"

Und nun weiß ich leider nicht weiter.

Könnt ihr mir da helfen?

Vielen Dank und Gruß

Heiko1985

6 Antworten

0 Punkte
Beantwortet von m-o Profi (20.2k Punkte)
Hallo Heiko1985,

was willst du denn mit der Änderung im Array erreichen?

Gruß

M.O.
0 Punkte
Beantwortet von nighty Experte (6.3k Punkte)
Hallo Coomunity

z.b. txt Dateien!

Setzen von Dateiattributen!

vbNormal 0
vbReadOnly 1
vbHidden 2
vbSystem 4
vbArchive 32
vbAlias 64
Mehrfach Optionen Numeriche Werte addieren

Zur Zeit Numericher Wert=0

Sub Attribute_setzen()

 SetAttr Application.GetOpenFilename("Txt-Dateien (*.txt), *.txt", , "Datei auswählen", , False), 0
End Sub

Gruß Nighty
0 Punkte
Beantwortet von heiko1985 Einsteiger_in (93 Punkte)

Hallo Heiko1985,

was willst du denn mit der Änderung im Array erreichen?

Gruß

M.O.

Also, konkret möchte ich "ShortPath" von "C:\Test\*" in "C:\Test2\*" ändern.

Generell möchte ich aber einfach die Werte im Array nach Belieben anpassen können.

0 Punkte
Beantwortet von xlking Mitglied (105 Punkte)

Hi Heiko,

Die Attribute von Dateien sind eigentlich nur zum auslesen gedacht. Die Datei liegt fest an einem bestimmten Ort und hat eine bestimmte Größe. Wenn du das verändern willst, wie stellst du dir das dann vor? Das Pfad Attribut könnte man noch neu setzen, aber soll in dem Fall der bestehende Pfad umbenannt werden oder soll die Datei in einen anderen Pfad kopiert werden? Von der Anpassung des Size-Attributs rate ich ab.

Jedenfalls, wenn du derartige Sachen direkt über Attribute machen willst, solltest du dich unbedingt mit Klassenprogrammierung beschäftigen. Dazu musst du zunächst ein Klassenmodul erstellen. Dieses legst du dann in deinem Array oder deiner Collection ab. z.B. Set DeinArray(Pos) = New NameDesKlassenmoduls. Besser wäre: DeineCollection.Add New NameDesKlassenmoduls. Das machst du für jede der Dateien.

Anschließend kannst du mit Property Get und Property Let Eigenschaftsprozeduren hinzufügen, in denen du durch setzen oder Auslesen einer Eigenschaft kleine Codes ausführen kannst. In diesen Codes kannst du dann  je nach Wunsch z.B. die FolderRename oder die FileCopy Methode des Filesystem-Objekts ausführen (wenn es so eine gibt, hab grad nicht nachgeschaut). Vergiss aber nicht auch den Eigenschaftenwert selbst zu speichern, das machst du in einer eigenen Variable ganz oben im Klassenmodul.

Klingt kompliziert, ist es aber nicht, wenn man erstmal den Bogen raus hat. Lies dich einfach mal in die Thematik der Klassenprogrammierung ein oder schau entsprechende YouTube Videos. Hab leider grad keine Zeit dir ein entsprechendes kleines Beispiel für den Pfad zu geben. Vielleicht morgen, es sei denn jemand Anders ist schneller wink

Erstmal schönen Gruß

Mr. K.

0 Punkte
Beantwortet von xlking Mitglied (105 Punkte)

Hi Heiko,

so, hab nach dem Film doch noch ein bissl rumgespielt, hier das Ergebnis. Erstelle ein neues Klassenmodul und gib ihm z.B. den Namen FileObject. Der folgende Code gehört dann in das Klassenmodul.

Dim FullPath As String 'entspricht Pfad & "\" & Datei
Dim iName As String
Property Get Name() As String
  Name = iName
End Property
Property Let Name(n As String)
  Dim fs As Object, fld As Object, fl As Object
  
  If iName = "" Then
    iName = n
  Else
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set fl = fs.GetFile(FullPath)
    If n <> iName Then
      fl.Name = n
      iName = n
      FullPath = fl.Path
    End If
  End If
    
End Property

Property Get Path() As String
  Path = Left(FullPath, InStrRev(FullPath, "\") - 1)
End Property
Property Let Path(p As String)
  Dim fs As Object, fld As Object, fl As Object
  
  If FullPath <> "" Then
    If Right(p, 1) <> "\" Then p = p & "\"
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set fl = fs.GetFile(FullPath)
    If p <> FullPath Then
      If Not fs.folderexists(p) Then fs.createfolder p
      fl.Move p
      FullPath = fl.Path
    End If
  Else
    FullPath = p
  End If
  
End Property

In einem normalen Modul (z.B. Modul1) kannst du nun auf dieses Klassenmodul zugreifen mit folgendem Code:

Sub KlasseSetzen()

Dim myFiles As New Collection, fs As Object, fld As Object, fl As Object, SuchOrdner As String

SuchOrdner = "D:\Pfad\Tests\Mitarbeiterliste"
NeuerOrdner = "D:\Pfad\meineTests\Personaldaten"
NeuerName = "xyz.xlsx"

Set fs = CreateObject("Scripting.FileSystemObject")
Set fld = fs.GetFolder(SuchOrdner)

MsgBox fld.Files.Count & " Files im Ordner " & SuchOrdner

For Each fl In fld.Files
  myFiles.Add New FileObject, fl.Path
  myFiles(myFiles.Count).Name = fl.Name
  myFiles(myFiles.Count).Path = fl.Path
Next fl

MsgBox myFiles(1).Path
MsgBox myFiles(2).Name

myFiles(1).Path = NeuerOrdner
myFiles(2).Name = NeuerName

MsgBox myFiles(1).Path
MsgBox myFiles(2).Name

End Sub

Der Code legt für jede Datei im Suchordner ein neues Klassenmodul als FileObject an. Diesem kannst du beliebige Eigenschaften und Methoden zuweisen. Habe hier mal nur die Name und die Path-Eigenschaft angelegt. Wenn du bei einem dieser benutzerdefinierten FileObjekte die Path-Eigenschaft änderst wird die Datei in den neuen Pfad verschoben. Änderst du hingegen die Name-Eigenschaft, wird die Datei umbenannt. Probiers aus. 

Und wie gesagt, lies dich einfach mal in die Materie ein. Klassen sind zwar aufwendig zu erstellen, aber im Nachhinein benötigt man nicht mehr so viel Code im Hauptmodul. Das spart viel Tipparbeit und bewahrt die Übersicht.

Gruß Mr. K.

0 Punkte
Beantwortet von heiko1985 Einsteiger_in (93 Punkte)

Danke, Mr. K., für die Hilfe. Das wird mir an einer anderen Stelle sehr helfen.

Wenn du bei einem dieser benutzerdefinierten FileObjekte die Path-Eigenschaft änderst wird die Datei in den neuen Pfad verschoben. Änderst du hingegen die Name-Eigenschaft, wird die Datei umbenannt. Probiers aus. 

Ich befürchte, dass ich mich etwas missverständlich ausgedrückt habe.

Die Dateien stellen nur die Quelle für die Daten im Array dar, sollen also unverändert bleiben.

Ich möchte nur die Daten im Array verändern, um diese dann weiterzuverarbeiten. Und genau das gelingt mir nicht.

...