Bruke FileSystemObject (FSO) i Excel VBA
FileSystemObject (FSO) gir deg tilgang til en rekke funksjoner for tilgang til datamaskinens filsystem. Ved å bruke dette objektet kan du enkelt få tilgang til filer, mapper og stasjoner, og også lese og skrive til filer.
Mange av FSO -funksjonene kan skrives av deg i tradisjonell VBA, men vil kreve mer koding og ville være vanskeligere for en innkommende utvikler å vedlikeholde og forstå. FSO er et utprøvd API (Application Programming Interface) og er mer pålitelig enn din egen kode. Den er enkel å bruke og klar og tilgjengelig.
FSO fungerer etter internasjonale standarder og innstillinger du har på datamaskinen. Hvis du distribuerer Excel -applikasjonen din globalt, vil bruk av FSO ta seg av eventuelle forskjeller i innstillinger mellom land, som din egen kode ville ha problemer med å gjøre.
FSO lar deg gjøre nesten alt i VBA -kode som du kan gjøre i Windows File Explorer. Det gir deg fullstendig tilgang til Windows -filsystemet.
Opprette et FileSystemObject
FileSytemObject er ikke en del av Excel VBA. Du kan bruke FSO ved å opprette et objekt (sen binding) i VBA:
123 | Sub CreateFSO ()Sett MyFSO = CreateObject ("Scripting.FileSystemObject")Slutt Sub |
Alternativt kan du legge til en referanse i VBA for FSO -biblioteket. Dette kalles tidlig binding og det er raskere enn sen binding, siden objektet ikke trenger å opprettes når koden din kjøres.
For å legge til en referanse, må du trykke Alt-F11 for å gå inn i Visual Basic Editor (VBE), og deretter bruke 'Verktøy | Referanser' fra VBE-menyen. Dette viser et popup-vindu der du kan velge den relevante referansen (se nedenfor).
Rull nedover listen over tilgjengelige referanser til du kan se 'Microsoft Scripting Runtime'. Merk av i boksen og klikk på OK, og biblioteket er nå en del av søknaden din.
Plasseringen av DLL -biblioteksfilen er C: \ Windows \ SysWOW64 \ scrrun.dll
Hvis du distribuerer søknaden din til andre kolleger eller steder, er det viktig at de har denne filen på riktig sted på datamaskinen sin, ellers vil koden få en feil.
Det er verdt å sette en feilfelle på "WorkbookOpen" -hendelsen ved å bruke Dir -kommandoen for å kontrollere at filen finnes. Hvis den er fraværende, gi en advarsel og lukk Excel -filen.
Når referansen er lagt til, kan du bruke følgende kode for å lage FSO:
123 | Sub TestFSO ()Dim MyFSO som nytt filsystemsystemSlutt Sub |
Alle eksemplene i denne artikkelen vil bruke denne metoden for å lage FSO.
FSO har mange metoder og egenskaper tilgjengelig. Disse er delt inn her i seksjoner etter hva de kan gjøre.
Bruk av 'eksisterer' -metodene
Du kan bruke en FSO -metode for å kontrollere om det finnes en stasjon, en mappe eller en fil. Disse metodene er enkle å bruke og krever bare én parameter.
123456 | Sub CheckExistance ()Dim MyFSO som nytt filsystemsystemMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")Slutt Sub |
Disse utsagnene vil alle returnere 'True' forutsatt at datamaskinen din har en C: -stasjon, en mappe på den som heter 'Temp' og en fil i Temp -mappen som heter 'testfile.txt'
Tekststrengene i parameterne er ikke store og små bokstaver. Du kan ikke bruke jokertegn i noen av disse metodene.
Du kan heller ikke bruke nettadresser (Uniform Resource Locators) til å beskrive en mappe eller filplassering. FSO fungerer rent på Windows -operativsystemet og filsystemet derpå. For en ekstern serverplassering må du først kartlegge en stasjon til dette, og deretter bruke selve stasjonsbanen.
Bruke "Få" -metodene
FSO har mange metoder for å få informasjon om filen og banen, enten dele banen og filen, eller få fil- eller mappeinformasjon, for eksempel dato opprettet eller dato endret.
GetAbsolutePathname
Dette vil gi en fullstendig bane fra roten til den angitte stasjonen.
Syntaks er:
GetAbsolutePathName (pathspec)
12345 | Sub AbsolutePath ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)Slutt Sub |
Dette vil returnere strengen 'C: \ Users \ Richard \ Documents'. Dette er fordi banen er spesifisert som C: etterfulgt av tre prikker. Hver prikk betyr et neste nivå i mappestrukturen.
GetBaseName
Dette returnerer navnet på en spesifisert fil eller mappe.
Syntaks er:
GetBaseName(sti)
12345 | Sub BaseName ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)Slutt Sub |
Denne koden returnerer "testfil". Metoden returnerer den siste delen i banenavnet. Hvis det er en fil, returnerer den ikke filtillegget.
Hvis banen ikke blir funnet, blir en tom streng returnert.
GetDrive
Dette lar deg bruke kode for å få tilgang til stasjonsinformasjon, basert på stasjonsbokstaven som er angitt.
Syntaks er:
GetDrive (drivespec)
123456 | Sub DriveInfo ()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Sett Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceSlutt Sub |
Denne metoden returnerer et stasjonsobjekt basert på angitt stasjon. Du kan bruke dette objektet til å få tilgang til informasjon om stasjonen, for eksempel ledig plass.
Lei av å søke etter eksempler på VBA -kode? Prøv AutoMacro!
GetDriveName
Denne metoden vil skille ut stasjonsnavnet fra en sti / filnavn.
Syntaks er:
GetDriveName (sti)
12345 | Sub DriveName ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)Slutt Sub |
Dette vil returnere 'C:'
GetExtensionName
Dette vil gi filtillegget tilbake i den angitte banen.
Syntaks er:
GetExtensionName (sti)
12345 | Sub ExtensionName ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)Slutt Sub |
Dette vil returnere 'txt'.
Hvis ingen fil er spesifisert, blir en tom streng returnert.
GetFile
Denne metoden returnerer et filobjekt som inneholder forskjellig informasjon om selve filen.
Syntaks er:
GetFile (filespec)
123456 | Sub FileInfo ()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C: \ temp \ testfile.txt"Sett Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedSlutt Sub |
Dette vil returnere datoen og klokkeslettet da den angitte filen ble opprettet. Hvis ingen fil er spesifisert eller filen ikke eksisterer, får du en "fil ikke funnet" -feil.
12345 | Subfilnavn ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)Slutt Sub |
Dette vil returnere 'testfile.txt'.
GetFolder
Dette oppretter et mappeobjekt for basismappen i den angitte banen. Banen må bare inneholde mappenavn. Ingen filnavn må inkluderes, ellers vil det oppstå en feil.
Syntaks er:
GetFolder (mappespec)
123456 | Sub FolderInfo ()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C: \ temp"Sett Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedSlutt Sub |
Mappeobjektet har forskjellig informasjon i det som kan nås. I dette tilfellet returnerer den datoen da mappen ble opprettet.
Du kan også bruke denne metoden til å hente alle filnavnene i en gitt mappe:
12345678 | Sub FileNames ()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C: \ temp"Sett Fo = MyFSO.GetFolder (Pth)For hver Fn i Fo.FilesMsgBox Fn.NameNeste FnSlutt Sub |
Denne koden vil gjenta gjennom ‘Temp’ -mappen og vise hvert filnavn som blir funnet.
GetParentFolderName
Denne metoden vil returnere mappenavnet på neste nivå opp i mappehierarkiet.
Syntaks er:
GetParentFolderName (sti)
12345 | Undermappenavn ()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)Slutt Sub |
Dette vil returnere 'Brukere', siden dette er 'overordnet' for mappen 'richard'.
VBA -programmering | Kodegenerator fungerer for deg!
Bruke "Opprett" -metodene
Med FSO kan du opprette en ny mappe og bane og opprette en tekstfil.
Lag mappe
Du kan angi et nytt mappebane navn som skal opprettes. En fare for dette er at hvis mappen allerede eksisterer, vil det oppstå en feil. Du kan bruke metoden 'FolderExists' for å sikre at dette ikke vil skje.
Syntaks er:
Lag mappe(mappenavn)
1234567 | Sub CreateNewFolder ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ MyFolder"Hvis MyFSO.FolderExists (Pth) = False ThenMyFSO.CreateFolder (Pth)Slutt omSlutt Sub |
Denne koden vil opprette en ny mappe kalt 'MyFolder' under den eksisterende banen 'C: \ temp'.
CreateTextFile
Denne metoden lar deg lage en enkel tekstfil og skrive direkte inn i den.
Syntaks er:
CreateTextFile (filnavn, [ overskrive, [ unicode ]])
1234567 | Sub CreateTextFile ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ Myfile.txt"Sett Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write "Legg til min egen tekst her" & vbLf & "Dette er den andre linjen"Fn. LukkSlutt Sub |
Denne koden oppretter en tekstfil som heter 'Myfile.txt' i 'Temp' -mappen i 'C:' -stasjonen og skriver deretter to tekstlinjer til den.
Vær oppmerksom på at et linjeformet tegn er koblet inn i strengen som skrives.
Hvis banen du skriver til ikke eksisterer, vil det oppstå en feil. Du kan bruke metoden 'FolderExists' for å sjekke dette før du oppretter filen.
Det er en valgfri parameter for å overskrive den eksisterende filen om nødvendig - dette kan være True eller False. Standarden er True.
Bruk av ‘kopieringsmetodene’
Du kan bruke disse metodene til å kopiere en fil eller en mappe til et annet sted.
VBA -programmering | Kodegenerator fungerer for deg!
Kopier fil
Denne metoden vil kopiere en fil fra en mappeplassering til en annen. Vær oppmerksom på at kopien mislykkes hvis destinasjonsstedet har skrivebeskyttet attributt.
Syntaks er:
Kopier fil kilde, mål, [ overskrive ]
1234 | Sub CopyFile ()Dim MyFSO som nytt filsystemobjektMyFSO.CopyFile "C: \ temp \*. Txt", "C: \ temp \ myfolder \", TrueSlutt Sub |
Denne koden vil lage en kopi av alle tekst (txt) filene ved ‘C: \ temp’ til ‘C: \ temp \ myfolder \’, og overskrive filen der det er nødvendig. Standardinnstillingen for Overwrite er True.
Du kan bruke et jokertegn (*) for filnavnene, men du kan ikke bruke et spørsmålstegn (?) Jokertegn for å representere enkelttegn.
CopyFolder
Du kan bruke denne metoden til å kopiere en hel mappe fra ett sted til et annet.
Syntaks er:
CopyFolder kilde, mål, [ overskrive ]
1234 | Sub CopyFolder ()Dim MyFSO som nytt filsystemobjektMyFSO.CopyFolder "C: \ temp \*", "C: \ users \ richard \"Slutt Sub |
Denne koden kopierer alle mappene og filene under 'C: \ temp' til 'C: \ users \ richard'. Den nye mappen som opprettes vil være 'C: \ users \ richard \ myfolder' ettersom 'C: \ temp' hadde en mappe i den kalt 'myfolder'.
Det er fire mulige utfall når du bruker denne metoden:
- Hvis destinasjonen ikke eksisterer, blir kildemappen og innholdet kopiert.
- Hvis destinasjonen allerede eksisterer, oppstår det en feil.
- Hvis målet er en mappe, blir kildemappen og innholdet kopiert. Det vil oppstå en feil hvis Overskriv er satt til Falsk og det allerede er en kopi av en fil i destinasjonen.
- Hvis destinasjonen er angitt til skrivebeskyttet, vil det oppstå en feil hvis overskriving er satt til falsk.
Denne metoden stopper ved den første feilen den støter på. Det er ingen tilbakeføring av handlinger som har lyktes før feilen oppstår.
Bruke "Flytt" -metodene
Disse metodene kan brukes til å flytte filer eller mapper til andre steder. Dette er det samme som å klippe fra ett sted og lime inn på et annet sted. Vær oppmerksom på at hvis filen som skal flyttes er åpen, mislykkes flyttingsmetoden med en feil.
MoveFile
Denne metoden brukes til å flytte en bestemt fil til et annet sted. Jokertegn er tillatt i den siste banekomponenten i kilden.
Syntaks er:
MoveFile kilde, mål
1234 | Sub MoveAFile ()Dim MyFSO som nytt filsystemobjektMyFSO.MoveFile "C: \ temp \*", "C: \ temp \ myfolder"Slutt Sub |
Denne koden flytter alle filene som er funnet på 'C: \ temp' til 'C: \ temp \ myfolder'.
Kilde- og destinasjonsmappene må eksistere, ettersom destinasjonsmappen ikke blir opprettet automatisk.
Denne metoden stopper ved den første feilen den støter på. Det er ingen tilbakeføring av handlinger som har lyktes før feilen oppstår.
VBA -programmering | Kodegenerator fungerer for deg!
MoveFolder
Denne metoden flytter en bestemt mappe fra ett sted til et annet.
Syntaks er:
MoveFolder (kilde, mål)
1234 | Sub MoveAFolder ()Dim MyFSO som nytt filsystemobjektMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"Slutt Sub |
Denne koden flytter mappen "min mappe" og innholdet til mappen "min destinasjon". ‘Myfolder’ slettes effektivt og ‘mydestination’ opprettes, sammen med innholdet fra ‘myfolder’.
Hvis målmappen allerede eksisterer, oppstår det en feil.
Bruk "Slett" -metodene
Disse metodene brukes til å slette filer eller mapper. De må brukes med forsiktighet, siden det ikke er noen tilbakeslag eller angre metoder hvis noe går galt.
Slett fil
Dette sletter individuelle filer eller en gruppe filer ved hjelp av jokertegn.
Syntaks er:
Slett fil filespec, [ makt ]
1234 | Sub DeleteFiles ()Dim MyFSO som nytt filsystemobjektMyFSO.DeleteFile "C: \ temp \*"Slutt Sub |
Denne koden sletter alle filene i mappen 'C: \ temp'
Force -parameteren er valgfri og er satt til True eller False. Hvis den er satt til True, blir skrivebeskyttede filer slettet. Standarden er False.
Slett mappe
Denne metoden sletter en spesifisert mappe og innholdet.
Syntaks er:
Slett mappe mappespes, [ makt ]
1234 | Sub DeleteFolders ()Dim MyFSO som nytt filsystemsystemMyFSO.DeleteFolder "C: \ temp \ MyDestination"Slutt Sub |
Denne koden sletter mappen "MyDestination" og alle filene i den mappen. Mappen 'temp' forblir.
Force -parameteren er valgfri og er satt til True eller False. Hvis den er satt til True, blir skrivebeskyttede mapper slettet. Standarden er False.
Jokertegn kan brukes i den siste komponenten av banen. Hvis mappen ikke blir funnet, vil det oppstå en feil.
Denne metoden stopper ved den første feilen den støter på. Det er ingen tilbakeføring av handlinger som har lyktes før feilen oppstår.
VBA -programmering | Kodegenerator fungerer for deg!
Andre metoder i FSO
OpenAsTextStream.
Denne metoden åpner en spesifisert fil som et tekststrømobjekt og lar den leses eller skrives til. Fordelen med denne metoden er at den kan åpne hvilken som helst filtype og trekke ut tilgjengelig tekst.
Syntaks er:
OpenAsTextStream ([ iomode, [ format ]])
Parameteren iomode tillater skrivebeskyttet (1), lese/skrive (2) og legge til (8). Les/skriv -parameteren overskriver filen.
Parameteren ‘format’ er satt til -2 for systemstandard, -1 for å åpne filen som Unicode og 0 for å åpne filen som ASCII (American Standard Code for Information Interchange).
1234567891011 | Sub TextStream ()Dim MyFSO som nytt filsystemobjektSett f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Sett ts = f.OpenAsTextStream (2)ts.Skriv "Min nye tekst"ts.LukkSett ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts.LukkSlutt Sub |
Denne koden får en eksisterende tekstfil og lager den som et objekt ved hjelp av "GetFile" -metoden. Den åpner deretter tekststrømmen som les / skriv (2) og skriver en tekstlinje. Filen lukkes deretter og åpnes på nytt som lest (1), og en linje leses fra den, som deretter vises som en meldingsboks.
Vær oppmerksom på at leselinjen må plasseres i en variabel før den kan vises i en meldingsboks.
BuildPath
Denne metoden vil legge til en mappe eller filnavn på slutten av en eksisterende mappebane. Dette oppretter bare en tekststreng og oppretter faktisk ikke den nye mappen.
Syntaks er:
BuildPath (sti, Navn)
12345 | Sub BuildPth ()Dim MyFSO som nytt filsystemobjektnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npSlutt Sub |
Dette vil vise 'C: \ temp \ ANewFolder'. Men hvis du faktisk vil bruke denne mappen, må du bruke metoden 'CreateFolder'.
OpenTextFile
Denne metoden lar filer åpnes og leses fra eller skrives til i henhold til angitte parametere. Det fungerer på lignende måte som OpenAsTextStream -metoden.
Syntaks er:
OpenTextFile (filnavn, [ iomode, [ skape, [ format ]]])
Parameteren iomode tillater ForReading, ForWriting og ForAppending. ForWriting -parameteren overskriver filen.
"Opprett" -parameteren er en boolsk verdi. True betyr at en ny fil vil bli opprettet hvis det angitte filnavnet ikke eksisterer. Falsk betyr at ingen fil vil bli opprettet hvis filnavnet ikke blir funnet. Standarden er False.
Parameteren ‘format’ kan settes til TristateFalse, TristateMixed, TristateTrue og TristateUseDefault avhengig av om filen er ASCII eller Unicode.
1234567 | Sub OpenTxtFile ()Dim MyFSO som nytt filsystemsystemSett ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.LukkSlutt Sub |
Denne koden vil lese en linje fra tekstfilen 'myfile.txt'.
En fordel OpenTextFile -metoden har i forhold til OpenAsTextStreamMethod er at den har nedtrekk for parametrene, som er mer meningsfulle enn å prøve å huske de riktige numeriske verdiene for de forskjellige parameteralternativene.
VBA -programmering | Kodegenerator fungerer for deg!
Egenskaper for FSO
Stasjoner
Denne egenskapen har en samling tilgjengelige stasjoner på datamaskinen din.
1234567 | Sub Drv ()Dim MyFSO As New FileSystemObject, d As DriveSett Dr = MyFSO.DrivesFor hver d i Dr.MsgBox d.DriveLetterNeste dSlutt Sub |
Denne koden returnerer hver stasjonsbokstav som er tilgjengelig på datamaskinen din.
Navn
Dette returnerer navnet på en spesifisert fil eller mappe.
123456789 | Sub NameExample ()Dim MyFSO som nytt filsystemsystemSett f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Opprettet:" & f.DateCreated & vbCrLfi = i & "Sist åpnet:" & f.DateLastAccessed & vbCrLfi = i & "Sist endret:" & f.DateLastModifiedMsgBox iSlutt Sub |
Denne koden vil gi navnet på filen og informasjon om den ved hjelp av Drive -egenskapen.
Sti
Sti -egenskapen vil skille banen fra en filspesifikasjon.
123456789 | Sub PathExample ()Dim MyFSO som nytt filsystemsystemSett f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Opprettet:" & f.DateCreated & vbCrLfi = i & "Sist åpnet:" & f.DateLastAccessed & vbCrLfi = i & "Sist endret:" & f.DateLastModifiedMsgBox iSlutt Sub |
Dette eksemplet fungerer på samme måte som eksempelet Navn, bortsett fra at det nå gir banen til filen.
VBA -programmering | Kodegenerator fungerer for deg!
Størrelse
Egenskapen Size vil vise størrelsen på en mappe eller fil.
12345 | Sub FSize ()Dim MyFSO som nytt filsystemsystemSett f = MyFSO.GetFolder ("C: \ temp \")MsgBox f. StørrelseSlutt Sub |
Denne koden ovenfor returnerer størrelsen på mappen 'C: \ temp \'.
12345 | Sub FSize ()Dim MyFSO som nytt filsystemsystemSett f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. StørrelseSlutt Sub |
Denne koden ovenfor vil returnere størrelsen på filen 'myfile.txt'.
Type
Typeegenskapen returnerer teksten for filen eller mappetypen.
12345 | Sub FType ()Dim MyFSO som nytt filsystemsystemSett f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeSlutt Sub |
Denne koden ovenfor returnerer teksten "Filmappe".
12345 | Sub FType ()Dim MyFSO som nytt filsystemsystemSett f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeSlutt Sub |
Denne koden ovenfor returnerer teksten "Tekstdokument".
Legg merke til bruken av 'GetFolder' og 'GetFile' i hvert eksempel.