Använda VBA FileSystemObject (FSO) i Excel – Enkel översikt och exempel

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:

  1. Sätta referensen till Microsoft Scripting Runtime Library (Scrrun.dll)
  2. 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.

Notera: När du aktiverar FileSystemObject kan du få tillgång till alla objekt i det. Detta inkluderar FileSystemObject, Drive, Files, Folders osv. Jag kommer att fokusera främst på FileSystemObject i den här handledningen.

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:

  1. I VB-redigeraren klickar du på Tools.
  2. Klicka på Referenser.
  3. I dialogrutan Referenser som öppnas bläddrar du bland de tillgängliga referenserna och markerar alternativet ”Microsoft Scripting Runtime”.
  4. 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:

  1. 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.
  2. 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.

Pro tips: När du kopierar filer finns det alltid en chans att filer skrivs över. En bra idé i det här fallet är att lägga till tidsstämpeln tillsammans med namnet. Detta säkerställer att namnen alltid är olika och du kan enkelt spåra vilka filer som kopierades vid vilken tidpunkt.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras.