Câu trả lời:
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ẽ giao nó cho bạn để tìm ra các 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 mà tôi sẽ xem xét:
2.) Cách xóa tệp. Nhìn 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ế độ chỉ đọc. Đây là một chức năng dành 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ẽ giao 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 hoạt động khác nhau cho một thư mục so với một tệp không? Người dùng có nên phải cho biết rõ ràng họ muốn xóa một thư mục không?
Bạn có muốn mã tự động đặt lại thuộc tính chỉ đọc hay người dùng phải được cung cấp một số loại dấu hiệu cho thấy thuộc tính chỉ đọc đã được đặt?
CHỈNH SỬA: Đá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ếu cần.
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
Tác dụng tương tự nhưng ít khai báo biến hơn (tốt, không có).
FileSystemObject là một công cụ thực sự hữu ích và rất đáng để làm quen với. Ngoài bất cứ điều gì khác, đối với việc ghi tệp văn bản, nó thực sự đôi khi có thể nhanh hơn so với giải pháp thay thế cũ, điều này có thể khiến một số người ngạc nhiên. (Theo kinh nghiệm của tôi ít nhất là YMMV).
Tôi có thể sẽ bị kích thích vì điều này, nhưng kiểm tra sự tồn tại có ích gì nếu bạn chỉ định xóa nó? Một trong những kẻ trộm thú cưng chính của tôi là một ứng dụng đưa ra hộp thoại lỗi với nội dung như "Không thể xóa tệp, tệp 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 ngay từ đầu, nhiệm vụ đã hoàn thành!
ActiveWorkbook.SaveCopyAs
không thể ghi đè, vì vậy trước tiên bạn phải xóa tệp hiện có có cùng tên tệp.
On Error Resume Next
, hoặc như vậy tôi đã được nói: D Tất nhiên, đó là lời khuyên vô lý, và câu trả lời của bạn là đúng.
Len(dir(...))
không thể kiểm tra sự tồn tại của nó. Nó cũng được kiểm tra nếu các tập tin bị ẩn vì một tập tin ẩn sẽ trả về một chuỗi rỗng thậm chí nếu nó tồn tại (và bạn sẽ không thể xóa nó): Dir(hiddenFile) = ""
. Do đó, phần SetAttr FileToDelete, vbNormal
hùng hồn sẽ giải quyết vấn đề này cho bạn.
Phần sau có thể được sử dụng để kiểm tra sự tồn tại của tệp và sau đó để xóa tệp đó.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(và LenB()
thậm chí còn nhanh hơn) nhanh hơn so với so sánh chuỗi là trong bộ nhớ, chuỗi VB được đặt trước độ dài của chúng. Len / LenB chỉ cần kéo độ dài từ vị trí bộ nhớ đó, họ không cần phải lặp qua chuỗi để biết độ dài của nó. Mặt khác, sử dụng so sánh chuỗi có nhiều việc phải làm hơn. Ngoài ra, tránh sử dụng ""
trong VB vì nó luôn cấp phát một chuỗi mới. Sử dụng vbNullString
thay thế vì nó là một hằng số và không sử dụng thêm bộ nhớ.
đặt một tham chiếu đến thư viện Scripting.Runtime 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
Đây là mẹo: bạn đang sử dụng lại tên tệp hay định làm điều gì đó yêu cầu xóa ngay lập tức?
Không?
Bạn có thể nhận VBA để kích hoạt lệnh DEL "C: \ TEMP \ xướcpad.txt" / F từ dấu nhắc lệnh một cách không đồng bộ bằng VBA.
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ó một đường dẫn mạng hoặc một tên tệp dài có chứa khoảng trắng.
Nếu đó là một tệp lớn hoặc nó có kết nối mạng chậm, cứu hỏa và quên là cách để thực hiện. Tất nhiên, bạn sẽ không bao giờ biết được điều này có hiệu quả hay không; nhưng bạn tiếp tục VBA của mình ngay lập tức và đôi khi điều này tốt hơn là chờ mạng.
Bạn có thể đặt một tham chiếu đến thư viện Scripting.Runtime 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 .