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

När vi använder VBA i Excel är det mesta för att automatisera våra uppgifter.

Detta innebär också att vi för det mesta arbetar med celler och intervall, kalkylblad, arbetsböcker och andra objekt som är en del av Excel -applikationen.

Men VBA är mycket kraftfullare och kan också användas för att arbeta med saker utanför Excel.

I den här självstudien visar jag dig hur du använder VBA FileSystemObject (FSO) för att arbeta med filer och mappar på ditt system eller nätverksenheter.

Vad är VBA FileSystemObject (FSO)?

FileSystemObject (FSO) låter dig komma åt din systems filsystem. Med den kan du komma åt och ändra filer/mappar/kataloger i ditt datorsystem.

Till exempel nedan är några av de saker du kan göra med FileSystemObject i Excel VBA:

  • Kontrollera om det finns en fil eller en mapp.
  • Skapa eller byt namn på mappar/filer.
  • Få en lista över alla filnamn (eller undermappnamn) i en mapp.
  • Kopiera filer från en mapp till en annan.

Jag hoppas att du förstår idén.

Jag kommer att täcka alla dessa exempel ovan (plus fler) senare i denna handledning.

Även om några av de saker som nämns ovan också kan göras med traditionella VBA -funktioner (som DIR -funktionen) och metoder, skulle det 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.

Obs: FSO kan endast användas i Excel 2000 och senare versioner.

Vilka alla objekt kan du komma åt via FileSystemObject?

Som jag nämnde ovan kan du komma åt och ändra filer och mappar med FileSystemObject i VBA.

Nedan finns en tabell som visar de viktigaste objekten som du kan komma åt och ändra med FSO:

Objekt Beskrivning
Kör Drive Object låter dig få information om enheten, till exempel om den existerar eller inte, dess sökvägsnamn, enhetstyp (flyttbar eller fast), dess storlek etc.
Mapp Med mappobjekt kan du skapa eller ändra mappar i ditt system. Du kan till exempel skapa, ta bort, byta namn, kopiera mappar med det här objektet.
Fil Med File Object kan du arbeta med filer i ditt system. Du kan till exempel skapa, öppna, kopiera, flytta och ta bort filer med det här objektet.
TextStream TextStream -objektet låter dig skapa eller läsa textfiler.

Var och en av ovanstående objekt 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 metoden DeleteFolder för mappobjektet. På samma sätt kommer du att använda CopyFile -metoden för filobjektet om du vill kopiera en fil.

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 exemplen som jag har täckt i denna handledning.

Bara för referensändamålet har jag täckt alla FileSystemObject -metoder (för varje objekt) i slutet av denna handledning.

Aktivera FileSystemObject i Excel VBA

FileSystemObject är inte tillgängligt som standard i Excel VBA.

Eftersom vi har att göra med filer och mappar som ligger utanför Excel -programmet 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. Ställa in referensen till Microsoft Scripting Runtime Library (Scrrun.dll)
  2. Skapa ett objekt för att hänvisa till biblioteket från själva koden

Medan båda dessa metoder fungerar (och jag visar dig hur du gör det här nästa), rekommenderar jag att du använder den första metoden.

Obs! När du aktiverar FileSystemObject kan du komma åt alla objekt i den. Detta inkluderar FileSystemObject, Drive, Files, Folders, etc. Jag kommer att fokusera huvudsakligen på FileSystemObject i denna handledning.

Ställa in referensen till Microsoft Scripting Runtime Library

När du skapar en referens till Scripting Runtime Library tillåter du Excel VBA åtkomst till alla egenskaper och metoder för filer och mappar. När detta är gjort kan du hänvisa till filerna/mapparna/enheterna från Excel VBA (precis som du kan hänvisa till celler, kalkylblad eller arbetsböcker).

Nedan följer stegen för att skapa en referens till Microsoft Scripting Runtime Library:

  1. Klicka på Verktyg i VB -redigeraren.
  2. Klicka på Referenser.
  3. I dialogrutan Referenser som öppnas bläddrar du igenom tillgängliga referenser 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 Scripting FileSystemObject -biblioteket måste du skapa en instans av FSO -objektet i din kod.

När detta har skapats kan du använda det i VBA.

Nedan finns koden som ställer in objektvariabeln MyFSO som ett FileSystemObject -objekt:

Sub CreatingFSO () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub

I den här koden har jag först deklarerat variabeln MyFSO som ett FileSystemObject -typobjekt. Detta är endast möjligt eftersom jag har skapat en referens till Microsoft Scripting Runtime Library. Om referensen inte skapas kommer detta att ge dig ett fel (eftersom Excel inte skulle känna igen vad FileSystemObject betyder).

I den andra raden händer två saker:

  1. Det NYA nyckelordet skapar en instans av FileSystemObject. Det betyder 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 kommer du inte att kunna komma åt metoderna för FSO.
  2. SET -nyckelordet ställer in objektet MyFSO till denna nya instans av FileSystemObject. Detta gör att jag kan använda detta objekt för att komma åt 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 ovanstående två påståenden till ett enligt nedan:

Sub CreatingFSO () Dim MyFSO As New FileSystemObject End Sub

En stor fördel med att använda den här metoden (det vill säga att ange 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 (täcks nästa).

Skapa ett objekt från koden

Ett annat sätt att skapa en referens till FSO är genom att göra det från koden. I den här metoden behöver du inte skapa någon referens (som gjorts i den tidigare metoden).

När du skriver koden kan du skapa ett objekt från koden och hänvisa till Scripting.FileSystemObject.

Koden nedan skapar ett objekt FSO och gör sedan detta till en FileSystemObject -typ.

Sub FSODemo () Dim FSO As Object Set FSO = CreateObject ("Scripting.FileSystemObject") End Sub

Även om detta kan verka mer bekvämt, är en stor nackdel med att använda den här metoden att det inte skulle visa en IntelliSense när du arbetar med objekt i FSO. För mig är detta ett enormt negativt och jag rekommenderar alltid att använda den tidigare metoden för att aktivera FSO (vilket är genom att ange referensen till "Microsoft Scripting Runtime")

VBA FileSystemObject Exempel

Låt oss nu dyka in och titta på några praktiska exempel på hur du använder FileSystemObject i Excel.

Exempel 1: Kontrollera om det finns en fil eller mapp

Följande kod kommer att kontrollera om mappen med namnet "Test" finns eller inte (på den angivna platsen).

Om mappen finns är IF -villkoret sant och det visar ett meddelande - "Mappen existerar" i en meddelanderuta. Och om det inte finns, visar det ett meddelande - mappen finns inte ”.

Sub CheckFolderExist () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Då MsgBox "Mappen finns" Annat MsgBox "Mappen existerar inte" Slut om slutet Sub

På samma sätt kan du också kontrollera om det finns en fil 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 FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Då MsgBox "Filen finns" Annars MsgBox "Filen existerar inte "Avsluta om slut Sub

Exempel 2: Skapa en ny mapp på den angivna platsen

Koden nedan skulle skapa en mapp med namnet "Test" i C -enheten i mitt system (du måste ange sökvägen på ditt system där du vill skapa mappen).

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") End Sub

Även om denna kod fungerar bra, skulle det 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 FolderExists -metod från FSO.

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Då MsgBox "Mappen finns redan" Else MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub

Exempel 3: Få en lista över alla filer i en mapp

Koden nedan visar namnen på alla filer i den angivna mappen.

Sub GetFileNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") För varje MyFile i MyFolder.Files Debug.Print MyFile.Name Next MyFile End Sub

Denna kod är lite mer komplex än de vi redan har sett.

Som jag nämnde ovan i den här självstudien, när du refererar till 'Microsoft Scripting Runtime Library', kan du använda FileSystemObject såväl som 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 namnegenskapen för att få listan över alla filnamn.

Observera att jag använder Debug.Print för att få namnen på alla filer. Dessa namn kommer att listas i det omedelbara fönstret i VB Editor.

Exempel 4: Hämta listan över alla undermappar i en mapp

Koden nedan ger namnen på alla undermappar i den angivna mappen. Logiken är exakt densamma som täcks i exemplet ovan. I stället för filer har vi i denna kod använt undermappar.

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") För varje MySubF I MyFolder.SubFolders Debug.Print MySubFolder.Name Nästa MySubFolder End Sub

Exempel 5: Kopiera en fil från ett ställe till ett annat

Koden nedan kommer att kopiera filen från mappen "Source" och kopiera den till "Destination" -mappen.

Sub CopyFile () Dim MyFSO As FileSystemObject Dim SourceFile As String Dim DestinationFolder As String Set MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Source: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

I ovanstående kod har jag använt två variabler - SourceFile och DestinationFolder.

Källfilen innehåller adressen till filen jag vill kopiera och variabeln DestinationFolder håller adressen till den mapp jag vill att filen ska kopieras till.

Observera att det inte räcker med att ange målmappens namn 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 gav den namnet SampleFileCopy.xlsx

Exempel 6: Kopiera alla filer från en mapp till en annan

Koden nedan kommer att kopiera alla filer från källmappen till målmappen.

Sub CopyAllFiles () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) For each MyFile In MyFolder.Files MyFSO.CopyFile Source: = MyFSO.GetFile (MyFile), _ Destination: = DestinationFolder &" \ "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

Ovanstående kod kommer att kopiera alla filer från källmappen till målmappen.

Observera att i MyFSO.CopyFile -metoden har jag angett egenskapen 'Overwritefiles' som falsk (detta är sant 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 detta på True, om det finns filer i målmappen med samma namn, kommer dessa att skrivas över.

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

Om du bara vill kopiera filerna i ett visst tillägg kan du göra det med ett IF Then -uttalande för att kontrollera om tillägget är xlsx eller inte.

Sub CopyExcelFilesOnly () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) For Every MyFile In MyFolder.Files If MyFSO.GetExtensionName (MyFile) =" xlsx "Then MyFSO.CopyFile Source: = MyFSO.Get (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

FileSystemObject (FSO) -metoder

Här är metoderna som du kan använda för varje objekt. Detta är bara för referenssyfte och oroar dig inte för mycket. Användningen av några av dessa har visats i exemplen ovan.

FSO -metoder För Object Beskrivning
DriveExists Kör Kontrollerar om enheten finns eller inte
GetDrive Kör Returnerar en instans av enhetsobjektet baserat på den angivna sökvägen
GetDriveName Kör Kör om enhetsnamnet
BuildPath Filmapp Generera en sökväg från en befintlig sökväg och ett namn
Kopiera fil Filmapp Kopierar en fil
GetAbsolutePathName Filmapp Returnera den kanoniska representationen av vägen
GetBaseName Filmapp Returnera basnamnet från en sökväg. Till exempel returnerar "D: \ TestFolder \ TestFile.xlsm" TextFile.xlsm
GetTempName Filmapp Skapa namn som kan användas för att namnge en tillfällig fil
Kopiera mapp Mapp Kopierar en mapp från en plats till en annan
Skapa mapp Mapp Skapar en ny mapp
Ta bort mapp Mapp Tar bort den angivna mappen
FolderExists Mapp Kontrollerar om mappen finns eller inte
GetFolder Mapp Returnerar en instans av mappobjektet baserat på den angivna sökvägen
GetParentFolderName Mapp Kör namnet på den överordnade mappen baserat på den angivna sökvägen
GetSpecialFolder Mapp Få plats för olika systemmappar.
MoveFolder Mapp Flyttar en mapp från en plats till en annan
Radera fil Fil Tar bort en fil
Fil existerar Fil Kontrollerar om det finns en fil eller inte
GetExtensionName Fil Returnerar filtillägget
Få fil Fil Returnerar förekomsten av ett filobjekt baserat på den angivna sökvägen
GetFileName Fil Returnerar filnamnet
GetFileVersion Fil Returnerar filversionen
MoveFile Fil Flyttar en fil
CreateTextFile Fil Skapar en textfil
GetStandardStream Fil Hämta standard input, output eller error stream
OpenTextFile Fil Öppna en fil som en TextStream

Du kommer att bidra till utvecklingen av webbplatsen, dela sidan med dina vänner

wave wave wave wave wave