it-swarm-tr.com

VBA'da bir dosyayı silme

VBA kullanarak nasıl yapabilirim:

  1. bir dosyanın olup olmadığını test edin ve öyleyse,
  2. silin?
113
inglesp

1.) Kontrol burada . Temelde bunu yapın:

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

İhtiyaç duyduğunuz çeşitli hata işlemlerini çözmeniz için size bırakacağım ancak bunlar dikkate almayı düşündüğüm hata işlemeler arasında:

  • Boş bir dizginin geçip geçmediğini kontrol edin.
  • Bir dosya adında/yolunda geçersiz karakterler içeren bir dize olup olmadığını kontrol edin

2.) Bir Dosya Nasıl Silinir. this. Temelde Kill komutunu kullanın, ancak dosyanın salt okunur olması için izin vermeniz gerekir. İşte sizin için bir fonksiyon:

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

Yine, hatayı size taşıma hatası bırakacağım ve tekrar düşündüğüm şeyler bunlar:

  • Bu bir dosyaya karşı bir dizin için farklı davranmalı mı? Bir kullanıcının bir dizini silmek istediğini açıkça belirtmesi gerekir mi?

  • Kodun salt okunur özniteliği otomatik olarak sıfırlamasını mı istiyorsunuz yoksa kullanıcıya salt okunur özniteliğin ayarlandığına dair bir tür gösterge belirtilmeli mi?


EDIT: Bu cevabı topluluk wiki olarak işaretler, böylece herhangi biri gerektiğinde değiştirebilir.

157
Onorio Catenacci

Tamamen aynı fikirdeyim ki, Brettski'nin cevabını kodlamanın alternatif bir yolu olabilir:

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

Aynı etki ancak daha az (hiç de yok) değişken bildirimleri.

FileSystemObject gerçekten faydalı bir araçtır ve arkadaşça davranmaya değer. Her şeyden başka, metin dosyası yazmak için, bazen birkaç kişiyi şaşırtabilecek eski alternatiflerden daha hızlı olabilir. (Benim tecrübeme göre, en azından, YMMV).

50
Mike Woodhouse

Muhtemelen bunun için alev alacağım, ama sadece onu silecekseniz varoluş testi nedir? Başlıca evcil hayvan eşlerimden biri, "Dosya silinemedi, yok!" Gibi bir hata iletişim kutusu atan bir uygulama.

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.

Dosya ilk etapta yoksa, görev tamamlandı!

13
JohnFx

Bir dosyanın varlığını sınamak ve sonra silmek için aşağıdakiler kullanılabilir.

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

VB içinde normal olarak Dir ile dosyanın dizinini bulabilirsiniz. Boş değilse, o zaman var olur ve dosyadan kurtulmak için Kill öğesini kullanın.

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

Scripting.Runtime kütüphanesine bir referans ayarlayın ve ardından FileSystemObject öğesini kullanın:

Dim fso as New FileSystemObject, aFile as File

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

İşte size bir ipucu: Dosya adını yeniden mi kullanıyorsunuz yoksa derhal silinmesi gereken bir şey mi yapmayı planlıyorsunuz?

Hayır?

VBA'yı DEL "C:\TEMP\scratchpad.txt"/F komutunu İstemi asenkronize komutunu kullanarak VBA.Shell kullanarak çalıştırabilirsiniz:

Shell "DEL" ve chr (34) ve strPath ve chr (34) & "/ F", vbHide

Dosya adı etrafındaki çift tırnak işaretlerine (ASCII karakter 34) dikkat edin: Bir ağ yolunun veya boşluk içeren uzun bir dosya adınız olduğunu farz ediyorum.

Büyük bir dosyaysa veya ağ bağlantınız yavaşsa, ateşle ve unut gitsin. Elbette, bunun işe yarayıp yaramadığını asla göremezsiniz; ancak VBA’nı derhal sürdürürsünüz ve bunun ağı beklemekten daha iyi olduğu zamanlar vardır.

3
Nigel Heffernan

Scripting.Runtime kütüphanesine bir referans ayarlayabilir ve ardından FileSystemObject öğesini kullanabilirsiniz. Bir DeleteFile yöntemi ve bir FileExists yöntemi vardır.

MSDN makalesine bakın burada .

2
Darrel Miller