2008-09-15 22 views
89

内のファイルを削除してどのようにすることができますI:ファイルが存在するかどうかを、VBA VBAを使用して

  1. テスト、そして、もしそうなら
  2. はそれを削除しますか?

答えて

124

1.)hereをチェックします。基本的には次の操作を行います。

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 
    

    、私はあなたにエラー処理を残しておきますと、再びこれらは、私は検討したいものです。 ファイル?ユーザーは明示的にディレクトリを削除する必要があることを示す必要がありますか?

  • 読み取り専用属性を自動的にリセットするようにするか、ユーザーに読み取り専用属性が設定されていることを通知する必要がありますか?


EDIT:必要であれば誰もがそれを修正することができるようにコミュニティのwikiとして、この答えをマーク。

+0

ありがとうございます - 存在している同じ名前の2つのファイルがある場合、DeleteFileサブが両方を殺すか、または1つだけを殺すのでしょうか?どんなアドバイスも大歓迎です。 – BKSpurgeon

+6

ディレクトリ内に同じ名前のファイルを2つ持つことはできません。 –

+0

もちろん華麗です! – BKSpurgeon

6

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

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

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

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

私はLen()を使って文字列(そして文字列を返す関数)にVBAの文字列比較よりも速いと思われることを追加したいと考えています。 – JimmyPena

+5

'Len()'(と 'LenB()'は文字列の比較より高速です)は、メモリ内でVB文字列の長さが先行しているためです。 Len/LenBはそのメモリ位置から長さを引っ張るだけで、長さを知るために文字列を繰り返す必要はありません。一方、文字列比較を使用すると、はるかに多くの作業が必要になります。さらに、常に新しい文字列を割り当てるので、VBでは '' ''を使わないでください。 'vbNullString'を定数として使用し、より多くのメモリを使用しません。 –

2

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

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

10

私はおそらくこのために燃え尽きるでしょうが、もしそれを削除しようとしているのであれば、存在のテストのポイントは何ですか?私の主要なペットのおしっこの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. 

ファイルが最初に存在しない場合は、ミッションが達成されます。

+3

あなたは良い点を挙げていますが、大部分のように、文脈に依存していると思いますが、単に「ファイルが存在します」という機能は削除とは別に便利です。 –

+2

+1:おそらく、アプリケーションのユーザーがファイルを削除する前に尋ねたいと思うかもしれません。たとえば、 'ActiveWorkbook.SaveCopyAs'を使って上書きすることができないので、まず同じファイル名で既存のファイルを削除する必要があります。 –

+0

しかし、あなたは 'On Error Resume Next'を使うべきではありません。そう言われました:Dもちろん、それはばかげたアドバイスです。あなたの答えは正しいです。 –

4

はScripting.Runtimeライブラリへの参照を設定して、FileSystemObjectオブジェクトを使用します。

Dim fso as New FileSystemObject, aFile as File 

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

私もFileSystemObjectメソッドを使用しています.Killは分音を含むファイル/フォルダを削除できません。 –

39

私はそう完全に同意したとBrettskiの答えを、コーディングする別の方法を、

With New FileSystemObject 
    If .FileExists(yourFilePath) Then 
     .DeleteFile yourFilepath 
    End If 
End With 
かもしれません

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

FileSystemObjectは本当に便利なツールであり、やりがいを感じる価値があります。それ以外にも、テキストファイルの作成には、実際にはいくつかの人を驚かせるかもしれない従来の方法よりも速い場合もあります。 (少なくとも私の経験では、YMMV)。

+5

ファイルスクリプティングオブジェクトを宣言せずにこの構文を使用する場合は、Microsoft Scripting Runtimeの参照を追加する必要があります。FileSystemObject – pghcpa

+2

また、スクリプトライブラリを参照する必要があります。ここで参照してください:http://stackoverflow.com/questions/3233203/how-do-i-use-filesystemobject-in-vba – ekkis

+0

Nothingに設定する変数がないため、FileSystemObjectがメモリに残る危険性があります。漏れやその他の問題? –

3

ヒント:ファイル名を再使用していますか、削除をすぐに行う必要があることを計画していますか?

いいえ?

あなたはVBAコマンドDEL "C:\ TEMPの\のscratchpad.txt" 火災に取得することができますVBA.Shellを使用して非同期コマンドからをプロンプトを/ Fを:

シェル "DEL" & CHR(34ファイル名の周り)& strPath & CHR(34)& "/ F"、vbHide

注二重引用符(ASCII文字34):私はあなたがネットワークパスを持っていると仮定し、または長いですよスペースを含むファイル名。

大きなファイルである場合や、低速のネットワーク接続の場合は、ファイアアンドフォースを使用してください。 もちろん、これがうまくいくかどうかは決して分かりません。ただちにVBAを再開すると、ネットワークを待つよりも時間がかかることがあります。

+0

これは素晴らしい選択肢です* if * asynchがあなたの望むものです。 –

関連する問題