Używając VBA, jak mogę:
- sprawdzić, czy plik istnieje, a jeśli tak,
- Usuń to?
Używając VBA, jak mogę:
1.) Sprawdź tutaj . Zasadniczo zrób to:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Zostawię ci ustalenie różnych potrzebnych do obsługi błędów, ale są to jedne z rzeczy, które rozważałem:
2.) Jak usunąć plik. Popatrz na to. Zasadniczo użyj polecenia Kill, ale musisz uwzględnić możliwość, że plik jest tylko do odczytu. Oto funkcja dla Ciebie:
Sub DeleteFile(ByVal FileToDelete As String)
If FileExists(FileToDelete) Then 'See above
' First remove readonly attribute, if set
SetAttr FileToDelete, vbNormal
' Then delete the file
Kill FileToDelete
End If
End Sub
Ponownie pozostawię obsługę błędów Tobie i ponownie rozważę następujące kwestie:
Czy powinno to zachowywać się inaczej w przypadku katalogu niż pliku? Czy użytkownik powinien wyraźnie wskazać, że chce usunąć katalog?
Czy chcesz, aby kod automatycznie resetował atrybut tylko do odczytu, czy też użytkownik powinien otrzymać jakąś wskazówkę, że ustawiono atrybut tylko do odczytu?
EDYCJA: Oznacz tę odpowiedź jako wiki społeczności, aby każdy mógł ją zmodyfikować, jeśli zajdzie taka potrzeba.
Alternatywnym sposobem zakodowania odpowiedzi Brettskiego, z którym w przeciwnym razie całkowicie się zgadzam, może być
Ten sam efekt, ale mniej (no cóż, żadnych) deklaracji zmiennych.
FileSystemObject to naprawdę przydatne narzędzie, z którym warto się zaprzyjaźnić. Poza wszystkim innym, zapisywanie plików tekstowych może czasami być szybsze niż starsza alternatywa, co może zaskoczyć kilka osób. (Przynajmniej z mojego doświadczenia, YMMV).
źródło
Prawdopodobnie zostanę za to podpalony, ale jaki jest sens testowania istnienia, jeśli zamierzasz go usunąć? Jednym z moich głównych irytujących zwierząt jest aplikacja wyświetlająca okno dialogowe błędu z komunikatem „Nie można usunąć pliku, nie istnieje!”
Jeśli plik nie istnieje w pierwszej kolejności, misja zakończona!
źródło
ActiveWorkbook.SaveCopyAs
nie jest w stanie nadpisać, więc najpierw musisz usunąć istniejący plik o tej samej nazwie.On Error Resume Next
, a przynajmniej tak mi powiedziano: D Oczywiście to absurdalna rada, a twoja odpowiedź jest poprawna.Len(dir(...))
Część nie jest wyłącznie w celu sprawdzenia istnienia. To jest również sprawdzenie, czy plik jest ukryty , ponieważ ukryty plik zwróci pusty ciąg nawet jeśli istnieje (i nie będzie w stanie go usunąć)Dir(hiddenFile) = ""
. Dlatego częśćSetAttr FileToDelete, vbNormal
elokwentnie zajmuje się tym za Ciebie.Aby sprawdzić, czy plik istnieje, a następnie go usunąć, można użyć poniższych instrukcji.
źródło
Len()
(iLenB()
, co jest jeszcze szybsze) są szybsze niż porównywanie ciągów, jest to, że w pamięci ciągi VB są poprzedzone ich długością. Len / LenB po prostu pobierają długość z tego miejsca w pamięci, nie muszą iterować ciągu, aby poznać jego długość. Z drugiej strony, użycie porównania ciągów wymaga znacznie więcej pracy. Ponadto unikaj używania""
w VB, ponieważ zawsze przydziela nowy ciąg. UżyjvbNullString
zamiast tego, ponieważ jest to stała i nie zużywa więcej pamięci.W VB normalnie
Dir
znajduje się katalog pliku. Jeśli nie jest puste, to istnieje, a następnie użyj,Kill
aby pozbyć się pliku.źródło
ustaw odniesienie do biblioteki Scripting.Runtime, a następnie użyj FileSystemObject:
źródło
Oto wskazówka: czy ponownie używasz nazwy pliku, czy planujesz zrobić coś, co wymaga natychmiastowego usunięcia?
Nie?
Możesz sprawić, aby VBA uruchamiał polecenie DEL "C: \ TEMP \ scratchpad.txt" / F z wiersza poleceń asynchronicznie za pomocą VBA.Shell:
Shell „DEL” & chr (34) & strPath & chr (34) & „/ F”, vbHide
Zwróć uwagę na podwójne cudzysłowy (znak ASCII 34) wokół nazwy pliku: Zakładam, że masz ścieżkę sieciową lub długą nazwę pliku zawierającą spacje.
Jeśli jest to duży plik lub ma wolne połączenie sieciowe, opuść i zapomnij. Oczywiście nigdy nie zobaczysz, czy to zadziałało, czy nie; ale natychmiast wznawiasz VBA i są chwile, kiedy jest to lepsze niż czekanie na sieć.
źródło
Można ustawić odwołanie do biblioteki Scripting.Runtime, a następnie użyć obiektu FileSystemObject. Ma metodę DeleteFile i metodę FileExists.
Zobacz artykuł MSDN tutaj .
źródło