Het FileSystemObject (FSO) in Excel VBA gebruiken

Het FileSystemObject (FSO) geeft u toegang tot een hele reeks functies om toegang te krijgen tot het bestandssysteem van uw computer. Met behulp van dit object kunt u gemakkelijk toegang krijgen tot bestanden, mappen en stations, en ook lezen en schrijven naar bestanden.

Vele van de FSO-functies zouden door u in traditionele VBA kunnen worden geschreven, maar zouden meer codering vereisen en zouden voor een beginnende ontwikkelaar moeilijker te onderhouden en te begrijpen zijn. De FSO is een beproefde en geteste API (Application Programming Interface) en is betrouwbaarder dan uw eigen code. Het is gemakkelijk te gebruiken en klaar en beschikbaar.

De FSO werkt volgens internationale normen en instellingen die u op uw computer hebt. Als u uw Excel-toepassing wereldwijd distribueren dan is het gebruik van de FSO zorgt voor eventuele verschillen in instellingen tussen landen, die uw eigen code zou moeite hebben om te doen.

De FSO stelt u in staat om bijna alles te doen in VBA-code die je zou kunnen doen in Windows File Explorer. Het geeft je volledige toegang tot het Windows bestandssysteem.

Een FileSystemObject maken

Het FileSytemObject is geen onderdeel van Excel VBA. U kunt het FSO gebruiken door in VBA een object te maken (late binding):

Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub

Als alternatief kunt u in VBA een verwijzing naar de FSO-bibliotheek toevoegen. Dit wordt early binding genoemd en het is sneller dan late binding, omdat het object niet hoeft te worden gemaakt wanneer uw code wordt uitgevoerd.

Om een verwijzing toe te voegen, moet u op Alt-F11 drukken om de Visual Basic Editor (VBE) te openen, en vervolgens ‘Tools|References’ gebruiken uit het VBE-menu. Dit zal een pop-up venster tonen waarin u de relevante referentie kunt selecteren (zie hieronder).

Scroll omlaag in de lijst van beschikbare referenties totdat u ‘Microsoft Scripting Runtime’ ziet staan. Vink het vakje aan en klik op OK, en de bibliotheek maakt nu deel uit van uw toepassing.

De locatie van het DLL-bibliotheekbestand is C:Windows\SysWOW64\scrrun.dll

Als u uw applicatie distribueert naar andere collega’s of locaties, is het essentieel dat zij dit bestand op de juiste locatie op hun computer hebben, anders zal uw code een fout geven.

Het is de moeite waard om een error trap te plaatsen op de ‘WorkbookOpen’ gebeurtenis met behulp van het Dir commando om te controleren of het bestand bestaat. Als het niet bestaat, geef dan een waarschuwing en sluit het Excel-bestand.

Als de verwijzing is toegevoegd, kunt u de volgende code gebruiken om de FSO te maken:

Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub

Alle voorbeelden in dit artikel maken gebruik van deze methode om de FSO te maken.

De FSO heeft veel methoden en eigenschappen beschikbaar. Deze zijn hier onderverdeeld in secties op basis van wat ze kunnen doen.

De ‘Exists’-methoden gebruiken

U kunt een FSO-methode gebruiken om te controleren of een station, een map of een bestand bestaat. Deze methoden zijn eenvoudig te gebruiken en vereisen slechts één parameter.

Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub

Deze verklaringen zullen allemaal ‘True’ teruggeven in de veronderstelling dat uw computer een C: station heeft, een map daarin genaamd ‘Temp’ en een bestand in de Temp map genaamd ’testfile.txt’

De tekst strings in de parameters zijn niet hoofdlettergevoelig. U kunt in geen van deze methoden jokertekens gebruiken.

U kunt ook geen URL’s (Uniform Resource Locators) gebruiken om een map of bestandslocatie te beschrijven. De FSO werkt puur op het Windows besturingssysteem en het bestandssysteem daarop. Voor een externe server lokatie, moet je eerst een drive toewijzen, en dan het drive pad zelf gebruiken.

Gebruik de ‘Get’ Methoden

De FSO heeft talrijke methoden om informatie over het bestand en het pad te krijgen, hetzij het splitsen van het pad en het bestand, of het verkrijgen van bestand of map informatie zoals datum gemaakt of datum gewijzigd.

GetAbsolutePathname

Dit geeft een compleet pad vanaf de root van het opgegeven station.

Syntax is:

GetAbsolutePathName (pathspec)

Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub

Dit geeft een string ‘C:\Users\Richard\Documents’. Dit komt omdat het pad is opgegeven als C: gevolgd door drie punten. Elke punt betekent een volgend niveau binnen de mappenstructuur.

GetBaseName

Dit geeft de naam van een opgegeven bestand of map.

Syntax is:

GetBaseName (pad)

Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub

Deze code zal ’testfile’ teruggeven. De methode retourneert het laatste gedeelte in de padnaam. Als het een bestand is, wordt het achtervoegsel niet teruggegeven.

Als het pad niet kan worden gevonden, wordt een lege tekenreeks teruggegeven.

GetDrive

Hiermee kunt u code gebruiken om schijfinformatie op te vragen, gebaseerd op de opgegeven schijfletter.

Syntaxis is:

GetDrive (drivespec)

Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub

Deze methode retourneert een drive-object op basis van de opgegeven drive. U kunt dit object gebruiken om informatie over de schijf te verkrijgen, zoals de beschikbare vrije ruimte.

GetDriveName

Deze methode scheidt de naam van de schijf uit een pad-/bestandsnaamstring.

Syntaxis is:

GetDriveName (pad)

Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub

Hiermee krijgt u ‘C:’

GetExtensionName

Hiermee krijgt u het achtervoegsel van het bestand in het opgegeven pad.

Syntaxis is:

GetExtensionName (pad)

Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub

Dit levert ’txt’ op.

Als geen bestand is opgegeven, wordt een lege tekenreeks teruggezonden.

GetFile

Deze methode retourneert een bestandsobject, dat diverse informatie over het bestand zelf bevat.

Syntaxis is:

GetFile (filespec)

Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Set Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedEnd Sub

Dit retourneert de datum en tijd waarop het gespecificeerde bestand is aangemaakt. Als er geen bestand is gespecificeerd of als het bestand niet bestaat, krijgt u een ‘file not found’ foutmelding.

Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub

Dit geeft ’testfile.txt’.

GetFolder

Dit maakt een folder object voor de basis folder in het gespecificeerde pad. Het pad mag alleen mapnamen bevatten. Er mogen geen bestandsnamen in staan, anders treedt er een fout op.

Syntax is:

GetFolder (folderspec)

Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub

Het mapobject bevat verschillende gegevens die kunnen worden opgeroepen. In dit geval wordt de datum geretourneerd waarop de map is gemaakt.

U kunt deze methode ook gebruiken om alle bestandsnamen in een bepaalde map op te halen:

Sub FileNames()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)For Each Fn In Fo.Files MsgBox Fn.NameNext FnEnd Sub

Deze code loopt door de map ‘Temp’ en geeft elke gevonden bestandsnaam weer.

GetParentFolderName

Deze methode retourneert de mapnaam in het volgende niveau in de mappenhiërarchie.

Syntaxis is:

GetParentFolderName (pad)

Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub

Hiermee krijgt u ‘Users’ terug, omdat dit de ‘ouder’ is voor de map ‘richard’.

Gebruik van de methoden ‘Maken’

Met de FSO kunt u een nieuwe map en een nieuw pad maken en een tekstbestand aanmaken.

Map

U kunt een nieuwe mappadnaam opgeven die moet worden gemaakt. Een gevaar hiervan is dat als de map al bestaat, er een fout optreedt. U kunt de methode ‘FolderExists’ gebruiken om ervoor te zorgen dat dit niet gebeurt.

Syntax is:

CreateFolder (foldername)

Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub

Deze code maakt een nieuwe map genaamd ‘MyFolder’ onder het bestaande pad ‘C:\temp’.

CreateTextFile

Met deze methode kunt u een eenvoudig tekstbestand maken en er direct in schrijven.

Syntaxis is:

CreateTextFile (bestandsnaam, ])

Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub

Deze code maakt een tekstbestand met de naam ‘Myfile.txt’ in de ‘Temp’ map van de ‘C:’ schijf en schrijft er vervolgens twee regels tekst naar toe.

Noteer dat een line feed karakter wordt samengevoegd in de string die wordt geschreven.

Als het pad waarnaar je schrijft niet bestaat, zal er een fout optreden. U kunt de methode ‘FolderExists’ gebruiken om dit te controleren voordat u het bestand maakt.

Er is een optionele parameter om het bestaande bestand te overschrijven indien nodig – dit kan True of False zijn. De standaardwaarde is True.

De methoden ‘Kopiëren’ gebruiken

U kunt deze methoden gebruiken om een bestand of een map naar een andere locatie te kopiëren.

KopieerBestand

Deze methode kopieert een bestand van de ene maplocatie naar de andere. Merk op dat het kopiëren mislukt als op de bestemmingslocatie het kenmerk alleen-lezen is ingesteld.

Syntaxis is:

CopyFile bron, bestemming,

Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub

Deze code maakt een kopie van alle tekst (txt) bestanden op ‘C:\temp’ naar ‘C:\tempmyfolder’, waarbij het bestand waar nodig wordt overschreven. De standaardinstelling voor Overschrijven is Waar.

U kunt een asterisk (*) als jokerteken gebruiken voor de bestandsnamen, maar u kunt geen vraagteken (?) als jokerteken gebruiken voor afzonderlijke tekens.

CopyFolder

U kunt deze methode gebruiken om een hele map van de ene locatie naar de andere te kopiëren.

Syntax is:

CopyFolder source, destination,

Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub

Deze code kopieert alle mappen en bestanden onder ‘C:temp’ naar ‘C:gebruikers’. De nieuwe map die wordt gemaakt is ‘C:\users\richard’-myfolder’, omdat ‘C:\temp’ een map had met de naam ‘myfolder’.

Er zijn vier mogelijke uitkomsten als u deze methode gebruikt:

  • Als de bestemming niet bestaat, wordt de bronmap en de inhoud gekopieerd.
  • Als de bestemming al bestaat, treedt er een fout op.
  • Als de bestemming een map is, dan wordt de bronmap en de inhoud gekopieerd. Er treedt een fout op als Overschrijven is ingesteld op Onwaar en er is al een kopie van een bestand in de bestemming.
  • Als de bestemming is ingesteld op alleen-lezen, treedt er een fout op als Overschrijven is ingesteld op Onwaar.

Deze methode stopt bij de eerste fout die ze tegenkomt. Er is geen terugdraaiing van acties die geslaagd zijn voordat de fout optreedt.

Gebruik van de ‘Move’ methodes

Deze methodes kunnen gebruikt worden om bestanden of mappen te verplaatsen naar andere locaties. Dit is hetzelfde als knippen van de ene plaats en plakken in een andere plaats. Merk op dat als het te verplaatsen bestand open is, de methode Verplaatsen zal mislukken met een fout.

VerplaatsFile

Deze methode wordt gebruikt om een specifiek bestand naar een andere locatie te verplaatsen. Jokertekens zijn toegestaan in de laatste padcomponent van de bron.

Syntax is:

MoveFile bron, bestemming

Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub

Deze code verplaatst alle bestanden die gevonden zijn in ‘C:\temp’ naar ‘C:\temp-mijnmap’.

De bron- en doelmap moeten bestaan, omdat de doelmap niet automatisch wordt aangemaakt.

Deze methode stopt bij de eerste fout die ze tegenkomt. Er vindt geen terugdraaiing plaats van acties die geslaagd zijn voordat de fout optreedt.

MoveFolder

Deze methode verplaatst een specifieke map van de ene naar de andere locatie.

Syntax is:

MoveFolder (bron, bestemming)

Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub

Deze code verplaatst de map ‘mijnmap’ en de inhoud naar de map ‘mijnbestemming’. Mijn map wordt verwijderd en mijn bestemming wordt aangemaakt, samen met de inhoud van mijn map.

Als de doelmap al bestaat, treedt er een fout op.

Gebruik van de ‘Delete’-methoden

Deze methoden worden gebruikt om bestanden of mappen te verwijderen. Ze moeten met zorg worden gebruikt omdat er geen terugdraai of ongedaan maken methode is als er iets fout gaat.

DeleteFile

Dit verwijdert individuele bestanden of een groep bestanden met behulp van jokertekens.

Syntax is:

DeleteFile filespec,

Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub

Deze code verwijdert alle bestanden in de map ‘C:\temp’

De parameter Force is optioneel en wordt ingesteld op True of False. Als deze op True wordt gezet, worden alleen-lezen bestanden verwijderd. De standaardwaarde is False.

DeleteFolder

Deze methode verwijdert een gespecificeerde map en de inhoud daarvan.

Syntax is:

DeleteFolder folderspec,

Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub

Deze code verwijdert de map ‘MyDestination’ en alle bestanden in die map. De map ’temp’ blijft bestaan.

De parameter Force is optioneel en wordt ingesteld op True of False. Als deze is ingesteld op True, dan worden alleen-lezen mappen verwijderd. De standaardwaarde is False.

Wildcards kunnen worden gebruikt in de laatste component van het pad. Als de map niet wordt gevonden, treedt er een fout op.

Deze methode stopt bij de eerste fout die ze tegenkomt. Er vindt geen terugdraaiing plaats van acties die geslaagd zijn voordat de fout optreedt.

Andere methoden in de FSO

OpenAsTextStream.

Deze methode opent een opgegeven bestand als een Text Stream object en maakt het mogelijk om het te lezen of er naar te schrijven. Het voordeel van deze methode is dat het elk bestandstype kan openen en de beschikbare tekst kan extraheren.

Syntax is:

OpenAsTextStream (])

De parameter ‘iomode’ staat alleen lezen (1), lezen/schrijven (2), en appending (8) toe. De parameter ‘lezen/schrijven’ overschrijft het bestand.

De parameter ‘format’ wordt ingesteld op -2 voor de standaardinstelling van het systeem, -1 om het bestand te openen als Unicode, en 0 om het bestand te openen als ASCII (American Standard Code for Information Interchange).

Sub TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sts.CloseEnd Sub

Deze code haalt een bestaand tekstbestand op en maakt het als een object met behulp van de methode ‘GetFile’. Het opent vervolgens de tekststroom als lezen / schrijven (2) en schrijft een regel tekst. Het bestand wordt dan gesloten en opnieuw geopend als read (1) en er wordt een regel uit gelezen, die vervolgens wordt weergegeven als een berichtenbox.

Merk op dat de gelezen regel in een variabele moet worden geplaatst voordat deze kan worden weergegeven in een berichtenbox.

BuildPath

Deze methode voegt een map- of bestandsnaam toe aan het einde van een bestaand mappad. Dit creëert alleen een tekst string en maakt niet daadwerkelijk de nieuwe map.

Syntax is:

BuildPath (path, name)

Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub

Dit zal ‘C:temp\ANewFolder’ weergeven. Als u deze map echter daadwerkelijk wilt gebruiken, moet u de methode ‘CreateFolder’ gebruiken.

OpenTextFile

Met deze methode kunnen bestanden worden geopend en gelezen van of geschreven naar volgens ingestelde parameters. Het werkt op een vergelijkbare manier als de OpenAsTextStream methode.

Syntax is:

OpenTextFile (bestandsnaam, ]])

De ‘iomode’ parameter staat ForReading, ForWriting, en ForAppending toe. De parameter ForWriting overschrijft het bestand.

De parameter ‘create’ is een Booleaanse waarde. True betekent dat een nieuw bestand wordt gemaakt als de opgegeven bestandsnaam niet bestaat. False betekent dat er geen bestand wordt aangemaakt als de bestandsnaam niet wordt gevonden. De standaardwaarde is False.

De parameter ‘format’ kan worden ingesteld op TristateFalse, TristateMixed, TristateTrue, en TristateUseDefault, afhankelijk van of het bestand ASCII of Unicode is.

Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub

Deze code leest een regel uit het tekstbestand ‘myfile.txt’.

Een voordeel van de OpenTextFile methode ten opzichte van de OpenAsTextStreamMethode is dat er drop-downs voor de parameters zijn, die zinvoller zijn dan het onthouden van de juiste numerieke waarden voor de verschillende parameteropties.

Eigenschappen van de FSO

Drives

Deze eigenschap bevat een verzameling van beschikbare stations op uw computer.

Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub

Deze code retourneert elke stationsletter die op uw computer beschikbaar is.

Name

Deze code retourneert de naam van een gespecificeerd bestand of map.

Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub

Deze code geeft de naam van het bestand en informatie erover met behulp van de Drive eigenschap.

Path

De Path eigenschap scheidt het pad uit een bestandsspecificatie.

Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub

Dit voorbeeld werkt op dezelfde manier als het Name voorbeeld, behalve dat het nu het pad voor het bestand geeft.

Size

De Size eigenschap geeft de grootte van een map of een bestand.

Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub

De bovenstaande code geeft de grootte van de map ‘C:³³’.

Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub

Deze code geeft de grootte van het bestand ‘myfile.txt’.

Type

De eigenschap type geeft de tekst voor het bestand of het maptype.

Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub

De bovenstaande code geeft de tekst ‘Bestandsmap’.

Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub

De bovenstaande code geeft de tekst ‘Tekstdocument’.

Let op het gebruik van ‘GetFolder’ en ‘GetFile’ in elk voorbeeld.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.