VBAのファイルを削除する


121

VBAを使用して、どうすればよいですか。

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

回答:


168

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

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としてマークすると、必要に応じて誰でも修正できます。


ありがとう-同じ名前のファイルが2つ存在する場合、DeleteFileサブはそれらの両方を削除するか、1つだけを削除しますか?アドバイスは大歓迎です。
BKSpurgeon

6
ディレクトリに同じ名前の2つのファイルを含めることはできません。
Onorio Catenacci

52

私が別の方法で完全に同意するBrettskiの答えをコード化する別の方法は、

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

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

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


7
ファイルスクリプトオブジェクトを宣言せずにこの構文を使用するには、Microsoft Scripting Runtimeへの参照を追加する必要があります。それ以外の場合は、Dim fs As New Scripting.FileSystemObject
pghcpa

5
また、スクリプトライブラリを参照する必要があります。ここを参照してください:stackoverflow.com/questions/3233203/...は
ekkis

Nothingに設定する変数がないので、FileSystemObjectがメモリに残り、リークやその他の問題を引き起こすリスクはありますか?
ジョニー、なぜ'09 / 09/23

いいえ、「End With」の後で破棄されます。変数に割り当てられていないので、効果は「なし」に設定された変数に割り当てられたオブジェクトに似ています。
ジョニー

15

たぶんこれに怒るでしょうが、それを削除するだけの場合、存在をテストするポイントは何ですか?私の主な不快感の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.

そもそもファイルが存在しなければミッション達成!


4
あなたは良い点を挙げますが、ほとんどの場合と同様に、それはコンテキストに依存すると思います。「ファイルが存在する」機能を持つことは、削除とは別に便利な場合があります。
Onorio Catenacci

3
+1:アプリケーションのユーザーがファイルを削除する前に確認する必要がある場合があります。たとえば、を使用ActiveWorkbook.SaveCopyAsすると上書きできません。そのため、最初に同じファイル名の既存のファイルを削除する必要があります。
ジョエル

しかし、あなたは決して使用すべきではないOn Error Resume Nextので、私は言われました:Dもちろん、それはとんでもないアドバイスであり、あなたの答えは正しいです。
ジョニーホワイ、

Len(dir(...))存在を確認するためだけのパーツではありません。また、隠しファイルは存在しても空の文字列を返すため、ファイルがHIDDENであるかどうかもチェックします(削除することはできません)Dir(hiddenFile) = ""。したがって、この部分はSetAttr FileToDelete, vbNormal雄弁にこれを処理します。
elektrykalAJ

11

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

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

3
私はこの質問と応答が古いことを知っています。Len()を使用して文字列(および文字列を返す関数)をテストすると、VBAでのリテラル文字列比較よりも高速に見えるようになります。
JimmyPena

7
理由Len()(とLenB()より高速な文字列の比較よりもあるが、さらに高速である)メモリに、VBの文字列はその長さが先行しているということです。Len / LenBはそのメモリ位置から長さを引き出すだけで、長さを知るために文字列を反復処理する必要はありません。一方、文字列比較を使用すると、実行する作業がはるかに多くなります。また、""常に新しい文字列を割り当てるため、VBでの使用は避けてください。vbNullString定数であり、より多くのメモリを使用しないため、代わりに使用してください。
Renaud Bompuis、2014年

7

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

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

6

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

Dim fso as New FileSystemObject, aFile as File

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

Killは分音を伴うファイル/フォルダーを削除できないため、FileSystemObjectメソッドも使用します
mauek unak

これは私が使用する方法です。これを実装する誰かがエラーチェックとDisplayAlerts = falseを使用したいと考えています。(ファイルは使用中は削除されないため、エラートラップが必要です)
Gregg Burns

3

ヒントは次のとおりです。ファイル名を再利用していますか、またはすぐに削除が必要な処理を行う予定ですか?

番号?

VBAにコマンドプロンプトから非同期でコマンドDEL "C:\ TEMP \ scratchpad.txt" / Fを実行させることができます。 VBA.Shellを使用して。

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

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

大きなファイルの場合や、低速のネットワーク接続の場合は、ファイアアンドフォーゲットが適しています。もちろん、これが機能したかどうかはわかりません。ただし、VBAをすぐに再開すると、ネットワークを待機するよりもこれが適切な場合があります。


これは、非同期が必要な場合の優れた代替手段です。
ジョニーホワイ

2

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

MSDNの記事を参照してくださいここに

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.