VBAでファイルを削除する
-
09-06-2019 - |
質問
VBA を使用すると、次のことができます。
- ファイルが存在するかどうかをテストし、存在する場合は、
- 消して?
解決
1.) チェック ここ. 。基本的にはこれを行います:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
必要なさまざまなエラー処理を理解するのはあなたに任せますが、以下は私が検討しているエラー処理の 1 つです。
- 空の文字列が渡されていないか確認してください。
- ファイル名/パスに不正な文字を含む文字列をチェックする
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.
そもそもファイルが存在しない場合は、ミッションは完了です。
以下を使用して、ファイルの存在をテストし、それを削除できます。
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
VBでは通常、 Dir
ファイルのディレクトリを見つけます。空白でない場合は、存在するので使用します。 Kill
ファイルを削除します。
test = Dir(Filename)
If Not test = "" Then
Kill (Filename)
End If
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: EMP\scratchpad.txt" /F を実行できます。 非同期的に VBA.Shell を使用して:
シェル "DEL " & chr(34) & strPath & chr(34) & " /F "、vbHide
ファイル名を二重引用符 (ASCII 文字 34) で囲んでいることに注意してください。ネットワーク パス、またはスペースを含む長いファイル名があると仮定します。
ファイルが大きい場合、またはネットワーク接続が遅い場合は、ファイアアンドフォーゲットが最適です。もちろん、これがうまくいったかどうかを確認することはできません。ただし、VBA をすぐに再開すると、ネットワークを待つよりもこの方が良い場合があります。
Scripting.Runtime ライブラリへの参照を設定し、FileSystemObject を使用できます。DeleteFile メソッドと FileExists メソッドがあります。
MSDN の記事を参照してください ここ.