Brug af FileSystemObject (FSO) i Excel VBA

FileSystemObject (FSO) giver dig adgang til en lang række funktioner til at få adgang til din computers filsystem. Ved hjælp af dette objekt kan du nemt få adgang til filer, mapper og drev samt læse og skrive i filer.

Mange af FSO-funktionerne kunne du selv skrive i traditionel VBA, men det ville kræve mere kodning og ville være vanskeligere for en nytilkommen udvikler at vedligeholde og forstå. FSO er en gennemprøvet API (Application Programming Interface) og er mere pålidelig end din egen kode. Den er nem at bruge og er klar og tilgængelig.

FSO fungerer efter internationale standarder og de indstillinger, som du har på din computer. Hvis du distribuerer din Excel-applikation globalt, så vil brugen af FSO tage sig af eventuelle forskelle i indstillingerne mellem lande, hvilket din egen kode ville have svært ved at gøre.

FSO giver dig mulighed for at gøre næsten alt i VBA-kode, som du kunne gøre i Windows File Explorer. Det giver dig fuldstændig adgang til Windows’ filsystem.

Skabelse af et FileSystemObject

FileSytemObject er ikke en del af Excel VBA. Du kan bruge FSO ved at oprette et objekt (sen binding) i VBA:

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

Alternativt kan du tilføje en henvisning i VBA til FSO-biblioteket. Dette kaldes tidlig binding, og det er hurtigere end sen binding, da objektet ikke behøver at blive oprettet, når din kode køres.

For at tilføje en reference skal du trykke på Alt-F11 for at åbne Visual Basic Editor (VBE) og derefter bruge “Tools|References” fra VBE-menuen. Dette vil vise et popup-vindue, hvor du kan vælge den relevante reference (se nedenfor).

Rul nedad på listen over tilgængelige referencer, indtil du kan se ‘Microsoft Scripting Runtime’. Sæt kryds i feltet, og klik på OK, og biblioteket er nu en del af dit program.

Lokaliseringen af DLL-biblioteksfilen er C:\Windows\SysWOW64\scrrun.dll

Hvis du distribuerer dit program til andre kolleger eller steder, er det vigtigt, at de har denne fil på den rigtige placering på deres computer, ellers vil din kode fejle.

Det er værd at sætte en fejlfælde på begivenheden “WorkbookOpen” ved hjælp af kommandoen Dir for at kontrollere, at filen findes. Hvis den ikke findes, skal du give en advarselsmeddelelse og lukke Excel-filen.

Når referencen er tilføjet, kan du bruge følgende kode til at oprette FSO’en:

Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub

Alle eksempler i denne artikel vil bruge denne metode til at oprette FSO’en.

FSO’en har mange metoder og egenskaber til rådighed. Disse er her opdelt i afsnit efter, hvad de kan gøre.

Anvendelse af ‘Exists’-metoderne

Du kan bruge en FSO-metode til at kontrollere, om et drev, en mappe eller en fil findes. Disse metoder er nemme at bruge og kræver kun é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

Disse udsagn vil alle returnere ‘True’, hvis det antages, at din computer har et C:-drev, en mappe på det kaldet ‘Temp’ og en fil i Temp-mappen kaldet ‘testfile.txt’

Tekststrengene i parametrene er ikke skiftet mellem store og små bogstaver. Du kan ikke bruge jokertegn i nogen af disse metoder.

Du kan heller ikke bruge URL’er (Uniform Resource Locators) til at beskrive en mappe- eller filplacering. FSO fungerer udelukkende på Windows-operativsystemet og filsystemet på dette. For en ekstern serverplacering skal du først og fremmest mappe et drev til dette og derefter bruge selve drevets sti.

Anvendelse af ‘Get’-metoderne

FSO har adskillige metoder til at få oplysninger om filen og stien, enten ved at opdele stien og filen eller ved at få oplysninger om filen eller mappen, f.eks. dato for oprettelse eller dato for ændring.

GetAbsolutePathname

Dette vil give en komplet sti fra roden af det angivne drev.

Syntaksen er:

GetAbsolutePathName (pathspec)

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

Dette vil returnere en streng ‘C:\Users\Richard\Documents’. Dette skyldes, at stien er angivet som C: efterfulgt af tre prikker. Hver prik betyder et næste niveau i mappestrukturen.

GetBaseName

Dette returnerer navnet på en specificeret fil eller mappe.

Syntaksen er:

GetBaseName (path)

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

Denne kode returnerer ‘testfile’. Metoden returnerer den sidste sektion i stinavnet. Hvis det er en fil, returnerer den ikke filsuffiks.

Hvis stien ikke kan findes, returneres en tom streng.

GetDrive

Dette giver dig mulighed for at bruge kode til at få adgang til drevoplysninger baseret på det angivne drevbogstav.

Syntaksen er:

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

Denne metode returnerer et drevobjekt baseret på det angivne drev. Du kan bruge dette objekt til at få adgang til oplysninger om drevet, f.eks. ledig plads til rådighed.

GetDriveName

Denne metode adskiller drevnavnet fra en sti/filnavnestreng.

Syntaksen er:

GetDriveName (path)

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

Dette vil returnere ‘C:’

GetExtensionName

Dette vil returnere filsuffikset i den angivne sti.

Syntaksen er:

GetExtensionName (path)

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

Dette returnerer ‘txt’.

Hvis der ikke er angivet nogen fil, returneres der en tom streng.

GetFile

Denne metode returnerer et filobjekt, som indeholder forskellige oplysninger om selve filen.

Syntaksen er:

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

Dette returnerer den dato og det klokkeslæt, som den angivne fil blev oprettet. Hvis der ikke er angivet nogen fil, eller hvis filen ikke findes, får du en fejlmeddelelse “fil ikke fundet”.

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

Dette returnerer “testfile.txt”.

GetFolder

Dette opretter et mappeobjekt for basismappen i den angivne sti. Stien må kun indeholde mappenavne. Der må ikke medtages filnavne, ellers opstår der en fejl.

Syntaksen er:

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

Mappeobjektet har forskellige oplysninger i sig, som man kan få adgang til. I dette tilfælde returneres den dato, hvor mappen blev oprettet.

Du kan også bruge denne metode til at hente alle filnavne i en given mappe:

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

Denne kode vil iterere gennem mappen ‘Temp’ og vise hvert filnavn, der findes.

GetParentFolderName

Denne metode returnerer mappenavnet i det næste niveau opad i mappehierarkiet.

Syntaksen er:

GetParentFolderName (path)

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

Dette vil returnere “Users”, da dette er “overordnet” for mappen “richard”.

Anvendelse af ‘Create’-metoderne

Med FSO’en kan du oprette en ny mappe og sti og oprette en tekstfil.

CreateFolder

Du kan angive et nyt mappestinavn, der skal oprettes. En fare ved dette er, at hvis mappen allerede findes, vil der opstå en fejl. Du kan bruge metoden “FolderExists” for at sikre, at dette ikke sker.

Syntaksen er:

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

Denne kode opretter en ny mappe med navnet “MyFolder” under den eksisterende sti “C:\temp”.

CreateTextFile

Med denne metode kan du oprette en simpel tekstfil og skrive direkte ind i den.

Syntaksen er:

CreateTextFile (filnavn, ])

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

Denne kode opretter en tekstfil kaldet ‘Myfile.txt’ i mappen ‘Temp’ på ‘C:’-drevet og skriver derefter to linjer tekst til den.

Bemærk, at der sammenkædes et linjefodstegn i den streng, der skrives.

Hvis den sti, som du skriver til, ikke findes, opstår der en fejl. Du kan bruge metoden ‘FolderExists’ til at kontrollere dette, før du opretter filen.

Der er en valgfri parameter til at overskrive den eksisterende fil, hvis det er nødvendigt – dette kan være True eller False. Standardværdien er True.

Anvendelse af ‘Copy’-metoderne

Du kan bruge disse metoder til at kopiere en fil eller en mappe til en anden placering.

CopyFile

Denne metode kopierer en fil fra en mappeplacering til en anden. Bemærk, at kopieringen mislykkes, hvis destinationens placering har attributten skrivebeskyttet indstillet.

Syntaksen er:

CopyFile source, destination,

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

Denne kode vil lave en kopi af alle tekstfiler (txt) på ‘C:\temp’ til ‘C:\temp\myfolder\’ og overskrive filen, hvor det er nødvendigt. Standardindstillingen for Overwrite er True.

Du kan bruge et stjernetegn (*) som jokertegn til filnavne, men du kan ikke bruge et spørgsmålstegn (?) som jokertegn til at repræsentere enkelte tegn.

CopyFolder

Du kan bruge denne metode til at kopiere en hel mappe fra et sted til et andet.

Syntaksen er:

CopyFolder source, destination,

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

Denne kode kopierer alle mapper og filer under ‘C:\temp’ til ‘C:\users\richard’. Den nye mappe, der oprettes, vil være ‘C:\users\richard\myfolder’, da ‘C:\temp’ havde en mappe i den, der hed ‘myfolder’.

Der er fire mulige resultater, når du bruger denne metode:

  • Hvis destinationen ikke findes, kopieres kildemappen og indholdet.
  • Hvis destinationen allerede findes, opstår der en fejl.
  • Hvis destinationen er en mappe, kopieres kildemappen og dens indhold. Der opstår en fejl, hvis Overskriv er indstillet til False, og der allerede findes en kopi af en fil i destinationen.
  • Hvis destinationen er indstillet til skrivebeskyttet, opstår der en fejl, hvis Overskriv er indstillet til False.

Denne metode stopper ved den første fejl, den støder på. Der sker ingen rollback af handlinger, der er lykkedes, før fejlen opstår.

Anvendelse af ‘Flyt’-metoderne

Disse metoder kan bruges til at flytte filer eller mapper til andre steder. Dette er det samme som at klippe fra et sted og indsætte til et andet sted. Bemærk, at hvis den fil, der skal flyttes, er åben, vil Move-metoden mislykkes med en fejl.

MoveFile

Denne metode bruges til at flytte en bestemt fil til en anden placering. Jokertegn er tilladt i den sidste stikomponent i kilden.

Syntaksen er:

MoveFile source, destination

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

Denne kode flytter alle filer, der findes på “C:\temp”, til “C:\temp\myfolder”.

Kilde- og destinationsmapperne skal eksistere, da destinationsmappen ikke automatisk oprettes.

Denne metode stopper ved den første fejl, som den støder på. Der sker ingen rollback af handlinger, der er lykkedes, før fejlen opstår.

MoveFolder

Denne metode flytter en bestemt mappe fra et sted til et andet.

Syntaksen er:

MoveFolder (source, destination)

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

Denne kode flytter mappen “minmappe” og indholdet til mappen “mydestination”. ‘minmappe’ slettes effektivt, og ‘mydestination’ oprettes sammen med indholdet fra ‘minmappe’.

Hvis destinationsmappen allerede findes, opstår der en fejl.

Anvendelse af ‘Slet’-metoderne

Disse metoder bruges til at slette filer eller mapper. De skal bruges med forsigtighed, da der ikke er nogen rollback- eller fortrydelsesmetoder, hvis noget går galt.

DeleteFile

Dette sletter individuelle filer eller en gruppe af filer ved hjælp af jokertegn.

Syntaksen er:

DeleteFile filespec,

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

Denne kode sletter alle filer i mappen ‘C:\temp’

Kraftparameteren er valgfri og indstilles til Sand eller Falsk. Hvis den er indstillet til True, slettes de skrivebeskyttede filer. Standardværdien er False.

DeleteFolder

Denne metode sletter en angivet mappe og dens indhold.

Syntaksen er:

DeleteFolder folderspec,

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

Denne kode sletter mappen ‘MyDestination’ og alle filerne i den pågældende mappe. Mappen ‘temp’ vil forblive.

Parameteren Force er valgfri og indstilles til True eller False. Hvis den er indstillet til True, slettes skrivebeskyttede mapper. Standardværdien er False.

Vildtegn kan bruges i den sidste komponent i stien. Hvis mappen ikke kan findes, opstår der en fejl.

Denne metode stopper ved den første fejl, den støder på. Der sker ingen rollback af handlinger, der er lykkedes, før fejlen opstår.

Andre metoder i FSO

OpenAsTextStream.

Denne metode åbner en specificeret fil som et Text Stream-objekt og gør det muligt at læse eller skrive til den. Fordelen ved denne metode er, at den kan åbne enhver filtype og udtrække den tilgængelige tekst.

Syntaksen er:

OpenAsTextStream (])

Parameteren ‘iomode’ giver mulighed for read only (1), read/write (2) og appending (8). Parameteren read/write overskriver filen.

Parameteren ‘format’ er indstillet til -2 for systemstandard, -1 for at åbne filen som Unicode og 0 for at åbne filen som 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

Denne kode henter en eksisterende tekstfil og opretter den som et objekt ved hjælp af ‘GetFile’-metoden. Derefter åbner den tekststrømmen som read / write (2) og skriver en linje tekst. Filen lukkes derefter og åbnes igen som read (1), og der læses en linje fra den, som derefter vises som en meddelelsesboks.

Bemærk, at den læste linje skal placeres i en variabel, før den kan vises i en meddelelsesboks.

BuildPath

Denne metode tilføjer et mappe- eller filnavn til slutningen af en eksisterende mappesti. Dette opretter kun en tekststreng og opretter faktisk ikke den nye mappe.

Syntaksen er:

BuildPath (path, name)

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

Dette vil vise ‘C:\temp\ANewFolder’. Men hvis du rent faktisk vil bruge denne mappe, skal du bruge metoden ‘CreateFolder’.

OpenTextFile

Denne metode gør det muligt at åbne filer og læse fra eller skrive til dem i henhold til de indstillede parametre. Den fungerer på samme måde som OpenAsTextStream-metoden.

Syntaksen er:

OpenTextFile (filnavn, ]])

Parameteren ‘iomode’ giver mulighed for ForReading, ForWriting og ForAppending. Parameteren ForWriting overskriver filen.

Parameteren ‘create’ er en boolsk værdi. True betyder, at der oprettes en ny fil, hvis det angivne filnavn ikke findes. False betyder, at der ikke oprettes nogen fil, hvis det angivne filnavn ikke findes. Standardværdien er False.

Parameteren ‘format’ kan indstilles til TristateFalse, TristateMixed, TristateTrue og TristateUseDefault, afhængigt af, om filen er ASCII eller Unicode.

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

Denne kode læser en linje fra tekstfilen ‘myfile.txt’.

En fordel, som OpenTextFile-metoden har i forhold til OpenAsTextStreamMethod, er, at den har drop-downs for parametrene, hvilket er mere meningsfuldt end at forsøge at huske de relevante numeriske værdier for de forskellige parameterindstillinger.

Egenskaber for FSO

Drives

Denne egenskab indeholder en samling af tilgængelige drev på din computer.

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

Denne kode returnerer hvert drevbogstav, der er tilgængeligt på computeren.

Name

Denne kode returnerer navnet på en angivet fil eller mappe.

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

Denne kode giver navnet på filen og oplysninger om den ved hjælp af Drive-egenskaben.

Path

Path-egenskaben adskiller stien ud fra en filspecifikation.

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

Dette eksempel fungerer på samme måde som eksemplet med Navn, bortset fra at det nu giver stien til filen.

Størrelse

Størrelsesegenskaben vil give størrelsen på en mappe eller en fil.

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

Denne ovenstående kode returnerer størrelsen af mappen “C:\temp\”.

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

Denne ovenstående kode returnerer størrelsen af filen “myfile.txt’.

Type

Type-egenskaben returnerer teksten for fil- eller mappetypen.

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

Denne ovenstående kode returnerer teksten ‘File folder’.

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

Denne ovenstående kode returnerer teksten ‘Text document’.

Bemærk brugen af ‘GetFolder’ og ‘GetFile’ i hvert eksempel.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.