回答:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
必要なさまざまなエラー処理を理解するのはあなたにお任せしますが、これらは私が検討しているエラー処理の一部です。
2.)ファイルを削除する方法。これ見て 基本的にはKillコマンドを使用しますが、ファイルが読み取り専用になる可能性を考慮する必要があります。ここにあなたのための関数があります:
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
繰り返しますが、エラー処理はあなたにお任せします。これらは私が検討することです。
これは、ディレクトリとファイルでは異なる動作をする必要がありますか?ユーザーは、ディレクトリを削除することを明示的に示す必要がありますか?
コードで読み取り専用属性を自動的にリセットしますか、または読み取り専用属性が設定されていることをユーザーに何らかの指示を与えますか?
編集:この回答をコミュニティWikiとしてマークすると、必要に応じて誰でも修正できます。
私が別の方法で完全に同意するBrettskiの答えをコード化する別の方法は、
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
効果は同じですが、変数宣言が少ない(まあ、まったくない)。
FileSystemObjectは本当に便利なツールであり、親しみやすい価値があります。他のものとは別に、テキストファイルの書き込みの場合、実際には従来の代替手段よりも高速な場合があり、一部の人々を驚かせる可能性があります。(少なくとも私の経験では、YMMV)。
たぶんこれに怒るでしょうが、それを削除するだけの場合、存在をテストするポイントは何ですか?私の主な不快感の1つは、「ファイルを削除できませんでした。存在しません!」のようなエラーダイアログをスローするアプリです。
On Error Resume Next
aFile = "c:\file_to_delete.txt"
Kill aFile
On Error Goto 0
return Len(Dir$(aFile)) > 0 ' Make sure it actually got deleted.
そもそもファイルが存在しなければミッション達成!
ActiveWorkbook.SaveCopyAs
すると上書きできません。そのため、最初に同じファイル名の既存のファイルを削除する必要があります。
On Error Resume Next
ので、私は言われました:Dもちろん、それはとんでもないアドバイスであり、あなたの答えは正しいです。
Len(dir(...))
存在を確認するためだけのパーツではありません。また、隠しファイルは存在しても空の文字列を返すため、ファイルがHIDDENであるかどうかもチェックします(削除することはできません)Dir(hiddenFile) = ""
。したがって、この部分はSetAttr FileToDelete, vbNormal
雄弁にこれを処理します。
以下は、ファイルの存在をテストしてから削除するために使用できます。
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(とLenB()
より高速な文字列の比較よりもあるが、さらに高速である)メモリに、VBの文字列はその長さが先行しているということです。Len / LenBはそのメモリ位置から長さを引き出すだけで、長さを知るために文字列を反復処理する必要はありません。一方、文字列比較を使用すると、実行する作業がはるかに多くなります。また、""
常に新しい文字列を割り当てるため、VBでの使用は避けてください。vbNullString
定数であり、より多くのメモリを使用しないため、代わりに使用してください。
Scripting.Runtimeライブラリへの参照を設定してから、FileSystemObjectを使用します。
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
ヒントは次のとおりです。ファイル名を再利用していますか、またはすぐに削除が必要な処理を行う予定ですか?
番号?
VBAにコマンドプロンプトから非同期でコマンドDEL "C:\ TEMP \ scratchpad.txt" / Fを実行させることができます。 VBA.Shellを使用して。
シェル "DEL"&chr(34)&strPath&chr(34)& "/ F"、vbHide
ファイル名を囲む二重引用符(ASCII文字34)に注意してください。ネットワークパス、またはスペースを含む長いファイル名を持っていると想定しています。
大きなファイルの場合や、低速のネットワーク接続の場合は、ファイアアンドフォーゲットが適しています。もちろん、これが機能したかどうかはわかりません。ただし、VBAをすぐに再開すると、ネットワークを待機するよりもこれが適切な場合があります。