När vi använder VBA i Excel är det oftast för att automatisera våra arbetsuppgifter.
Detta innebär också att vi oftast arbetar med celler och intervall, kalkylblad, arbetsböcker och andra objekt som är en del av Excel-programmet.
Men VBA är mycket kraftfullare och kan även användas för att arbeta med saker utanför Excel.
I den här handledningen kommer jag att visa dig hur du använder VBA FileSystemObject (FSO) för att arbeta med filer och mappar på ditt system eller på nätverksenheter.
Den här handledningen täcker:
Vad är VBA FileSystemObject (FSO)?
FileSystemObject (FSO) ger dig tillgång till datorns filsystem. Med hjälp av den kan du komma åt och ändra filer/mappar/kataloger i ditt datorsystem.
Nedan följer till exempel några av de saker som du kan göra med hjälp av FileSystemObject i Excel VBA:
- Kontrollera om en fil eller mapp existerar.
- Skapa eller byta namn på mappar/filer.
- Hämta en lista med alla filnamn (eller namn på undermappar) i en mapp.
- Kopiera filer från en mapp till en annan.
Jag hoppas att du får uppfattningen.
Jag kommer att ta upp alla dessa ovanstående exempel (plus fler) senare i den här handledningen.
Vissa saker som nämns ovan kan också göras med hjälp av traditionella VBA-funktioner (t.ex. DIR-funktionen) och metoder, men det skulle leda till längre och mer komplicerade koder. FileSystemObject gör det enkelt att arbeta med filer och mappar samtidigt som koden hålls ren och kort.
Note: FSO can only be used in Excel 2000 and later versions.
Vilka alla objekt kan du komma åt via FileSystemObject?
Som jag nämnde ovan kan du komma åt och ändra filer och mappar med hjälp av FileSystemObject i VBA.
Nedan följer en tabell som visar de viktigaste objekten som du kan komma åt och ändra med hjälp av FSO:
Object | Description |
Drive | Drive Object gör det möjligt för dig att få information om enheten, t.ex. om den existerar eller inte, sökvägsnamnet, enhetstypen (flyttbar eller fast), enhetens storlek osv. |
Folder | Mappobjektet låter dig skapa eller ändra mappar i ditt system. Du kan till exempel skapa, ta bort, byta namn och kopiera mappar med hjälp av det här objektet. |
File | File Objektet gör att du kan arbeta med filer i ditt system. Du kan till exempel skapa, öppna, kopiera, flytta och radera filer med det här objektet. |
TextStream | TextStream-objektet gör att du kan skapa eller läsa textfiler. |
Varje objekt ovan har metoder som du kan använda för att arbeta med dessa.
För att ge dig ett exempel, om du vill ta bort en mapp använder du DeleteFolder-metoden för Folder-objektet. På samma sätt, om du vill kopiera en fil använder du CopyFile-metoden för File-objektet.
Oroa dig inte om detta verkar överväldigande eller svårt att förstå. Du kommer att få en mycket bättre förståelse när du går igenom de exempel som jag har tagit upp i den här handledningen.
Bara för referensändamål har jag tagit upp alla FileSystemObject-metoder (för varje objekt) i slutet av den här handledningen.
Aktivering av FileSystemObject i Excel VBA
FileSystemObject är inte tillgängligt som standard i Excel VBA.
Då vi har att göra med filer och mappar som ligger utanför Excel-applikationen måste vi först skapa en referens till biblioteket som innehåller dessa objekt (enheter, filer, mappar).
Nu finns det två sätt att börja använda FileSystemObject i Excel VBA:
- Sätta referensen till Microsoft Scripting Runtime Library (Scrrun.dll)
- Skapa ett objekt för att hänvisa till biblioteket från själva koden
Och även om båda dessa metoder fungerar (och jag visar dig hur du gör nästa gång) rekommenderar jag att du använder den första metoden.
Sätta referensen till Microsoft Scripting Runtime Library
När du skapar en referens till Scripting Runtime Library ger du Excel VBA tillgång till alla egenskaper och metoder för filer och mappar. När detta är gjort kan du hänvisa till filerna/mapparna/drivrutinerna objektet från Excel VBA (precis som du kan hänvisa till celler, arbetsblad eller arbetsböcker).
Nedan följer stegen för att skapa en referens till Microsoft Scripting Runtime Library:
- I VB-redigeraren klickar du på Tools.
- Klicka på Referenser.
- I dialogrutan Referenser som öppnas bläddrar du bland de tillgängliga referenserna och markerar alternativet ”Microsoft Scripting Runtime”.
- Klicka på OK.
Med ovanstående steg kan du nu hänvisa till FSO-objekten från Excel VBA.
Skapa en instans av FileSystemObject i koden
När du har ställt in referensen till biblioteket Scripting FileSystemObject måste du skapa en instans av FSO-objektet i din kod.
När detta är skapat kan du använda det i VBA.
Nedan följer koden som ställer in objektvariabeln MyFSO som ett FileSystemObject-objekt:
Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub
I den här koden har jag först deklarerat variabeln MyFSO som ett objekt av typen FileSystemObject. Detta är endast möjligt eftersom jag har skapat en referens till Microsoft Scripting Runtime Library. Om referensen inte skapas kommer detta att ge ett fel (eftersom Excel inte skulle känna igen vad FileSystemObject betyder).
I den andra raden händer två saker:
- Nyckelordet NEW skapar en instans av FileSystemObject. Detta innebär att jag nu kan använda alla metoder för FileSystemObject för att arbeta med filer och mappar. Om du inte skapar den här instansen kan du inte få tillgång till metoderna i FSO.
- Med nyckelordet SET sätts objektet MyFSO till den här nya instansen av FileSystemObject. Detta gör att jag kan använda det här objektet för att få tillgång till filer och mappar. Om jag till exempel behöver skapa en mapp kan jag använda metoden MyFSO.CreateFolder.
Om du vill kan du också kombinera de två ovanstående påståendena till ett som visas nedan:
Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub
En stor fördel med att använda den här metoden (som är att ställa in referensen till Microsoft Scripting Runtime Library) är att när du använder FSO-objekten i din kod kommer du att kunna använda IntelliSense-funktionen som visar de metoder och egenskaper som är associerade med ett objekt (som visas nedan).
Detta är inte möjligt när du skapar referensen från koden (behandlas härnäst).
Skapa ett objekt från koden
Ett annat sätt att skapa en referens till FSO är att göra det från koden. I den här metoden behöver du inte skapa någon referens (som i föregående metod).
När du skriver koden kan du skapa ett objekt från koden och hänvisa till Scripting.FileSystemObject.
Den nedanstående koden skapar ett objekt FSO och gör sedan detta till en FileSystemObject-typ.
Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub
Men även om detta kan tyckas bekvämare är en stor nackdel med att använda den här metoden att den inte skulle visa en IntelliSense när du arbetar med objekt i FSO. För mig är detta ett stort minus och jag rekommenderar alltid att du använder den tidigare metoden för att aktivera FSO (vilket är genom att ställa in referensen till ”Microsoft Scripting Runtime”)
VBA FileSystemObject Exempel
Nu ska vi dyka in och ta en titt på några praktiska exempel på att använda FileSystemObject i Excel.
Exempel 1: Kontrollera om en fil eller mapp finns
Följande kod kontrollerar om mappen med namnet ”Test” finns eller inte (på den angivna platsen).
Om mappen finns är IF-villkoret True och det visas ett meddelande – ”The Folder Exists” i en meddelanderuta. Om den inte finns visas meddelandet ”Mappen existerar inte”.
Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub
Samma sak gäller för att kontrollera om en fil finns eller inte.
Koden nedan kontrollerar om det finns en fil med namnet Test.xlsx i den angivna mappen eller inte.
Sub CheckFileExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub
Exempel 2: Skapa en ny mapp på angiven plats
Med nedanstående kod skapas en mapp med namnet ”Test” i C-enheten på mitt system (du måste ange sökvägen på ditt system där du vill skapa mappen).
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub
Den här koden fungerar bra, men den skulle visa ett fel om mappen redan finns.
Koden nedan kontrollerar om mappen redan finns och skapar en mapp om den inte gör det. Om mappen redan finns visar den ett meddelande. För att kontrollera om mappen finns har jag använt FSO:s metod FolderExists.
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd Sub
Exempel 3: Få en lista över alla filer i en mapp
Underliggande kod skulle visa namnen på alla filer i den angivna mappen.
Sub GetFileNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MyFile In MyFolder.Files Debug.Print MyFile.NameNext MyFileEnd Sub
Den här koden är lite mer komplicerad än de koder vi redan har sett.
Som jag nämnde ovan i den här handledningen kan du, när du refererar till ”Microsoft Scripting Runtime Library”, använda FileSystemObject samt alla andra objekt (t.ex. filer och mappar).
I koden ovan använder jag tre objekt – FileSystemObject, File och Folder. Detta gör att jag kan gå igenom varje fil i den angivna mappen. Jag använder sedan egenskapen name för att få en lista över alla filnamn.
Bemärk att jag använder Debug.Print för att få fram namnen på alla filer. Dessa namn kommer att listas i det omedelbara fönstret i VB-redigeraren.
Exempel 4: Få listan över alla undermappar i en mapp
Med nedanstående kod får du namnen på alla undermappar i den angivna mappen. Logiken är exakt densamma som i exemplet ovan. I stället för filer har vi i den här koden använt undermappar.
Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd Sub
Exempel 5: Kopiera en fil från ett ställe till ett annat
Med nedanstående kod kopieras filen från mappen ”Source” till mappen ”Destination”.
Sub CopyFile()Dim MyFSO As FileSystemObjectDim SourceFile As StringDim DestinationFolder As StringSet MyFSO = New Scripting.FileSystemObjectSourceFile = "C:\Users\sumit\Desktop\Source\SampleFile.xlsx"DestinationFolder = "C:\Users\sumit\Desktop\Destination"MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "\SampleFileCopy.xlsx"End Sub
I koden ovan har jag använt mig av två variabler – SourceFile och DestinationFolder.
Source File innehåller adressen till den fil jag vill kopiera och variabeln DestinationFolder innehåller adressen till den mapp jag vill att filen ska kopieras till.
Bemärk att det inte räcker att ange namnet på destinationsmappen när du kopierar en fil. Du måste också ange filnamnet. Du kan använda samma filnamn eller också ändra det. I exemplet ovan kopierade jag filen och namngav den SampleFileCopy.xlsx
Exempel 6: Kopiera alla filer från en mapp till en annan
Med nedanstående kod kopieras alla filer från källmappen till destinationsmappen.
Sub CopyAllFiles()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub
Ovanstående kod kopierar alla filer från källmappen till destinationsmappen.
Bemärk att jag i metoden MyFSO.CopyFile har angett egenskapen ”Overwritefiles” till False (den är True som standard). Detta säkerställer att om du redan har filen i mappen kopieras den inte (och du kommer att se ett fel). Om du tar bort ”Overwritefiles” eller ställer in den på True, om det finns filer i målmappen med samma namn, kommer dessa att skrivas över.
Om du bara vill kopiera filer med ett visst tillägg kan du göra det genom att använda en IF Then-angivelse för att kontrollera om tillägget är xlsx eller inte.
Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub
FileSystemObject (FSO)-metoder
Här är metoderna som du kan använda för varje objekt. Detta är bara för referensändamål och oroar inte för mycket. Användningen av några av dessa har visats i de exempel som behandlas ovan.
FSO Metoder | För objekt | Beskrivning | |
DriveExists | Drive | Kontrollerar om enheten finns eller inte | |
GetDrive | Drive | Returnerar en instans av enhetsobjektet baserat på den angivna sökvägen | |
GetDriveName | Drive | Returnerar namnet på enheten | |
BuildPath | File/Folder | Genererar en sökväg från en befintlig sökväg och ett namn | |
CopyFile | File/Folder | Kopierar en fil | |
GetAbsolutePathName | File/Folder | Returnerar den kanoniska representationen av sökvägen | |
GetBaseName | File/Folder | Returnerar basnamnet från en sökväg. Till exempel ”D:\TestFolder\TestFile.xlsm” returnerar TextFile.xlsm | |
GetTempName | File/Folder | Generera ett namn som kan användas för att namnge en temporär fil | |
CopyFolder | Folder | Kopierar en mapp från en plats till en annan. annan | |
CreateFolder | Folder | Skapa en ny mapp | |
DeleteFolder | Folder | Lägger bort den angivna mappen | |
FolderExists | Folder | Kontrollerar om mappen finns eller inte | |
GetFolder | Folder | Returnerar en instans av mappobjektet baserat på den angivna sökvägen | |
GetParentFolderName | Folder | Returnerar namnet på den överordnade mappen baserat på den angivna sökvägen | |
GetSpecialFolder | Folder | Hämtar platsen för olika systemmappar. | |
MoveFolder | Mappa | Förflyttar en mapp från en plats till en annan | |
DeleteFile | File | Lägger bort en fil | |
FileExists | File | Kontrollerar om en fil finns eller inte | |
GetExtensionName | File | Returnerar filtillägget | |
GetFile | File | File | Returnerar instansen för en fil. objektet baserat på den angivna sökvägen |
GetFileName | File | Returnerar filnamnet | |
GetFileVersion | File | File | Returnerar filversionen |
MoveFile | File | Förflyttar en fil | |
CreateTextFile | File | Skapa en textfil | |
GetStandardStream | File | Hämtar standardinmatningen, utdata eller felström | |
OpenTextFile | File | Öppna en fil som TextStream |
Du kanske också gillar följande Excel-utbildningar:
- Få en lista med filnamn från mappar & Undermappar (med hjälp av Power Query).
- Få en lista med filnamn från en mapp i Excel (med och utan VBA).
- Förståelse av Excel VBA-datatyper (variabler och konstanter).
- Skapa en användardefinierad funktion (UDF) i Excel VBA.