Kiểm tra xem tệp có tồn tại bằng VBA không


82
Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir("thesentence") <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

Trong điều này, khi tôi lấy giá trị văn bản từ hộp nhập, nó không hoạt động. Tuy nhiên, nếu xóa "the sentence"khỏi If Dir()và thay thế nó bằng tên thực trong mã, nó sẽ hoạt động. Ai đó có thể giúp đỡ?

Câu trả lời:


142

Lưu ý rằng mã của bạn Dir("thesentence")phải có Dir(thesentence).

Thay đổi mã của bạn thành cái này

Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

1
Nó đã giúp tôi một phần, tôi nghĩ rằng khi tôi sử dụng trình biên dịch mã này không coi "thesentence" là một thư mục vì vậy tôi đã sử dụng chỉ một dòng mã nữa trước đây If: <code> Dim Path as String Dim Directory as String Path = InitialPath & "\" & Date $ directory = Dir (Path, vbDirectory) </ code> khi tôi sử dụng ** mục ** biến chuỗi dưới Nếu Dir (Directory) <> "", sau đó nó làm việc tốt
muhammad tayyab

19

Sử dụng FileDialogđối tượng Office để yêu cầu người dùng chọn tệp từ hệ thống tệp. Thêm một tham chiếu trong dự án VB của bạn hoặc trong trình soạn thảo VBA Microsoft Office Libraryvà xem trợ giúp. Điều này tốt hơn nhiều so với việc mọi người đi vào các con đường đầy đủ.

Đây là một ví dụ sử dụng msoFileDialogFilePickerđể cho phép người dùng chọn nhiều tệp. Bạn cũng có thể sử dụng msoFileDialogOpen.

'Note: this is Excel VBA code
Public Sub LogReader()
    Dim Pos As Long
    Dim Dialog As Office.FileDialog
    Set Dialog = Application.FileDialog(msoFileDialogFilePicker)

    With Dialog
        .AllowMultiSelect = True
        .ButtonName = "C&onvert"
        .Filters.Clear
        .Filters.Add "Log Files", "*.log", 1
        .Title = "Convert Logs to Excel Files"
        .InitialFileName = "C:\InitialPath\"
        .InitialView = msoFileDialogViewList

        If .Show Then
            For Pos = 1 To .SelectedItems.Count
                LogRead .SelectedItems.Item(Pos) ' process each file
            Next
        End If
    End With
End Sub

Có rất nhiều tùy chọn, vì vậy bạn sẽ cần xem toàn bộ tệp trợ giúp để hiểu tất cả những gì có thể. Bạn có thể bắt đầu với đối tượng FileDialog của Office 2007 (tất nhiên, bạn sẽ cần tìm trợ giúp chính xác cho phiên bản bạn đang sử dụng).


1
1 Tốt hơn nhiều, vì đây là excel Application.FileDialog (msoFileDialogOpen)
Alex K.

18

Sửa thành tệpExists từ @UberNubIsTrue:

Function fileExists(s_directory As String, s_fileName As String) As Boolean

  Dim obj_fso As Object, obj_dir As Object, obj_file As Object
  Dim ret As Boolean
   Set obj_fso = CreateObject("Scripting.FileSystemObject")
   Set obj_dir = obj_fso.GetFolder(s_directory)
   ret = False
   For Each obj_file In obj_dir.Files
     If obj_fso.fileExists(s_directory & "\" & s_fileName) = True Then
        ret = True
        Exit For
      End If
   Next

   Set obj_fso = Nothing
   Set obj_dir = Nothing
   fileExists = ret

 End Function

EDIT: phiên bản rút gọn

' Check if a file exists
Function fileExists(s_directory As String, s_fileName As String) As Boolean

    Dim obj_fso As Object

    Set obj_fso = CreateObject("Scripting.FileSystemObject")
    fileExists = obj_fso.fileExists(s_directory & "\" & s_fileName)

End Function

2
Tại sao mã kiểm tra cùng một tên tệp nhiều lần (một lần cho mọi tệp trong s_directory)? Không có ích gì khi lặp lại bài kiểm tra này. Bạn sẽ nhận thấy rằng biến vòng lặp (obj_file) không được sử dụng bởi mã vòng lặp.
Grantnz

1
@grantnz Thật vậy! Tôi đã thực hiện sao chép / dán lười biếng và tinh chỉnh cho đến khi nó hoạt động. Phiên bản rút gọn ở trên. Cảm ơn.
amackay11

Có ai nhận thấy rằng đôi khi kiểm tra này báo cáo dương tính giả, tức là nó trả về ´True´ ngay cả khi một tệp không tồn tại trong hệ thống tệp. Trong ứng dụng của mình, tôi kiểm tra sự tồn tại của một tệp trong máy chủ trên mạng của mình, nếu điều đó cho bạn gợi ý.
pablete

6

chỉ cần loại bỏ những dấu hiệu bài phát biểu

Sub test()

Dim thesentence As String

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

Đây là một trong những tôi thích:

Option Explicit

Enum IsFileOpenStatus
    ExistsAndClosedOrReadOnly = 0
    ExistsAndOpenSoBlocked = 1
    NotExists = 2
End Enum


Function IsFileReadOnlyOpen(FileName As String) As IsFileOpenStatus

With New FileSystemObject
    If Not .FileExists(FileName) Then
        IsFileReadOnlyOpen = 2  '  NotExists = 2
        Exit Function 'Or not - I don't know if you want to create the file or exit in that case.
    End If
End With

Dim iFilenum As Long
Dim iErr As Long
On Error Resume Next
    iFilenum = FreeFile()
    Open FileName For Input Lock Read As #iFilenum
    Close iFilenum
    iErr = Err
On Error GoTo 0

Select Case iErr
    Case 0: IsFileReadOnlyOpen = 0 'ExistsAndClosedOrReadOnly = 0
    Case 70: IsFileReadOnlyOpen = 1 'ExistsAndOpenSoBlocked = 1
    Case Else: IsFileReadOnlyOpen = 1 'Error iErr
End Select

End Function    'IsFileReadOnlyOpen

3
Tôi chưa bao giờ nghe nói về "dấu giọng nói" trước đây. Thật kỳ lạ. Theo quan điểm của tôi, đây là một sự nhầm lẫn. Rất nhiều thứ yêu cầu trích dẫn nhưng không phải là bài phát biểu.
ErikE

4
@ErikE +1 để quan sát tốt ... Hình ảnh ở đây
whytheq

1
Rõ ràng "dấu ngoặc kép" là một phiên bản không chính thức của "dấu ngoặc kép".
ErikE

@ErikE ... Tôi biết hay đúng hơn là tôi đã nói "Tôi biết"
whytheq

6
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

Hoạt động rất tốt, gần như, tại trang web của tôi. Nếu tôi gọi nó bằng "" chuỗi trống, Dir trả về " connection.odc " !! Sẽ rất tuyệt nếu các bạn có thể chia sẻ kết quả của mình.

Dù sao, tôi làm như thế này:

Function FileExists(fullFileName As String) As Boolean
  If fullFileName = "" Then
    FileExists = False
  Else
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
  End If
End Function

1
Bài cũ, nhưng có vẻ như dir("")cung cấp cho bạn tên của tệp đầu tiên trong thư mục hiện tại. Trong trường hợp của bạn, đó là một tệp được gọi connection.odc.
Corey

4
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

3

Tôi không chắc chắn cụ thể mã của bạn có gì sai, nhưng tôi sử dụng chức năng này mà tôi tìm thấy trực tuyến (URL trong nhận xét) để kiểm tra xem tệp có tồn tại hay không:

Private Function File_Exists(ByVal sPathName As String, Optional Directory As Boolean) As Boolean
    'Code from internet: http://vbadud.blogspot.com/2007/04/vba-function-to-check-file-existence.html
    'Returns True if the passed sPathName exist
    'Otherwise returns False
    On Error Resume Next
    If sPathName <> "" Then

        If IsMissing(Directory) Or Directory = False Then

            File_Exists = (Dir$(sPathName) <> "")
        Else

            File_Exists = (Dir$(sPathName, vbDirectory) <> "")
        End If

    End If
End Function

1
Điều này sẽ trả về true nếu bạn đưa ra một đường dẫn và không biết nó có phải là một thư mục hay không. Nếu bạn muốn kiểm tra xem một đường dẫn có phải là một tệp chỉ hay không, điều này sẽ không hoạt động 100%. ? dir$("C:\Users\Chloe\AppData\Local\Temp\")sẽ cung cấp cho tệp đầu tiên trong thư mục đó và nó sẽ không bằng "", do đó, nó sẽ trả về true ngay cả khi bạn Directorytắt đối số hoặc đặt nó thành false.
Chloe

@Chloe Tôi đoán là giả sử bạn sẽ chỉ định một phần mở rộng tệp cùng với tên tệp, vì vậy sự mơ hồ về việc là một thư mục không thực sự áp dụng trong trường hợp đó. Nhưng chắc chắn, nó có thể mạnh mẽ hơn. Nó chỉ phụ thuộc vào độ sâu của giải pháp bạn cần. Nhưng chắc chắn nó không làm việc đối với trường hợp theo quy định của OP
Dan

1

Bài đăng rất cũ, nhưng vì nó đã giúp tôi sau khi tôi thực hiện một số sửa đổi, tôi nghĩ tôi sẽ chia sẻ. Nếu bạn đang kiểm tra xem thư mục có tồn tại hay không, bạn sẽ muốn thêm đối số vbDirectory vào hàm Dir, nếu không bạn sẽ quay lại 0mỗi lần. (Chỉnh sửa: đây là câu trả lời của Roy, nhưng tôi đã vô tình biến nó thành câu trả lời thông thường.)

Private Function FileExists(fullFileName As String) As Boolean
    FileExists = Len(Dir(fullFileName, vbDirectory)) > 0
End Function

1

dựa trên các câu trả lời khác ở đây, tôi muốn chia sẻ một lớp lót của mình sẽ hoạt động cho dirs và tệp :

  • Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0  'version 1 - ... <> "" should be more inefficient generally
    
    • (chỉ Len(Dir(path))không hoạt động cho các thư mục (Excel 2010 / Win7))
  • CreateObject("Scripting.FileSystemObject").FileExists(path)  'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)
    

như PathExists(path)chức năng:

Public Function PathExists(path As String) As Boolean
    PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0
End Function
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.