it-swarm-vi.tech

Xóa một tập tin trong VBA

Sử dụng VBA, làm thế nào tôi có thể:

  1. kiểm tra xem một tập tin có tồn tại không, và nếu vậy,
  2. xóa đi?
108
inglesp

1.) Kiểm tra tại đây . Về cơ bản làm điều này:

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

Tôi sẽ để lại cho bạn để tìm ra cách xử lý lỗi khác nhau cần thiết nhưng đây là một trong những cách xử lý lỗi tôi đang xem xét:

  • Kiểm tra một chuỗi trống được thông qua.
  • Kiểm tra chuỗi chứa ký tự không hợp lệ trong tên tệp/đường dẫn

2.) Cách xóa một tập tin. Nhìn vào cái này. Về cơ bản sử dụng lệnh Kill nhưng bạn cần cho phép khả năng tệp chỉ đọc. Đây là một chức năng cho bạn:

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

Một lần nữa, tôi sẽ để lại việc xử lý lỗi cho bạn và một lần nữa đây là những điều tôi sẽ xem xét:

  • Điều này có nên hành xử khác nhau cho một thư mục so với một tập tin? Người dùng phải rõ ràng phải cho biết họ muốn xóa một thư mục?

  • Bạn có muốn mã tự động đặt lại thuộc tính chỉ đọc hoặc người dùng nên được cung cấp một số loại dấu hiệu cho thấy thuộc tính chỉ đọc được đặt?


EDIT: Đánh dấu câu trả lời này là wiki cộng đồng để bất kỳ ai cũng có thể sửa đổi nó nếu cần.

149
Onorio Catenacci

Một cách khác để mã hóa câu trả lời của Brettski, mà tôi hoàn toàn đồng ý, có thể là

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

Hiệu ứng tương tự nhưng ít hơn (tốt, không có gì cả) khai báo biến.

FileSystemObject là một công cụ thực sự hữu ích và rất đáng để thân thiện. Ngoài bất cứ điều gì khác, đối với việc viết tệp văn bản, đôi khi nó thực sự có thể nhanh hơn so với thay thế kế thừa, điều này có thể gây ngạc nhiên cho một số người. (Theo kinh nghiệm của tôi ít nhất, YMMV).

49
Mike Woodhouse

Có lẽ tôi sẽ bị kích động vì điều này, nhưng điểm kiểm tra sự tồn tại là gì nếu bạn định xóa nó? Một trong những thú cưng chính của tôi là một ứng dụng ném hộp thoại lỗi với nội dung như "Không thể xóa tệp, nó không tồn tại!"

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.

Nếu tệp không tồn tại ở vị trí đầu tiên, nhiệm vụ đã hoàn thành!

13
JohnFx

Sau đây có thể được sử dụng để kiểm tra sự tồn tại của một tệp và sau đó xóa nó.

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

Trong VB nó thường Dir để tìm thư mục của tệp. Nếu nó không trống thì nó tồn tại và sau đó sử dụng Kill để thoát khỏi tệp.

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

đặt tham chiếu đến thư viện Scripting.R.78 và sau đó sử dụng FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

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

Đây là một mẹo: bạn đang sử dụng lại tên tệp hoặc dự định làm một cái gì đó yêu cầu xóa ngay lập tức?

Không?

Bạn có thể yêu cầu VBA thực hiện lệnh DEL "C:\TEMP\scratchpad.txt"/F từ lệnh Nhắc không đồng bộ bằng VBA.Shell:

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

Lưu ý dấu ngoặc kép (ký tự ASCII 34) xung quanh tên tệp: Tôi giả sử rằng bạn đã có đường dẫn mạng hoặc tên tệp dài chứa khoảng trắng.

Nếu đó là một tập tin lớn, hoặc là trên một kết nối mạng chậm, thì quên và quên là cách để đi. Tất nhiên, bạn không bao giờ có thể xem nếu điều này làm việc hay không; nhưng bạn tiếp tục VBA của bạn ngay lập tức và có những lúc điều này tốt hơn là chờ mạng.

3
Nigel Heffernan

Bạn có thể đặt tham chiếu đến thư viện Scripting.R.78 và sau đó sử dụng FileSystemObject. Nó có một phương thức DeleteFile và một phương thức FileExists.

Xem bài viết MSDN tại đây .

2
Darrel Miller