Wie kann ich mit VBA:
- Testen Sie, ob eine Datei vorhanden ist, und wenn ja,
- Lösche es?
Wie kann ich mit VBA:
1.) Überprüfen Sie hier . Grundsätzlich tun Sie dies:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Ich überlasse es Ihnen, die verschiedenen erforderlichen Fehlerbehandlungen herauszufinden, aber diese gehören zu den Fehlern, die ich in Betracht ziehen würde:
2.) So löschen Sie eine Datei. Schau dir das an . Verwenden Sie grundsätzlich den Befehl Kill, aber Sie müssen die Möglichkeit berücksichtigen, dass eine Datei schreibgeschützt ist. Hier ist eine Funktion für Sie:
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
Wieder überlasse ich die Fehlerbehandlung Ihnen und wieder sind dies die Dinge, die ich berücksichtigen würde:
Sollte sich dies für ein Verzeichnis anders verhalten als für eine Datei? Sollte ein Benutzer explizit angeben müssen, dass er ein Verzeichnis löschen möchte?
Möchten Sie, dass der Code das schreibgeschützte Attribut automatisch zurücksetzt, oder sollte dem Benutzer eine Art Hinweis gegeben werden, dass das schreibgeschützte Attribut festgelegt ist?
BEARBEITEN: Markieren Sie diese Antwort als Community-Wiki, damit jeder sie bei Bedarf ändern kann.
Eine alternative Möglichkeit, Brettskis Antwort zu codieren, der ich ansonsten völlig zustimme, könnte sein
Gleicher Effekt, aber weniger (naja, überhaupt keine) Variablendeklarationen.
Das FileSystemObject ist ein wirklich nützliches Tool und es lohnt sich, sich damit vertraut zu machen. Abgesehen von allem anderen kann das Schreiben von Textdateien manchmal sogar schneller sein als die herkömmliche Alternative, was einige Leute überraschen kann. (Zumindest nach meiner Erfahrung YMMV).
quelle
Ich werde wahrscheinlich dafür in Flammen stehen, aber was bringt es, auf Existenz zu testen, wenn Sie es einfach löschen wollen? Eine meiner größten Herausforderungen ist eine App, die einen Fehlerdialog mit dem Titel "Datei konnte nicht gelöscht werden, existiert nicht!" Auslöst.
Wenn die Datei überhaupt nicht existiert, ist die Mission erfüllt!
quelle
ActiveWorkbook.SaveCopyAs
nicht überschreiben, sodass Sie zuerst eine vorhandene Datei mit demselben Dateinamen entfernen müssen.On Error Resume Next
, oder so wurde mir gesagt: D Natürlich ist das ein lächerlicher Rat, und deine Antwort ist richtig.Len(dir(...))
Teil ist nicht NUR auf Existenz zu prüfen. Es wird auch überprüft, ob die Datei VERSTECKT ist, da eine versteckte Datei eine leere Zeichenfolge zurückgibt, selbst wenn sie vorhanden ist (und Sie sie nicht löschen können) :Dir(hiddenFile) = ""
. DaherSetAttr FileToDelete, vbNormal
kümmert sich der Teil eloquent darum für Sie.Das Folgende kann verwendet werden, um die Existenz einer Datei zu testen und sie dann zu löschen.
quelle
Len()
(undLenB()
, was noch schneller ist) schneller als der Zeichenfolgenvergleich sind, ist, dass im Speicher VB-Zeichenfolgen ihre Länge vorangestellt ist. Len / LenB ziehen nur die Länge von diesem Speicherort, sie müssen nicht durch die Zeichenfolge iterieren, um ihre Länge zu kennen. Auf der anderen Seite hat die Verwendung des Zeichenfolgenvergleichs viel mehr Arbeit zu erledigen. Vermeiden Sie außerdem die Verwendung""
in VB, da immer eine neue Zeichenfolge zugewiesen wird. Verwenden SievbNullString
stattdessen, da es sich um eine Konstante handelt und nicht mehr Speicher benötigt.In VB ist es normalerweise
Dir
, das Verzeichnis der Datei zu finden. Wenn es nicht leer ist, existiert es und wird verwendetKill
, um die Datei zu entfernen.quelle
Legen Sie einen Verweis auf die Scripting.Runtime-Bibliothek fest und verwenden Sie dann das FileSystemObject:
quelle
Hier ist ein Tipp: Verwenden Sie den Dateinamen erneut oder planen Sie etwas, das sofort gelöscht werden muss?
Nein?
Sie können VBA veranlassen, den Befehl DEL "C: \ TEMP \ Scratchpad.txt" / F asynchron an der Eingabeaufforderung auszulösen mit VBA.Shell auszulösen:
Shell "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide
Beachten Sie die doppelten Anführungszeichen (ASCII-Zeichen 34) um den Dateinamen: Ich gehe davon aus, dass Sie einen Netzwerkpfad oder einen langen Dateinamen mit Leerzeichen haben.
Wenn es sich um eine große Datei handelt oder eine langsame Netzwerkverbindung besteht, ist Fire-and-Forget der richtige Weg. Natürlich kann man nie sehen, ob dies funktioniert hat oder nicht. Sie setzen Ihren VBA jedoch sofort fort, und manchmal ist dies besser, als auf das Netzwerk zu warten.
quelle
Sie können einen Verweis auf die Scripting.Runtime-Bibliothek festlegen und dann das FileSystemObject verwenden. Es verfügt über eine DeleteFile-Methode und eine FileExists-Methode.
Siehe den MSDN-Artikel hier .
quelle