- Använda FileSystemObject (FSO) i Excel VBA
- Skapa ett FileSystemObject
- Användning av ”Exists”-metoderna
- Användning av ”Get”-metoderna
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Användning av ’Create’-metoderna
- CreateFolder
- CreateTextFile
- Användning av ’Copy’-metoderna
- CopyFile
- CopyFolder
- Användning av ”Move”-metoderna
- MoveFile
- MoveFolder
- Användning av ’Delete’-metoderna
- DeleteFile
- DeleteFolder
- Andra metoder i FSO
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- FSO:s egenskaper
- Drives
- Name
- Path
- Size
- Type
Använda FileSystemObject (FSO) i Excel VBA
FileSystemObject (FSO) ger dig tillgång till ett stort antal funktioner för att komma åt datorns filsystem. Med hjälp av det här objektet kan du enkelt komma åt filer, mappar och enheter samt läsa och skriva i filer.
Många av FSO-funktionerna skulle kunna skrivas av dig i traditionell VBA, men det skulle kräva mer kodning och skulle vara svårare för en nybliven utvecklare att underhålla och förstå. FSO är ett beprövat och testat API (Application Programming Interface) och är mer tillförlitligt än din egen kod. Det är lätt att använda och klart och tillgängligt.
FSO fungerar enligt internationella standarder och inställningar som du har på din dator. Om du distribuerar ditt Excel-program globalt kommer FSO att ta hand om eventuella skillnader i inställningar mellan länder, vilket din egen kod skulle ha svårt att göra.
FSO gör det möjligt att göra nästan allt i VBA-kod som du kan göra i Windows File Explorer. Det ger dig fullständig tillgång till Windows filsystem.
Skapa ett FileSystemObject
FileSytemObject är inte en del av Excel VBA. Du kan använda FSO genom att skapa ett objekt (sen bindning) i VBA:
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
Alternativt kan du lägga till en referens till FSO-biblioteket i VBA. Detta kallas tidig bindning och är snabbare än sen bindning, eftersom objektet inte behöver skapas när koden körs.
För att lägga till en referens måste du trycka Alt-F11 för att komma in i Visual Basic Editor (VBE) och sedan använda ”Tools|References” från VBE-menyn. Då visas ett popup-fönster där du kan välja relevant referens (se nedan).
Rulla nedåt i listan över tillgängliga referenser tills du ser ”Microsoft Scripting Runtime”. Kryssa i rutan och klicka på OK, och biblioteket är nu en del av din applikation.
Platsen för DLL-biblioteksfilen är C:\Windows\SysWOW64\scrrun.dll
Om du distribuerar ditt program till andra kollegor eller platser är det viktigt att de har den här filen på rätt plats på sin dator, annars kommer koden att bli felaktig.
Det lönar sig att sätta en felfälla på händelsen ”WorkbookOpen” med kommandot Dir för att kontrollera att filen finns. Om den saknas ger du ett varningsmeddelande och stänger Excel-filen.
När referensen har lagts till kan du använda följande kod för att skapa FSO:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Alla exempel i den här artikeln kommer att använda den här metoden för att skapa FSO:
FSO:n har många metoder och egenskaper tillgängliga. Dessa delas här in i avsnitt efter vad de kan göra.
Användning av ”Exists”-metoderna
Du kan använda en FSO-metod för att kontrollera om en enhet, en mapp eller en fil finns. Metoderna är enkla att använda och kräver endast en 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
De här påståendena kommer alla att returnera ”True” under förutsättning att din dator har en C:-enhet, en mapp på den som heter ”Temp” och en fil i Temp-mappen som heter ”testfile.txt”
Textsträngarna i parametrarna är inte skiftlägeskänsliga. Du kan inte använda jokertecken i någon av dessa metoder.
Du kan inte heller använda URL:er (Uniform Resource Locators) för att beskriva en mapp- eller filplacering. FSO fungerar enbart på operativsystemet Windows och dess filsystem. För en extern serverplats måste du först och främst mappa en enhet till denna och sedan använda själva enhetssökvägen.
Användning av ”Get”-metoderna
FSO har många metoder för att få information om filen och sökvägen, antingen genom att dela upp sökvägen och filen eller genom att få information om filen eller mappen, t.ex. datum för skapande eller datum för ändring.
GetAbsolutePathname
Detta ger en fullständig sökväg från roten till den angivna enheten.
Syntaxen är:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
Detta returnerar en sträng ’C:\Users\Richard\Documents’. Detta beror på att sökvägen har angetts som C: följt av tre punkter. Varje punkt betyder nästa nivå i mappstrukturen.
GetBaseName
Detta returnerar namnet på en angiven fil eller mapp.
Syntaxen är:
GetBaseName (path)
Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub
Denna kod kommer att returnera ’testfile’. Metoden returnerar det sista avsnittet i sökvägsnamnet. Om det är en fil returneras inte filsuffixet.
Om sökvägen inte kan hittas returneras en tom sträng.
GetDrive
Detta gör det möjligt att använda kod för att få tillgång till enhetsinformation, baserat på den angivna enhetsbokstaven.
Syntaxen är:
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
Denna metod returnerar ett enhetsobjekt baserat på den angivna enheten. Du kan använda det här objektet för att få tillgång till information om enheten, t.ex. tillgängligt ledigt utrymme.
GetDriveName
Denna metod separerar enhetsnamnet från en sökväg/filnamnssträng.
Syntaxen är:
GetDriveName (path)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
Detta returnerar ’C:’
GetExtensionName
Detta returnerar filsuffixet i den angivna sökvägen.
Syntaxen är:
GetExtensionName (path)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
Detta returnerar ’txt’.
Om ingen fil anges returneras en tom sträng.
GetFile
Denna metod returnerar ett filobjekt som innehåller olika information om själva filen.
Syntaxen är:
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
Detta returnerar datum och tid då den angivna filen skapades. Om ingen fil anges eller om filen inte existerar får du felmeddelandet ”file not found”.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
Detta returnerar ”testfile.txt”.
GetFolder
Detta skapar ett mappobjekt för basmappen i den angivna sökvägen. Sökvägen får endast innehålla mappnamn. Inga filnamn får ingå annars uppstår ett fel.
Syntaxen är:
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
Mappobjektet har olika information i sig som kan nås. I det här fallet returneras datumet då mappen skapades.
Du kan också använda den här metoden för att hämta alla filnamn i en viss mapp:
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
Den här koden kommer att iterera genom mappen ”Temp” och visa varje filnamn som hittas.
GetParentFolderName
Den här metoden kommer att returnera mappnamnet på nästa nivå upp i mapphierarkin.
Syntaxen är:
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
Detta kommer att återge ”Users” eftersom detta är den ”överordnade” för mappen ”richard”.
Användning av ’Create’-metoderna
Med FSO kan du skapa en ny mapp och sökväg och skapa en textfil.
CreateFolder
Du kan ange ett nytt namn på en ny mapp och sökväg som ska skapas. En fara med detta är att om mappen redan finns kommer ett fel att uppstå. Du kan använda metoden ”FolderExists” för att se till att detta inte sker.
Syntaxen är:
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
Denna kod skapar en ny mapp med namnet ”MyFolder” under den befintliga sökvägen ”C:\temp”.
CreateTextFile
Med denna metod kan du skapa en enkel textfil och skriva direkt i den.
Syntaxen är:
CreateTextFile (filnamn, ])
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
Denna kod skapar en textfil med namnet ”Myfile.txt” i mappen ”Temp” på enheten ”C:” och skriver sedan två rader text till den.
Bemärk att ett radmatningstecken sammanfogas i den sträng som skrivs.
Om sökvägen som du skriver till inte finns kommer ett fel att uppstå. Du kan använda metoden ”FolderExists” för att kontrollera detta innan du skapar filen.
Det finns en valfri parameter för att vid behov skriva över den befintliga filen – detta kan vara True eller False. Standardvärdet är True.
Användning av ’Copy’-metoderna
Du kan använda dessa metoder för att kopiera en fil eller en mapp till en annan plats.
CopyFile
Denna metod kopierar en fil från en mappplats till en annan. Observera att kopieringen misslyckas om attributet skrivskydd är inställt på destinationsplatsen.
Syntaxen är:
CopyFile source, destination,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Den här koden gör en kopia av alla textfiler (txt-filer) på ”C:\temp” till ”C:\temp\myfolder\”, och skriver över filen där det behövs. Standardinställningen för Overwrite är True.
Du kan använda en asterisk (*) som jokertecken för filnamnen, men du kan inte använda ett frågetecken (?) som jokertecken för att representera enskilda tecken.
CopyFolder
Du kan använda den här metoden för att kopiera en hel mapp från en plats till en annan.
Syntaxen är:
CopyFolder source, destination,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
Den här koden kopierar alla mappar och filer under ”C:\temp” till ”C:\users\richard”. Den nya mappen som skapas blir ”C:\users\richard\myfolder” eftersom ”C:\temp” hade en mapp som hette ”myfolder”.
Det finns fyra möjliga utfall när man använder den här metoden:
- Om destinationen inte finns kopieras källmappen och dess innehåll.
- Om destinationen redan existerar uppstår ett fel.
- Om destinationen är en mapp kopieras källmappen och dess innehåll. Ett fel uppstår om Overwrite är inställd på False och det redan finns en kopia av en fil i destinationen.
- Om destinationen är inställd på read only uppstår ett fel om Overwrite är inställd på False.
Denna metod stannar vid det första felet som den stöter på. Det sker ingen rollback av åtgärder som har lyckats innan felet inträffar.
Användning av ”Move”-metoderna
De här metoderna kan användas för att flytta filer eller mappar till andra platser. Detta är samma sak som att klippa från en plats och klistra in till en annan plats. Observera att om filen som ska flyttas är öppen kommer Move-metoden att misslyckas med ett fel.
MoveFile
Denna metod används för att flytta en specifik fil till en annan plats. Jokertecken är tillåtna i den sista sökvägskomponenten i källan.
Syntaxen är:
MoveFile source, destination
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
Den här koden flyttar alla filer som finns på ”C:\temp” till ”C:\temp\myfolder”.
Käll- och destinationsmapparna måste finnas, eftersom destinationsmappen inte skapas automatiskt.
Metoden stannar vid det första felet som den stöter på. Det sker ingen rollback av åtgärder som har lyckats innan felet inträffar.
MoveFolder
Denna metod flyttar en specifik mapp från en plats till en annan.
Syntaxen är:
MoveFolder (source, destination)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
Denna kod flyttar mappen ”minmapp” och dess innehåll till mappen ”mydestination”. ’myfolder’ raderas i praktiken och ’mydestination’ skapas tillsammans med innehållet från ’myfolder’.
Om destinationsmappen redan existerar uppstår ett fel.
Användning av ’Delete’-metoderna
De här metoderna används för att radera filer eller mappar. De måste användas med försiktighet eftersom det inte finns någon rollback- eller ångra-metod om något går fel.
DeleteFile
Detta raderar enskilda filer eller en grupp av filer med hjälp av jokertecken.
Syntaxen är:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Denna kod raderar alla filer i mappen ’C:\temp’
Parametern Force är valfri och sätts till True eller False. Om den är inställd på True raderas skrivskyddade filer. Standardvärdet är False.
DeleteFolder
Denna metod raderar en angiven mapp och dess innehåll.
Syntaxen är:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
Denna kod raderar mappen ’MyDestination’ och alla filer i den mappen. Mappen ”temp” kommer att finnas kvar.
Parametern Force är valfri och sätts till True eller False. Om den är inställd på True raderas skrivskyddade mappar. Standardvärdet är False.
Vildtecken kan användas i den sista komponenten i sökvägen. Om mappen inte hittas kommer ett fel att uppstå.
Denna metod stannar vid det första felet som den stöter på. Det sker ingen rollback av åtgärder som har lyckats innan felet inträffar.
Andra metoder i FSO
OpenAsTextStream.
Denna metod öppnar en angiven fil som ett Text Stream-objekt och gör det möjligt att läsa eller skriva till den. Fördelen med denna metod är att den kan öppna vilken filtyp som helst och extrahera den tillgängliga texten.
Syntaxen är:
OpenAsTextStream (])
Parametern ’iomode’ tillåter endast läsning (1), läsning/skrivning (2) och tillägg (8). Parametern read/write skriver över filen.
Parametern ’format’ är inställd på -2 för systemets standardvärde, -1 för att öppna filen som Unicode och 0 för att öppna 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
Denna kod hämtar en befintlig textfil och skapar den som ett objekt med hjälp av metoden ’GetFile’. Den öppnar sedan textströmmen som read / write (2) och skriver en textrad. Filen stängs sedan och öppnas på nytt som read (1) och en rad läses från den, som sedan visas som en meddelanderuta.
Notera att den lästa raden måste placeras i en variabel innan den kan visas i en meddelanderuta.
BuildPath
Denna metod lägger till ett mapp- eller filnamn i slutet av en befintlig mappväg. Detta skapar bara en textsträng och skapar inte den nya mappen.
Syntaxen är:
BuildPath (path, name)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
Detta kommer att visa ”C:\temp\ANewFolder”. Men om du faktiskt vill använda den här mappen måste du använda metoden ”CreateFolder”.
OpenTextFile
Med den här metoden kan filer öppnas och läsas från eller skrivas till enligt inställda parametrar. Den fungerar på samma sätt som metoden OpenAsTextStream.
Syntaxen är:
OpenTextFile (filnamn, ]])
Parametern ’iomode’ tillåter ForReading, ForWriting och ForAppending. Parametern ForWriting skriver över filen.
Parametern ’create’ är ett boolskt värde. True innebär att en ny fil skapas om det angivna filnamnet inte finns. False betyder att ingen fil kommer att skapas om filnamnet inte hittas. Standardvärdet är False.
Parametern ’format’ kan ställas in på TristateFalse, TristateMixed, TristateTrue och TristateUseDefault beroende på om filen är 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
Denna kod läser en rad från textfilen ’myfile.txt’.
En fördel som OpenTextFile-metoden har jämfört med OpenAsTextStreamMethod är att den har rullgardinsmenyer för parametrarna, vilket är mer meningsfullt än att försöka komma ihåg de lämpliga numeriska värdena för de olika parameteralternativen.
FSO:s egenskaper
Drives
Den här egenskapen innehåller en samling av tillgängliga enheter på din dator.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Denna kod returnerar varje enhetsbokstav som är tillgänglig på din dator.
Name
Denna returnerar namnet på en angiven fil eller mapp.
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
Denna kod ger filens namn och information om den med hjälp av egenskapen Drive.
Path
Genom egenskapen Path separeras sökvägen från 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
Det här exemplet fungerar på samma sätt som exemplet Name, förutom att det nu ger sökvägen för filen.
Size
Genom egenskapen Size anges storleken på en mapp eller en fil.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Denna kod ovan ger storleken på mappen ”C:\temp\”.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Denna kod ovan ger storleken på filen ”myfile.txt”.
Type
Typegenskapen returnerar texten för fil- eller mapptypen.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Den här koden ovan returnerar texten ”File folder”.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Den här koden ovan returnerar texten ”Text document”.
Notera användningen av ”GetFolder” och ”GetFile” i varje exempel.