web-dev-qa-db-ja.com

VBAでファイルを削除する

VBAを使用して、次のことができます。

  1. ファイルが存在するかどうかをテストし、存在する場合は、
  2. 消して?
108
inglesp

1.) こちら を確認します。基本的にこれを行います:

Function FileExists(ByVal FileToTest As String) As Boolean
   FileExists = (Dir(FileToTest) <> "")
End Function

必要なさまざまなエラー処理を理解するためにあなたに任せますが、これらは私が検討しているエラー処理のものです:

  • 渡される空の文字列を確認します。
  • ファイル名/パスに無効な文字を含む文字列を確認してください

2.)ファイルの削除方法。 this。 を見てください。基本的に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としてマークし、必要に応じて誰でも修正できるようにします。

149

Brettskiの答えをコーディングする別の方法は、そうでなければ完全に同意しますが、

With New FileSystemObject
    If .FileExists(yourFilePath) Then
        .DeleteFile yourFilepath
    End If
End With

同じ効果がありますが、変数宣言は少なくなります(まったくありません)。

FileSystemObjectは本当に便利なツールであり、親しみやすくなる価値があります。他のこととは別に、テキストファイルの書き込みでは、実際には従来の代替手段よりも高速になることがあります。 (少なくとも私の経験では、YMMV)。

49
Mike Woodhouse

私はおそらくこれに苛立ちますが、それを削除するだけなら、存在のテストのポイントは何ですか?私の主なペットの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.

ファイルがそもそも存在しない場合、ミッションは完了しました!

13
JohnFx

以下を使用して、ファイルの存在をテストしてから削除することができます。

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 
10
Rich Adams

VBでは、通常はDirでファイルのディレクトリを検索します。空白でない場合は存在し、Killを使用してファイルを削除します。

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If
6
Leo Moore

Scripting.Runtimeライブラリへの参照を設定そして、FileSystemObjectを使用します。

Dim fso as New FileSystemObject, aFile as File

if (fso.FileExists("PathToFile")) then
    aFile = fso.GetFile("PathToFile")
    aFile.Delete
End if
4
Brettski

ヒントは次のとおりです。ファイル名を再利用していますか、それともすぐに削除が必要なことをする予定ですか?

いや?

VBAにコマンドDEL "C:\ TEMP\scratchpad.txt"/Fを起動させるには、VBA.Shellを使用してコマンドプロンプト非同期を実行します。

シェル "DEL"&chr(34)&strPath&chr(34)& "/ F"、vbHide

ファイル名を囲む二重引用符(ASCII文字34)に注意してください。ネットワークパス、またはスペースを含む長いファイル名があると仮定しています。

それが大きなファイルであるか、それが遅いネットワーク接続にある場合、火と忘れは行く方法です。もちろん、これが機能するかどうかはわかりません。しかし、すぐにVBAを再開します。これは、ネットワークを待つよりも良い場合があります。

3
Nigel Heffernan

Scripting.Runtimeライブラリへの参照を設定してから、FileSystemObjectを使用できます。 DeleteFileメソッドとFileExistsメソッドがあります。

MSDNの記事 here を参照してください。

2
Darrel Miller