- Używanie obiektu FileSystemObject (FSO) w Excelu VBA
- Tworzenie obiektu FileSystemObject
- Używanie metod „Exists”
- Używanie metod „Uzyskaj”
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Używanie metod 'Create’ Methods
- CreateFolder
- CreateTextFile
- Używanie metod 'Copy’
- CopyFile
- CopyFolder
- Używanie metod 'Move’
- MoveFile
- MoveFolder
- Używanie metod 'Delete’
- DeleteFile
- DeleteFolder
- Inne metody w FSO
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- Właściwości FSO
- Drives
- Name
- Path
- Size
- Type
Używanie obiektu FileSystemObject (FSO) w Excelu VBA
Obiekt FileSystemObject (FSO) daje dostęp do całego szeregu funkcji umożliwiających dostęp do systemu plików komputera. Korzystając z tego obiektu, można łatwo uzyskać dostęp do plików, folderów i napędów, a także odczytywać i zapisywać pliki.
Wiele funkcji FSO można by napisać w tradycyjnym VBA, ale wymagałoby to więcej kodowania i byłoby trudniejsze do utrzymania i zrozumienia dla początkującego programisty. FSO jest wypróbowanym i przetestowanym API (Application Programming Interface) i jest bardziej niezawodny niż Twój własny kod. Jest łatwy w użyciu, gotowy i dostępny.
FSO działa zgodnie z międzynarodowymi standardami i ustawieniami, które macie na swoim komputerze. Jeśli rozprowadzasz swoją aplikację Excel na całym świecie, wtedy użycie FSO zajmie się wszelkimi różnicami w ustawieniach między krajami, z czym Twój własny kod miałby problemy.
FSO pozwoli Ci zrobić prawie wszystko w kodzie VBA, co mógłbyś zrobić w Eksploratorze plików Windows. Daje Ci to pełny dostęp do systemu plików Windows.
Tworzenie obiektu FileSystemObject
Obiekt FileSytemObject nie jest częścią Excel VBA. Z FSO można korzystać, tworząc obiekt (późne wiązanie) w VBA:
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
Alternatywnie można dodać w VBA odwołanie do biblioteki FSO. Nazywa się to wczesnym wiązaniem i jest szybsze niż późne wiązanie, ponieważ obiekt nie musi być tworzony podczas uruchamiania kodu.
Aby dodać referencję, należy nacisnąć Alt-F11, aby wejść do Edytora Visual Basic (VBE), a następnie użyć „Narzędzia|Referencje” z menu VBE. Spowoduje to wyświetlenie wyskakującego okna, w którym należy wybrać odpowiednie odniesienie (patrz poniżej).
Przewiń w dół listę dostępnych odniesień, aż zobaczysz „Microsoft Scripting Runtime”. Zaznacz pole i kliknij OK, a biblioteka jest teraz częścią twojej aplikacji.
Lokalizacja pliku biblioteki DLL to C:\WindowsSysWOW64\scrrun.dll
Jeśli rozprowadzasz swoją aplikację do innych współpracowników lub lokalizacji, ważne jest, aby mieli ten plik we właściwej lokalizacji na swoim komputerze, w przeciwnym razie twój kod będzie błędny.
Warto umieścić pułapkę błędu na zdarzeniu 'WorkbookOpen’ za pomocą polecenia Dir, aby sprawdzić, czy plik istnieje. Jeśli go nie ma, to należy wydać komunikat ostrzegawczy i zamknąć plik Excela.
Po dodaniu odwołania można użyć następującego kodu do utworzenia FSO:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Wszystkie przykłady w tym artykule będą wykorzystywać tę metodologię do utworzenia FSO.
FSO ma wiele dostępnych metod i właściwości. Zostały one tutaj podzielone na sekcje zgodnie z tym, co potrafią robić.
Używanie metod „Exists”
Można użyć metody FSO do sprawdzenia, czy dysk, folder lub plik istnieje. Metody te są łatwe w użyciu i wymagają tylko jednego parametru.
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
Wszystkie te instrukcje zwrócą „True” przy założeniu, że komputer ma dysk C:, folder o nazwie „Temp” i plik w folderze Temp o nazwie „testfile.txt”
W łańcuchach tekstowych w parametrach nie jest rozróżniana wielkość liter. Nie można używać symboli wieloznacznych w żadnej z tych metod.
Nie można także używać adresów URL (Uniform Resource Locators) do opisania lokalizacji folderu lub pliku. FSO działa wyłącznie na systemie operacyjnym Windows i jego systemie plików. W przypadku lokalizacji na serwerze zewnętrznym należy przede wszystkim zmapować dysk, a następnie użyć samej ścieżki dysku.
Używanie metod „Uzyskaj”
FSO ma wiele metod uzyskiwania informacji o pliku i ścieżce, albo dzieląc ścieżkę i plik, albo uzyskując informacje o pliku lub folderze, takie jak data utworzenia lub data modyfikacji.
GetAbsolutePathname
To zapewni pełną ścieżkę od korzenia określonego dysku.
Syntaktyka jest następująca:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
To zwróci ciąg „C:\Użytkownicy\Richard\Documents”. Dzieje się tak, ponieważ ścieżka została określona jako C:, po której następują trzy kropki. Każda kropka oznacza kolejny poziom w strukturze folderów.
GetBaseName
Ta metoda zwraca nazwę określonego pliku lub folderu.
Syntaktyka to:
GetBaseName (ścieżka)
Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub
Ten kod zwróci „testfile”. Metoda zwraca ostatnią sekcję w nazwie ścieżki. Jeśli jest to plik, to nie zwraca przyrostka pliku.
Jeśli ścieżka nie może być znaleziona, to zostanie zwrócony pusty łańcuch.
GetDrive
To pozwala użyć kodu do uzyskania dostępu do informacji o dysku, na podstawie podanej litery dysku.
Syntaktyką jest:
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
Ta metoda zwraca obiekt napędu w oparciu o podany napęd. Możesz użyć tego obiektu, aby uzyskać dostęp do informacji o dysku, takich jak dostępne wolne miejsce.
GetDriveName
Ta metoda wyodrębni nazwę dysku z łańcucha ścieżka / nazwa pliku.
Syntaktyka to:
GetDriveName (ścieżka)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
To zwróci 'C:’
GetExtensionName
To zwróci przyrostek pliku w podanej ścieżce.
Syntaktyką jest:
GetExtensionName (ścieżka)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
To zwróci 'txt’.
Jeśli nie jest określony żaden plik, to zostanie zwrócony pusty łańcuch.
GetFile
Ta metoda zwraca obiekt pliku, który przechowuje różne informacje o samym pliku.
Syntaktyka jest następująca:
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
To zwróci datę i czas utworzenia podanego pliku. Jeśli nie określono pliku lub plik nie istnieje, otrzymasz błąd 'file not found’.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
To zwróci 'testfile.txt’.
GetFolder
To tworzy obiekt folderu dla folderu bazowego w podanej ścieżce. Ścieżka musi zawierać tylko nazwy folderów. W przeciwnym razie wystąpi błąd.
Syntaktyką jest:
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
Obiekt folderu posiada różne informacje, do których można uzyskać dostęp. W tym przypadku zwraca on datę utworzenia folderu.
Możesz również użyć tej metody do pobrania wszystkich nazw plików w obrębie danego folderu:
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
Ten kod wykona iterację przez folder 'Temp’ i wyświetli każdą znalezioną nazwę pliku.
GetParentFolderName
Ta metoda zwróci nazwę folderu na następnym poziomie w hierarchii folderów.
Syntaktyką jest:
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
To zwróci 'Users’, ponieważ jest to 'rodzic’ dla folderu 'richard’.
Używanie metod 'Create’ Methods
Z pomocą FSO można utworzyć nowy folder i ścieżkę oraz utworzyć plik tekstowy.
CreateFolder
Można podać nazwę ścieżki nowego folderu, który ma być utworzony. Niebezpieczeństwo polega na tym, że jeżeli folder już istnieje, to zostanie wyświetlony błąd. Możesz użyć metody 'FolderExists’, aby upewnić się, że tak się nie stanie.
Syntaktyka to:
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
Ten kod utworzy nowy folder o nazwie 'MyFolder’ pod istniejącą ścieżką 'C:™temp’.
CreateTextFile
Ta metoda umożliwia utworzenie prostego pliku tekstowego i zapis bezpośrednio do niego.
Syntaktyka to:
CreateTextFile(filename, ])
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
Ten kod tworzy plik tekstowy o nazwie 'Myfile.txt’ w folderze 'Temp’ dysku 'C:’, a następnie zapisuje do niego dwie linie tekstu.
Zauważ, że znak podawania linii jest konkatenowany z zapisywanym ciągiem znaków.
Jeśli ścieżka, do której piszesz, nie istnieje, wystąpi błąd. Możesz użyć metody 'FolderExists’, aby sprawdzić to przed utworzeniem pliku.
Istnieje opcjonalny parametr, aby nadpisać istniejący plik, jeśli jest to wymagane – może to być True lub False. Domyślnie jest to True.
Używanie metod 'Copy’
Możesz użyć tych metod do skopiowania pliku lub folderu do innej lokalizacji.
CopyFile
Ta metoda skopiuje plik z jednej lokalizacji folderu do innej. Należy pamiętać, że kopiowanie nie powiedzie się, jeśli lokalizacja docelowa ma ustawiony atrybut read-only.
Syntaktyka to:
CopyFile źródło, miejsce docelowe,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Ten kod wykona kopię wszystkich plików tekstowych (txt) w 'C:\temp’ do 'C:\temp\myfolder\’, nadpisując plik tam, gdzie to konieczne. Domyślnym ustawieniem opcji Nadpisz jest Prawda.
Możesz użyć symbolu wieloznacznego gwiazdki (*) w nazwach plików, ale nie możesz użyć symbolu wieloznacznego znaku zapytania (?) do reprezentowania pojedynczych znaków.
CopyFolder
Możesz użyć tej metody do skopiowania całego folderu z jednej lokalizacji do innej.
Syntaktyka jest następująca:
CopyFolder źródło, miejsce docelowe,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
Ten kod kopiuje wszystkie foldery i pliki poniżej 'C:™temp’ do 'C:™usersrichard’. Nowy utworzony folder będzie miał nazwę 'C:usersrichard\myfolder’, ponieważ 'C:\temp’ miał w sobie folder o nazwie 'myfolder’.
Są cztery możliwe wyniki podczas używania tej metody:
- Jeśli miejsce docelowe nie istnieje, wtedy folder źródłowy i zawartość są kopiowane.
- Jeśli miejsce docelowe już istnieje, wystąpi błąd.
- Jeśli miejsce docelowe jest folderem, zostanie skopiowany folder źródłowy i jego zawartość. Błąd wystąpi, jeśli Overwrite jest ustawione na False i istnieje już kopia pliku w miejscu docelowym.
- Jeśli miejsce docelowe jest ustawione tylko do odczytu, błąd wystąpi, jeśli Overwrite jest ustawione na false.
Ta metoda zatrzymuje się przy pierwszym błędzie, który napotka. Nie ma cofnięcia żadnych działań, które zakończyły się sukcesem przed wystąpieniem błędu.
Używanie metod 'Move’
Te metody mogą być używane do przenoszenia plików lub folderów do innych lokalizacji. Jest to to samo, co wycinanie z jednej lokalizacji i wklejanie do innej lokalizacji. Zauważ, że jeśli plik, który ma być przeniesiony jest otwarty, to metoda Move nie powiedzie się z błędem.
MoveFile
Ta metoda jest używana do przeniesienia określonego pliku do innej lokalizacji. Dozwolone są symbole wieloznaczne w ostatnim składniku ścieżki w źródle.
Syntaktyka jest następująca:
MoveFile źródło, miejsce docelowe
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
Ten kod przenosi wszystkie pliki znalezione w 'C:\temp’ do 'C:\temp\myfolder’.
Foldery źródłowy i docelowy muszą istnieć, ponieważ folder docelowy nie jest tworzony automatycznie.
Ta metoda zatrzymuje się przy pierwszym napotkanym błędzie. Nie ma cofnięcia żadnych działań, które powiodły się przed wystąpieniem błędu.
MoveFolder
Ta metoda przenosi określony folder z jednej lokalizacji do innej.
Syntaktyka jest następująca:
MoveFolder (źródło, miejsce docelowe)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
Ten kod przenosi folder 'myfolder’ i jego zawartość do folderu 'mydestination’. 'myfolder’ jest efektywnie usuwany, a 'mydestination’ jest tworzony wraz z zawartością z 'myfolder’.
Jeśli folder docelowy już istnieje, pojawia się błąd.
Używanie metod 'Delete’
Te metody są używane do usuwania plików lub folderów. Muszą być używane z ostrożnością, ponieważ nie ma metod cofania lub cofania, jeśli coś pójdzie źle.
DeleteFile
To usuwa pojedyncze pliki lub grupę plików przy użyciu symboli wieloznacznych.
Syntaktyka to:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Ten kod usunie wszystkie pliki w folderze 'C:™temp’
Parametr Force jest opcjonalny i jest ustawiany na True lub False. Jeśli jest ustawiony na True, to pliki tylko do odczytu zostaną usunięte. Domyślnie jest to False.
DeleteFolder
Ta metoda usuwa określony folder i jego zawartość.
Syntaktyka jest następująca:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
Ten kod usunie folder 'MyDestination’ i wszystkie pliki w tym folderze. Folder 'temp’ pozostanie.
Parametr Force jest opcjonalny i jest ustawiany na True lub False. Jeśli jest ustawiony na True, to foldery tylko do odczytu zostaną usunięte. Domyślnie jest to False.
W ostatnim elemencie ścieżki mogą być użyte znaki wieloznaczne. Jeśli folder nie zostanie znaleziony, to pojawi się błąd.
Ta metoda zatrzymuje się przy pierwszym napotkanym błędzie. Nie ma cofnięcia żadnych działań, które zakończyły się sukcesem przed wystąpieniem błędu.
Inne metody w FSO
OpenAsTextStream.
Ta metoda otwiera określony plik jako obiekt Text Stream i pozwala na jego odczyt lub zapis. Zaletą tej metody jest to, że może ona otworzyć dowolny typ pliku i wyodrębnić dostępny tekst.
Syntaktyka:
OpenAsTextStream (])
Parametr 'iomode’ umożliwia tylko odczyt (1), odczyt/zapis (2) i dołączanie (8). Parametr read/write nadpisuje plik.
Parametr 'format’ jest ustawiony na -2 dla domyślnego systemu, -1 aby otworzyć plik jako Unicode, i 0 aby otworzyć plik jako 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
Kod ten pobiera istniejący plik tekstowy i tworzy go jako obiekt przy użyciu metody 'GetFile’. Następnie otwiera strumień tekstu jako odczyt / zapis (2) i pisze linię tekstu. Plik jest następnie zamykany i ponownie otwierany jako read (1) i odczytywana jest z niego linia, która jest następnie wyświetlana jako okno komunikatu.
Zauważ, że odczytana linia musi być umieszczona w zmiennej, zanim będzie mogła być wyświetlona w oknie komunikatu.
BuildPath
Ta metoda doda nazwę folderu lub pliku do końca istniejącej ścieżki folderu. To tylko tworzy łańcuch tekstowy i nie tworzy nowego folderu.
Syntaktyka jest następująca:
BuildPath (ścieżka, nazwa)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
To spowoduje wyświetlenie 'C:™temp\ANewFolder’. Jeżeli jednak chcesz faktycznie korzystać z tego folderu, musisz użyć metody 'CreateFolder’.
OpenTextFile
Ta metoda pozwala na otwieranie plików i odczytywanie z nich lub zapisywanie do nich według zadanych parametrów. Działa w podobny sposób jak metoda OpenAsTextStream.
Syntaktyka:
OpenTextFile (filename, ]])
Parametr 'iomode’ pozwala na ForReading, ForWriting i ForAppending. Parametr ForWriting powoduje nadpisanie pliku.
Parametr 'create’ jest wartością typu Boolean. True oznacza, że nowy plik zostanie utworzony, jeśli podana nazwa pliku nie istnieje. False oznacza, że żaden plik nie zostanie utworzony, jeśli nazwa pliku nie zostanie znaleziona. Domyślnie jest to False.
Parametr 'format’ może być ustawiony na TristateFalse, TristateMixed, TristateTrue i TristateUseDefault w zależności od tego, czy plik jest ASCII czy Unicode.
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Ten kod odczyta linię z pliku tekstowego 'myfile.txt’.
Przewagą metody OpenTextFile nad OpenAsTextStreamMethod jest to, że posiada ona rozwijane listy parametrów, które są bardziej znaczące niż próba zapamiętania odpowiednich wartości liczbowych dla różnych opcji parametrów.
Właściwości FSO
Drives
Ta właściwość przechowuje kolekcję dostępnych napędów na komputerze.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Ten kod zwróci każdą literę dysku dostępną na komputerze.
Name
Ta właściwość zwraca nazwę określonego pliku lub folderu.
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
Ten kod poda nazwę pliku i informacje o nim przy użyciu właściwości Drive.
Path
Właściwość Path wyodrębni ścieżkę od specyfikacji pliku.
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
Ten przykład działa w taki sam sposób jak przykład Name, z tym że teraz podaje ścieżkę do pliku.
Size
Właściwość Size poda rozmiar folderu lub pliku.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Ten kod powyżej zwróci rozmiar folderu 'C:\temp\’.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Ten kod powyżej zwróci rozmiar pliku 'myfile.txt’.
Type
Właściwość type zwróci tekst dla typu pliku lub folderu.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Ten kod powyżej zwróci tekst 'Plik folder’.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Ten kod powyżej zwróci tekst 'Dokument tekstowy’.
Zauważ użycie 'GetFolder’ i 'GetFile’ w każdym z przykładów.
.