Kiedy używamy VBA w Excelu, większość z nich służy do automatyzacji naszych zadań.
To również oznacza, że przez większość czasu pracujemy z komórkami i zakresami, arkuszami, skoroszytami i innymi obiektami, które są częścią aplikacji Excel.
Ale VBA jest o wiele bardziej potężne i może być również używane do pracy z rzeczami spoza Excela.
W tym samouczku pokażę, jak używać VBA FileSystemObject (FSO) do pracy z plikami i folderami w systemie lub na dyskach sieciowych.
Ten samouczek obejmuje:
Czym jest VBA FileSystemObject (FSO)?
FileSystemObject (FSO) pozwala na dostęp do systemu plików komputera. Za jego pomocą można uzyskać dostęp i modyfikować pliki/foldery/katalogi w systemie komputerowym.
Na przykład poniżej przedstawiono niektóre z rzeczy, które można zrobić za pomocą FileSystemObject w Excelu VBA:
- Sprawdź, czy plik lub folder istnieje.
- Twórz lub zmień nazwę folderów/plików.
- Uzyskaj listę wszystkich nazw plików (lub nazw podfolderów) w folderze.
- Kopiowanie plików z jednego folderu do drugiego.
Mam nadzieję, że załapałeś o co chodzi.
Wszystkie powyższe przykłady (plus więcej) omówię w dalszej części tego poradnika.
Pomimo, że niektóre z wyżej wymienionych rzeczy mogą być również wykonane przy użyciu tradycyjnych funkcji VBA (takich jak funkcja DIR) i metod, doprowadziłoby to do dłuższych i bardziej skomplikowanych kodów. FileSystemObject ułatwia pracę z plikami i folderami przy jednoczesnym zachowaniu czystego i krótkiego kodu.
Note: FSO can only be used in Excel 2000 and later versions.
Do jakich wszystkich obiektów można uzyskać dostęp poprzez FileSystemObject?
Jak wspomniałem powyżej, można uzyskać dostęp i modyfikować pliki i foldery za pomocą FileSystemObject w VBA.
Poniżej znajduje się tabela, która pokazuje najważniejsze obiekty, do których można uzyskać dostęp i modyfikować za pomocą FSO:
Object | Description |
Drive | ObiektDrive pozwala uzyskać informacje o dysku, takie jak czy istnieje, czy nie, nazwa ścieżki, typ dysku (wymienny lub stały), jego rozmiar, itp. |
Folder | Obiekt Folder pozwala na tworzenie lub modyfikację folderów w systemie. Na przykład, można tworzyć, usuwać, zmieniać nazwy, kopiować foldery za pomocą tego obiektu. |
File | ObiektFile pozwala na pracę z plikami w systemie. Na przykład, można tworzyć, otwierać, kopiować, przenosić i usuwać pliki za pomocą tego obiektu. |
TextStream | Obiekt TextStream pozwala na tworzenie lub odczytywanie plików tekstowych. |
Każdy z powyższych obiektów posiada metody, których możesz użyć do pracy z nimi.
Podając przykład, jeśli chcesz usunąć folder, użyjesz metody DeleteFolder obiektu Folder. Podobnie, jeśli chcesz skopiować plik, użyjesz metody CopyFile obiektu File.
Nie martw się, jeśli wydaje się to przytłaczające lub trudne do zrozumienia. Zrozumiesz to znacznie lepiej, gdy przejdziesz przez przykłady, które omówiłem w tym samouczku.
Tylko dla celów referencyjnych, omówiłem wszystkie metody FileSystemObject (dla każdego obiektu) na końcu tego samouczka.
Włączanie FileSystemObject w Excelu VBA
FileSystemObject nie jest domyślnie dostępny w Excelu VBA.
Ponieważ mamy do czynienia z plikami i folderami znajdującymi się poza aplikacją Excel, musimy najpierw utworzyć odwołanie do biblioteki przechowującej te obiekty (dyski, pliki, foldery).
Teraz możesz zacząć używać FileSystemObject w Excelu VBA na dwa sposoby:
- Ustawienie odwołania do biblioteki Microsoft Scripting Runtime Library (Scrrun.dll)
- Tworzenie obiektu odwołującego się do biblioteki z poziomu samego kodu
Chociaż obie te metody działają (i pokażę, jak to zrobić w następnej kolejności), zalecam korzystanie z pierwszej metody.
Ustawianie odniesienia do biblioteki Microsoft Scripting Runtime Library
Gdy tworzysz odniesienie do biblioteki Scripting Runtime Library, umożliwiasz programowi Excel VBA dostęp do wszystkich właściwości i metod plików i folderów. Po wykonaniu tych czynności można odwoływać się do obiektów plików/folderów/dysków z poziomu programu Excel VBA (podobnie jak do komórek, arkuszy czy skoroszytów).
Poniżej przedstawiono kroki, które należy wykonać, aby utworzyć odwołanie do biblioteki Microsoft Scripting Runtime Library:
- W edytorze VB kliknij przycisk Narzędzia.
- Kliknij Odwołania.
- W otwartym oknie dialogowym Odwołania przewiń dostępne odwołania i zaznacz opcję „Microsoft Scripting Runtime”.
- Kliknij OK.
Powyższe kroki umożliwią teraz odwoływanie się do obiektów FSO z poziomu programu Excel VBA.
Tworzenie instancji obiektu FileSystemObject w kodzie
Po ustawieniu odwołania do biblioteki Scripting FileSystemObject należy utworzyć instancję obiektu FSO w kodzie.
Po utworzeniu tego obiektu można go używać w VBA.
Poniżej znajduje się kod, który ustawi zmienną obiektową MyFSO jako obiekt typu FileSystemObject:
Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub
W tym kodzie najpierw zadeklarowałem zmienną MyFSO jako obiekt typu FileSystemObject. Jest to możliwe tylko dlatego, że utworzyłem referencję do biblioteki Microsoft Scripting Runtime Library. Jeśli referencja nie zostanie utworzona, spowoduje to błąd (ponieważ Excel nie rozpozna, co oznacza FileSystemObject).
W drugiej linii dzieją się dwie rzeczy:
- Słowo kluczowe NEW tworzy instancję obiektu FileSystemObject. Oznacza to, że teraz mogę używać wszystkich metod FileSystemObject do pracy z plikami i folderami. Jeśli nie utworzysz tej instancji, nie będziesz miał dostępu do metod FSO.
- Słowo kluczowe SET ustawia obiekt MyFSO na tę nową instancję FileSystemObject. Dzięki temu będę mógł używać tego obiektu do dostępu do plików i folderów. Na przykład, jeśli potrzebuję utworzyć folder, mogę użyć metody MyFSO.CreateFolder.
Jeśli chcesz, możesz również połączyć powyższe dwa stwierdzenia w jedno, jak pokazano poniżej:
Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Dużą korzyścią z użycia tej metody (która polega na ustawieniu odniesienia do biblioteki Microsoft Scripting Runtime Library) jest to, że kiedy używasz obiektów FSO w swoim kodzie, będziesz mógł korzystać z funkcji IntelliSense, która pokazuje metody i właściwości związane z obiektem (jak pokazano poniżej).
Nie jest to możliwe w przypadku tworzenia referencji z kodu (omówione dalej).
Tworzenie obiektu z kodu
Innym sposobem tworzenia referencji do FSO jest tworzenie jej z kodu. W tej metodzie nie trzeba tworzyć żadnej referencji (tak jak w poprzedniej metodzie).
Podczas pisania kodu można utworzyć obiekt z poziomu kodu i odwołać się do Scripting.FileSystemObject.
Poniższy kod tworzy obiekt FSO, a następnie czyni go typem FileSystemObject.
Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub
Chociaż może się to wydawać wygodniejsze, dużym minusem używania tej metody jest to, że nie pokaże IntelliSense podczas pracy z obiektami w FSO. Dla mnie jest to ogromny minus i zawsze zalecam używanie poprzedniej metody włączania FSO (która polega na ustawieniu odniesienia do „Microsoft Scripting Runtime”)
VBA FileSystemObject Przykłady
Teraz zanurzmy się i spójrzmy na kilka praktycznych przykładów użycia FileSystemObject w Excelu.
Przykład 1: Sprawdź, czy istnieje plik lub folder
Następujący kod sprawdzi, czy folder o nazwie „Test” istnieje, czy nie (w określonej lokalizacji).
Jeśli folder istnieje, warunek JEŻELI jest PRAWDZIWY i pokazuje komunikat – „Folder istnieje” w oknie komunikatu. A jeśli nie istnieje, pokazuje komunikat – 'Folder nie istnieje’.
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
Podobnie, można również sprawdzić, czy plik istnieje, czy nie.
Poniższy kod sprawdza, czy istnieje plik o nazwie Test.xlsx w podanym folderze, czy nie.
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
Przykład 2: Utwórz nowy folder w określonej lokalizacji
Poniższy kod utworzyłby folder o nazwie 'Test’ na dysku C mojego systemu (musisz określić ścieżkę w swoim systemie, gdzie chcesz utworzyć folder).
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub
Pomimo że ten kod działa dobrze, wyświetliłby błąd w przypadku, gdy folder już istnieje.
Poniższy kod sprawdza, czy folder już istnieje i tworzy folder, jeśli nie. W przypadku, gdy folder już istnieje, pokazuje komunikat. Do sprawdzenia, czy folder istnieje, użyłem metody FolderExists z FSO.
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
Przykład 3: Get a List of All Files in a Folder
Poniższy kod wyświetliłby nazwy wszystkich plików w podanym folderze.
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
Ten kod jest nieco bardziej złożony niż te, które już widzieliśmy.
Jak wspomniałem powyżej w tym tutorialu, kiedy odwołujesz się do 'Microsoft Scripting Runtime Library’, możesz używać FileSystemObject, jak również wszystkich innych obiektów (takich jak Pliki i Foldery).
W powyższym kodzie, używam trzech obiektów – FileSystemObject, File i Folder. To pozwala mi przejść przez każdy plik w określonym folderze. Następnie używam właściwości name, aby uzyskać listę wszystkich nazw plików.
Zauważ, że używam Debug.Print, aby uzyskać nazwy wszystkich plików. Nazwy te zostaną wyświetlone w oknie natychmiastowym w Edytorze VB.
Przykład 4: Uzyskaj listę wszystkich podfolderów w folderze
Poniższy kod poda nazwy wszystkich podfolderów w określonym folderze. Logika jest dokładnie taka sama jak w powyższym przykładzie. Zamiast plików, w tym kodzie użyliśmy podfolderów.
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
Przykład 5: Kopiowanie pliku z jednego miejsca do drugiego
Poniższy kod skopiuje plik z folderu 'Source’ i skopiuje go do folderu '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
W powyższym kodzie użyłem dwóch zmiennych – SourceFile i DestinationFolder.
Source File przechowuje adres pliku, który chcę skopiować, a zmienna DestinationFolder przechowuje adres folderu, do którego chcę, aby plik został skopiowany.
Zauważ, że nie wystarczy podać nazwę folderu docelowego, gdy kopiujesz plik. Musisz również określić nazwę pliku. Możesz użyć tej samej nazwy pliku lub możesz ją zmienić. W powyższym przykładzie, skopiowałem plik i nazwałem go SampleFileCopy.xlsx
Przykład 6: Kopiowanie wszystkich plików z jednego folderu do drugiego
Poniższy kod skopiuje wszystkie pliki z folderu źródłowego do folderu docelowego.
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
Poniższy kod skopiuje wszystkie pliki z folderu Source do folderu Destination Folder.
Zauważ, że w metodzie MyFSO.CopyFile, określiłem właściwość 'Overwritefiles’ na False (domyślnie jest to True). To daje pewność, że w przypadku gdy masz już ten plik w folderze, nie zostanie on skopiowany (i zobaczysz błąd). Jeśli usuniesz 'Overwritefiles’ lub ustawisz to na True, w przypadku, gdy w folderze docelowym znajdują się pliki o tej samej nazwie, zostaną one nadpisane.
Jeśli chcesz skopiować tylko pliki o określonym rozszerzeniu, możesz to zrobić za pomocą instrukcji IF Then, aby sprawdzić, czy rozszerzenie jest xlsx lub nie.
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) Methods
Tutaj są metody, których możesz użyć dla każdego obiektu. To jest tylko dla celów referencyjnych i nie przejmuj się tym za bardzo. Użycie niektórych z nich zostało pokazane w przykładach omówionych powyżej.
FSO Methods | For Object | Description | |||
DriveExists | Drive | Sprawdza czy dysk istnieje czy nie | |||
GetDrive | Drive | Zwraca instancję obiektu napędu na podstawie podanej ścieżki | |||
GetDriveName | Drive | Wyszukuje nazwę napędu | |||
GetAbsolutePathName | File/Folder | Wraca kanoniczną reprezentację ścieżki | |||
GetBaseName | File/Folder | Wraca nazwę bazową ze ścieżki. Na przykład, „D:\TestFolder\TestFile.xlsm” zwróci TextFile.xlsm | |||
GetTempName | File/Folder | Generuje nazwę, która może być użyta do nazwania pliku tymczasowego | |||
CopyFolder | Folder | Kopiuje folder z jednej lokalizacji do innej innego | |||
CreateFolder | Folder | Tworzy nowy folder | |||
DeleteFolder | Folder | Usuwa określony folder | |||
FolderExists | Folder | Sprawdza, czy folder istnieje, czy nie | |||
GetFolder | Folder | Zwraca instancję obiektu folderu na podstawie podanej ścieżki | |||
GetParentFolderName | Folder | Wywołuje nazwę folderu nadrzędnego na podstawie określonej ścieżki | |||
GetSpecialFolder | Folder | Poznaj lokalizację różnych folderów systemowych. | |||
MoveFolder | Folder | Przenosi folder z jednej lokalizacji do innej | |||
DeleteFile | File | Usuwa plik | |||
FileExists | File | Sprawdza, czy plik istnieje, czy nie | |||
GetExtensionName | File | Zwraca rozszerzenie pliku | |||
GetFile | File | Zwraca instancję obiektu file | MoveFile | File | Przesuwa plik |
CreateTextFile | File | Tworzy plik tekstowy | |||
GetStandardStream | File | Pobiera standardowe wejście, wyjściowego lub strumienia błędów | |||
OpenTextFile | Plik | Otwórz plik jako TextStream |
You May Also Like the Following Excel Tutorials:
- Get a List of File Names from Folders & Sub-folders (using Power Query).
- Uzyskaj listę nazw plików z folderu w Excelu (z i bez VBA).
- Zrozumienie typów danych Excel VBA (zmienne i stałe).
- Tworzenie funkcji zdefiniowanej przez użytkownika (UDF) w Excelu VBA.
.