Перевірте, чи існує файл за допомогою VBA


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

У цьому випадку, коли я виймаю текстове значення з поля введення, воно не працює. Якщо ж, якщо видалити "the sentence"з If Dir()і замінити його на справжнє ім'я в коді, це працює. Хтось може допомогти?

Відповіді:


142

Зверніть увагу, що ваш код містить те, Dir("thesentence")що повинно бути Dir(thesentence).

Змініть свій код на це

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
Мені це частково допомогло. Я думаю, що коли я використовую цей компілятор коду, не розглядаю "thesentence" як каталог, тому раніше я використовував ще один рядок коду If: <code> Dim Path as String Dim Directory as String Path = InitialPath & "\" & Date $ Directory = Dir (Path, vbDirectory) </code>, коли я використовував змінний рядок ** Directory ** під If Dir (Directory) <> "", тоді він працював добре
Мухаммад Тайяб,

19

Використовуйте FileDialogоб’єкт Office, щоб користувач вибрав файл із файлової системи. Додайте посилання у свій проект VB або в редактор VBA Microsoft Office Libraryта загляньте в довідку. Це набагато краще, ніж те, що люди вступають повними шляхами.

Ось приклад використання, msoFileDialogFilePickerщоб дозволити користувачеві вибрати кілька файлів. Ви також можете використовувати 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

Варіантів багато, тому вам потрібно буде переглянути повні файли довідки, щоб зрозуміти все можливе. Ви можете почати з об'єкта Office 2007 FileDialog (звичайно, вам потрібно буде знайти правильну довідку для версії, яку ви використовуєте).


1
+1 Набагато краще, оскільки це чудова програма. FileDialog (msoFileDialogOpen)
Alex K.

18

Виправлення до fileExists з @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: скорочена версія

' 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
Чому код тестує одне і те ж ім'я файлу кілька разів (один раз для кожного файлу в s_directory)? Повторювати цей тест немає сенсу. Ви помітите, що змінна циклу (obj_file) не використовується кодом циклів.
grantnz

1
@grantnz Справді! Я зробив ліниве копіювання / вставлення і налаштував, поки це не спрацювало. Скорочена версія - вище. Дякую.
amackay11

Хто-небудь помічав, що іноді цей тест повідомляє про помилково позитивний результат, тобто він повертає "Істинно", навіть якщо файл не існує у файловій системі. У своєму додатку я перевіряю наявність файлу на сервері в моїй мережі, якщо це дає вам підказку.
паблета

6

просто позбудьтесь цих мовних знаків

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

Це той, який мені подобається:

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
Я ніколи раніше не чув про "мовні знаки". Дивно. На мою думку, це неправильна назва. Багато речей вимагає цитат, але це не мова.
ErikE

4
@ErikE +1 за приємне спостереження ... Картинки тут
whytheq

1
Мабуть, "мовні знаки" - це неформальна версія "лапок".
ErikE

@ErikE ... Я знаю, точніше, сказав "знаю"
чомуtheq

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

Працює дуже добре, майже, на моєму сайті. Якщо я покличу це з "" порожнім рядком, Dir повертає " connection.odc " !! Було б чудово, якби ви, хлопці, могли поділитися своїм результатом.

У всякому разі, мені подобається це:

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
Стара публікація, але схоже на те, що вона dir("")дає вам ім’я першого файлу в поточному каталозі. У вашому випадку це був файл під назвою connection.odc.
Кори


3

Я не впевнений, що конкретно стається з вашим кодом, але я використовую цю функцію, яку я знайшов в Інтернеті (URL у коментарях), щоб перевірити, чи існує файл:

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
Це дасть return true, якщо ви вказали шлях і не знаєте, це каталог чи ні. Якщо ви хочете перевірити, чи шлях є лише файлом, це не спрацює на 100%. ? dir$("C:\Users\Chloe\AppData\Local\Temp\")дасть перший файл у цьому каталозі, і він не буде рівним "", отже, він поверне істину, навіть якщо Directoryаргумент залишено або встановлено як false.
Хлоя

@Chloe Думаю, передбачається, що ви вкажете розширення файлу разом з ім'ям файлу, тому неоднозначність того, що ви є каталогом, насправді не застосовується в цьому випадку. Але, звичайно, це може бути більш надійним. Це лише залежить від того, наскільки глибоке рішення вам потрібно. Але це, безумовно, спрацьовує для справи, визначеної ОП
Дан,

1

Дуже стара публікація, але оскільки це допомогло мені після внесення деяких змін, я думав поділитися. Якщо ви перевіряєте, чи існує каталог, вам потрібно додати аргумент vbDirectory до функції Dir, інакше ви будете повертатися 0кожного разу. (Редагувати: це було відповіддю на відповідь Роя, але я випадково зробив це звичайною відповіддю).

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

1

виходячи з інших відповідей тут, я хотів би поділитися своїми однокласниками, які повинні працювати для папок та файлів :

  • Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0  'version 1 - ... <> "" should be more inefficient generally
    
    • (просто Len(Dir(path))не працював для каталогів (Excel 2010 / Win7))
  • CreateObject("Scripting.FileSystemObject").FileExists(path)  'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)
    

як PathExists(path)функція:

Public Function PathExists(path As String) As Boolean
    PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0
End Function
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.