Czasami chcemy sprawdzić, czy plik istnieje. Może to być przydatne gdy chcemy dany plik skopiować, skasować albo dodać jako załącznik do maila. Próba odwołania się do nieistniejącego pliku może wygenerować błąd. Dlatego warto jest przed dokonaniem próby wykonania jakiejś operacji na pliku sprawdzić, czy on istnieje.
Można skorzystać z sztuczki z funkcją Dir, ale ona sobie nie zawsze zwraca poprawny wynik w przypadku plików lub folderów na dysku sieciowym. Dlatego osobiście preferuję skorzystać z obiektu FileSystemObject. Aby móc z niego skorzystać należy do projektu dołączyć bibliotekę Microsoft Scripting Runtime do projektu VBA. W tym celu w edytorze VBA należy z menu Tools wybrać polecenie References.
Pojawi się okno dialogowe References – VBAProject. Należy odszukać bibliotekę Microsoft Scripting Runtime i ją „zaptaszkować” a następnie kliknąć w przycisk OK.
Następnie w edytorze VBA wklej taki oto kod:
Function isFileExists(File As String) As Boolean
Dim fso As FileSystemObject
Set fso = New FileSystemObject
isFileExists = fso.FileExists(File)
Set fso = Nothing
End Function
Function isFolderExists(Folder As String) As Boolean
Dim fso As FileSystemObject
Set fso = New FileSystemObject
isFolderExists = fso.FolderExists(Folder)
Set fso = Nothing
End Function
Sub Testy()
Debug.Print "Plik na dysku: ", isFileExists("c:\temp\plik.txt")
Debug.Print "Plik na dysku sieciowym: ", isFileExists("\\janek\temp\plik.xlsx")
Debug.Print "Folder na dysku: ", isFolderExists("c:\windows")
Debug.Print "Folder na dysku sieciowym: ", isFolderExists("\\janek\temp\raporty")
End Sub
Zdefiniowałem tutaj dwie bliźniacze funkcje o nazwach isFileExists oraz isFolderExists, które zwracają wartość True gdy plik (lub folder) istnieje lub False, gdy plik (lub folder) nie istnieje. Procedura o nazwie Testy służy do przetestowania tych dwóch nowych funkcji (podmień nazwy plików/folderów na takie jakie u Ciebie na komputerze istnieją a następnie sprawdź czy zostanie zwrócona wartość True. Następnie zrób jakąś literówkę w nazwie pliku, aby sprawdzić czy zostanie zwrócona wartość False).