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()
и замените его фактическим именем в коде, оно работает. Может ли кто-нибудь помочь?
Обратите внимание, что ваш код содержит 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
Используйте объект Office FileDialog
чтобы пользователь мог выбрать файл из файловой системы. Добавьте ссылку в свой проект 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 (конечно, вам нужно найти правильную справку для используемой версии).
Исправление для файловExists из @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
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
dir("")
дает вам имя первого файла в текущем каталоге. В вашем случае это был файл с именем connection.odc
.
просто избавиться от этих речевых меток
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
Function FileExists(fullFileName As String) As Boolean
FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function
Я не уверен, что не так с вашим кодом, но я использую эту функцию, которую я нашел в Интернете (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
? dir$("C:\Users\Chloe\AppData\Local\Temp\")
выдаст первый файл в этом каталоге, и он не будет равен "", поэтому он вернет true, даже если вы оставите аргумент Directory
выключенным или установите его в ложь.
Очень старый пост, но так как он помог мне после того, как я сделал некоторые изменения, я решил поделиться. Если вы проверяете, существует ли каталог, вам нужно добавить аргумент vbDirectory в функцию Dir, иначе вы будете каждый раз возвращать 0
. (Изменение: это было в ответ на ответ Роя, но я случайно сделал это регулярным ответом.)
Private Function FileExists(fullFileName As String) As Boolean
FileExists = Len(Dir(fullFileName, vbDirectory)) > 0
End Function