Dateisystemobjekt in VBA
Wir werden File System Object
in VBA mit Beispielen vorstellen.
Dateisystemobjekt in VBA
Das FileSystemObject
(FSO) bietet eine Vielzahl von Operationen für den Zugriff auf das Dateisystem des eigenen Laptops. Dieses Objekt ermöglicht es uns, schnell auf Dateien, Verzeichnisse und Laufwerke zuzugreifen und diese zu lesen und zu schreiben.
Das BFS arbeitet nach weltweiten Standards und Systemeinstellungen. Wenn wir die Excel-Anwendung international teilen, kümmert sich das FSO um alle Unterschiede in den Einstellungen zwischen den Ländern, die der eigene Code möglicherweise nicht bewältigen kann.
Das FSO wird es uns ermöglichen, praktisch alles, was es im Windows-Datei-Explorer tun kann, in VBA-Code zu erreichen. Tatsächlich bietet es die volle Kontrolle über das Windows-Dateisystem.
FileSystemObject
Erstellung in VBA
Excel VBA enthält das FileSystemObject
nicht. Vielleicht könnten wir FSO in VBA verwenden, indem wir ein Objekt mit später Bindung erstellen.
Code:
# vba
Sub CreateFileSysObj()
Set MyFileSysObj = CreateFileSysObj("Scripting.FileSystemObject")
End Sub
Wir können auch einen Verweis auf die FSO-Bibliothek in VBA einfügen. Die frühe Bindung ist schneller als die späte Bindung, da das Objekt nicht generiert werden muss, wenn der Code ausgeführt wird.
Um einen Link hinzuzufügen, öffnen Sie den Visual Basic Editor (VBE) durch Drücken von Alt-F11 und wählen Sie dann im VBE-Menü 'Tools|References'
. Dies kann ein Popup-Fenster öffnen, in dem wir die entsprechende Referenz auswählen können.
Scrollen Sie nach unten, bis wir in der Spalte der zugänglichen Referenzen 'the Microsoft Scripting Runtime'
finden. Aktivieren Sie das Kontrollkästchen und klicken Sie auf OK, um die Bibliothek in die Anwendung aufzunehmen.
Die DLL-Bibliotheksdatei befindet sich auf C:Windows\SysWOW64\scrrun.dll
.
Wenn wir das Programm an andere Kollegen oder Orte senden, vergewissern Sie sich, dass sie diese Datei an der richtigen Stelle auf ihrem PC haben, sonst schlägt der Code fehl. Es wird empfohlen, den Befehl Dir
zu verwenden, um zu überprüfen, ob die Datei in einer Fehlerfalle beim Ereignis WorkbookOpen
vorhanden ist.
Wenn es fehlt, zeigen Sie eine Meldung an und beenden Sie die Excel-Datei. Nachdem wir die Referenz eingefügt haben, können wir das FSO mit dem folgenden Code generieren.
Code:
# vba
Sub TestFileSysObj()
Dim MyFileSysObj As New FileSystemObject
End Sub
Der folgende Code bestimmt, ob der Ordner mit dem Namen 'Test'
(an dem bestimmten Ort) existiert oder nicht. Wenn der Ordner vorhanden ist, ist die IF-Bedingung True
und das Meldungsfeld zeigt 'The Folder Exists.'
an. Wenn er nicht existiert, erscheint der Text 'The Folder Does Not Exist'
.
Code:
# vba
Sub FolderExistCheck()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.FolderExists("D:\Test") Then
MsgBox"This Folder Exists"
Else
MsgBox"This Folder Doest Not Exists"
End If
End Sub
Ausgang:
Ebenso können wir feststellen, ob eine Datei existiert oder nicht. Der folgende Code bestimmt, ob eine Datei mit dem Namen Test.xlsx
im bereitgestellten Ordner vorhanden ist oder nicht.
Code:
# VBA
Sub CheckFileExist()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.FileExists("D:\Test\Test.xlsx") Then
MsgBox "This File Exists In Folder"
Else
MsgBox "This File Does Not Exist In Folder"
End If
End Sub
Ausgang:
Der folgende Code erstellt einen Ordner namens 'Test'
auf der C-Disc unseres Systems (wir müssen den Pfad auf unserem Computer angeben, in dem wir den Ordner erstellen möchten).
Code:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
MyFileSysObj.CreateFolder("D:\Test")
End Sub
Ausgang:
Obwohl dieser Code gut funktioniert, löst er eine Ausnahme aus, wenn der Ordner bereits vorhanden ist. Der folgende Code überprüft, ob der Ordner bereits vorhanden ist, und erstellt ihn falls nicht.
Es zeigt eine Benachrichtigung an, wenn der Ordner bereits vorhanden ist. Wir haben die Folder Exists-Methode des FSO verwendet, um festzustellen, ob der Ordner existiert.
Code:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.CreateFolder("D:\Test") Then
MsgBox "This Folder Exists Already"
Else
MyFileSysObj.CreateNewFolder("D:\Test")
End If
End Sub
Ausgang:
Der folgende Code kopiert alle Dateien aus dem Stammordner in den angegebenen Ordner.
Code:
# vba
Sub FetchFileName()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Set SysFolder = MyFileSysObj.GetFolder("D:\Test")
For Each FileInFolder In SysFolder.Files
Debug.Print FileInFolder.Name
Next FileInFolder
End Sub
Ausgang:
Dieses Beispiel ist komplexer als die zuvor besprochenen. Wenn wir uns auf die Microsoft Scripting Runtime Library
beziehen, können wir FileSystemObject
und alle anderen Datei- und Ordnerobjekte verwenden.
Wie im obigen Beispiel erwähnt, haben wir drei Objekte verwendet – FileSystemObject
, File und Folder
. Dadurch können wir jede Datei im erforderlichen Ordner durchgehen, und wir verwenden die Name-Eigenschaft, um die Liste aller Dateinamen zu erhalten.
Beachten Sie, dass wir Debug.Print
verwenden, um die Namen aller Dateien zu erhalten. Gehen wir zu einem anderen Beispiel, in dem wir die Namen aller Unterordner im erforderlichen Ordner angeben.
Die Idee ist die gleiche wie in den obigen Beispielen diskutiert. Anstelle von Dateien verwenden wir in diesen Beispielen die Unterordner.
Code:
# vba
Sub FetchSubFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Dim SysSubFolder
Set SysFolder = MyFileSysObj.GetFolder("D:\Test")
For Each SysSubFolder In SysFolder.SubFolders
Debug.Print SysSubFolder.Name
Next SysSubFolder
End Sub
Ausgang:
Lassen Sie uns ein weiteres Beispiel besprechen, in dem wir Dateien überschreiben, wie unten gezeigt.
Code:
# vba
Sub CopyFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder
SrcFolder = "D:\Test\Src"
FinalFolder = "D:\Test\Dst"
Set SysFolder = MyFileSysObj.GetFolder(SrcFolder)
For Each SysFile In SysFolder.Files
MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
Next SysFile
End Sub
Ausgang:
Src-Ordner
:
Dst-Ordner
:
Beachten Sie, dass wir die Eigenschaft Overwritefiles
in der Funktion MyFileSysObj.CopyFile
auf False
setzen (dies ist standardmäßig wahr). Dadurch wird sichergestellt, dass die Datei nicht dupliziert wird, wenn sie bereits im Ordner vorhanden ist (und wir werden einen Fehler beobachten).
Wenn wir dies auf True setzen oder Overwritefiles
löschen, werden möglicherweise alle Dateien im letzten Ordner mit dem genauen Namen überschrieben. Beim Übertragen von Dateien besteht immer die Gefahr, dass diese überschrieben werden.
In diesem Szenario empfiehlt es sich, den Zeitstempel neben dem Namen anzugeben. Dadurch ist sichergestellt, dass die Dateinamen immer eindeutig sind und wir nachvollziehen können, welche Dateien wann kopiert wurden.
Wenn wir nur Dateien mit einer bestimmten Erweiterung replizieren möchten, verwenden Sie eine IF and Then
-Anweisung, um zu testen, ob die Erweiterung von einer Microsoft-Tabellenkalkulations-Excel-Datei stammt oder nicht.
Code:
# vba
Sub CopyXlFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder
SrcFolder = "D:\Src"
FinalFolder = "D:\Dst"
Set SysFolder = MyFileSysObj.GetFolder(SRCFolder)
For Each SysFile In SysFolder.Files
If MyFileSysObj.GetExtensionName(SysFile) = "xlsx" Then
MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
End If
Next SysFile
End Sub