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
En esto, cuando recojo el valor de texto del cuadro de entrada, no funciona. Sin embargo, si lo elimina "the sentence"
de If Dir()
y lo reemplaza con un nombre real en el código, funciona. ¿Alguien puede ayudar?
Utilice el
FileDialog
objeto de Office para que el usuario elija un archivo del sistema de archivos. Agregue una referencia en su proyecto VB o en el editor VBAMicrosoft Office Library
y busque en la ayuda. Esto es mucho mejor que hacer que las personas ingresen por caminos completos.A continuación se muestra un ejemplo
msoFileDialogFilePicker
que permite al usuario elegir varios archivos. También puede utilizarmsoFileDialogOpen
.'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
Hay muchas opciones, por lo que deberá ver los archivos de ayuda completos para comprender todo lo que es posible. Puede comenzar con el objeto FileDialog de Office 2007 (por supuesto, necesitará encontrar la ayuda correcta para la versión que está usando).
fuente
Corrección al archivo Existe de @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
EDITAR: versión abreviada
' 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
fuente
solo deshazte de esas marcas de habla
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
Este es el que me gusta:
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
fuente
Function FileExists(fullFileName As String) As Boolean FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0 End Function
Funciona muy bien, casi, en mi sitio. Si lo llamo con "" la cadena vacía, Dir devuelve " connection.odc " !! Sería genial si pudieran compartir su resultado.
De todos modos, me gusta esto:
Function FileExists(fullFileName As String) As Boolean If fullFileName = "" Then FileExists = False Else FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0 End If End Function
fuente
dir("")
le da el nombre del primer archivo en el directorio actual. En su caso, fue un archivo llamadoconnection.odc
.Function FileExists(fullFileName As String) As Boolean FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0 End Function
fuente
No estoy seguro de qué está mal con su código específicamente, pero uso esta función que encontré en línea (URL en los comentarios) para verificar si existe un archivo:
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
fuente
? dir$("C:\Users\Chloe\AppData\Local\Temp\")
dará el primer archivo en ese directorio, y no será igual a "", por lo tanto, devolverá verdadero incluso si deja elDirectory
argumento desactivado o lo establece en falso.Publicación muy antigua, pero como me ayudó después de que hice algunas modificaciones, pensé en compartir. Si está verificando si existe un directorio, querrá agregar el argumento vbDirectory a la función Dir; de lo contrario, regresará
0
cada vez. (Editar: esto fue en respuesta a la respuesta de Roy, pero accidentalmente la convertí en una respuesta regular).Private Function FileExists(fullFileName As String) As Boolean FileExists = Len(Dir(fullFileName, vbDirectory)) > 0 End Function
fuente
basado en otras respuestas aquí, me gustaría compartir mis frases breves que deberían funcionar para directorios y archivos :
Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0 'version 1 - ... <> "" should be more inefficient generally
Len(Dir(path))
no funcionó para directorios (Excel 2010 / Win7))CreateObject("Scripting.FileSystemObject").FileExists(path) 'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)
como
PathExists(path)
función:Public Function PathExists(path As String) As Boolean PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0 End Function
fuente