Użycie VBA FileSystemObject (FSO) w Excelu – Łatwy przegląd i przykłady

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:

  1. Ustawienie odwołania do biblioteki Microsoft Scripting Runtime Library (Scrrun.dll)
  2. 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.

Uwaga: Po włączeniu funkcji FileSystemObject można uzyskać dostęp do wszystkich znajdujących się w niej obiektów. Obejmuje to FileSystemObject, Drive, Files, Folders, itp. W tym poradniku skupię się głównie na obiekcie FileSystemObject.

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:

  1. W edytorze VB kliknij przycisk Narzędzia.
  2. Kliknij Odwołania.
  3. W otwartym oknie dialogowym Odwołania przewiń dostępne odwołania i zaznacz opcję „Microsoft Scripting Runtime”.
  4. 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:

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

Pro Tip: Podczas kopiowania plików zawsze istnieje prawdopodobieństwo nadpisania plików. Dobrym pomysłem w tym przypadku jest dodanie znacznika czasu wraz z nazwą. Zapewni to, że nazwy są zawsze różne i można łatwo śledzić, które pliki zostały skopiowane w jakim czasie.

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.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.