VBA
Trabajar con archivos y directorios sin usar FileSystemObject
Buscar..
Observaciones
El Scripting.FileSystemObject
es mucho más robusto que los métodos heredados en este tema. Se debe preferir en casi todos los casos.
Determinar si existen carpetas y archivos
Archivos:
Para determinar si existe un archivo, simplemente pase el nombre de archivo a la función Dir$
y compruebe si devuelve un resultado. Tenga en cuenta que Dir$
admite comodines, por lo que para probar un archivo específico , el nombre de pathName
pasado se debe probar para asegurarse de que no los contiene. La muestra a continuación genera un error: si este no es el comportamiento deseado, la función se puede cambiar para que simplemente devuelva False
.
Public Function FileExists(pathName As String) As Boolean
If InStr(1, pathName, "*") Or InStr(1, pathName, "?") Then
'Exit Function 'Return False on wild-cards.
Err.Raise 52 'Raise error on wild-cards.
End If
FileExists = Dir$(pathName) <> vbNullString
End Function
Carpetas (método Dir $):
La función Dir$()
también se puede usar para determinar si existe una carpeta al especificar vbDirectory
para el parámetro de attributes
opcional. En este caso, el pasado pathName
valor debe terminar con un separador de ruta ( \
), como búsqueda de nombres de archivos hará que los falsos positivos. Tenga en cuenta que los comodines solo se permiten después del último separador de ruta, por lo que la siguiente función de ejemplo arrojará un error de tiempo de ejecución 52 - "Nombre o número de archivo incorrecto" si la entrada contiene un comodín. Si este no es el comportamiento deseado, elimine el comentario On Error Resume Next
en la parte superior de la función. También recuerde que Dir$
admite rutas de archivo relativas (es decir, ..\Foo\Bar
), por lo que se garantiza que los resultados solo serán válidos siempre que no se cambie el directorio de trabajo actual.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Uncomment the "On Error" line if paths with wild-cards should return False
'instead of raising an error.
'On Error Resume Next
If pathName = vbNullString Or Right$(pathName, 1) <> "\" Then
Exit Function
End If
FolderExists = Dir$(pathName, vbDirectory) <> vbNullString
End Function
Carpetas (método ChDir):
La instrucción ChDir
también se puede utilizar para probar si existe una carpeta. Tenga en cuenta que este método cambiará temporalmente el entorno en el que se está ejecutando VBA, por lo que si eso es una consideración, se debe usar el método Dir$
su lugar. Tiene la ventaja de ser mucho menos tolerante con su parámetro. Este método también admite rutas de archivo relativas, por lo que tiene la misma advertencia que el método Dir$
.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Cache the current working directory
Dim cached As String
cached = CurDir$
On Error Resume Next
ChDir pathName
FolderExists = Err.Number = 0
On Error GoTo 0
'Change back to the cached working directory.
ChDir cached
End Function
Creación y eliminación de carpetas de archivos
NOTA: para mayor brevedad, los siguientes ejemplos utilizan la función FolderExists del ejemplo de Determinación de si existen carpetas y archivos en este tema.
La declaración MkDir
se puede utilizar para crear una nueva carpeta. Acepta rutas que contienen letras de unidad ( C:\Foo
), nombres UNC ( \\Server\Foo
), rutas relativas ( ..\Foo
) o el directorio de trabajo actual ( Foo
).
Si se omite la unidad o el nombre UNC (es decir, \Foo
), la carpeta se crea en la unidad actual. Este puede o no ser el mismo disco que el directorio de trabajo actual.
Public Sub MakeNewDirectory(ByVal pathName As String)
'MkDir will fail if the directory already exists.
If FolderExists(pathName) Then Exit Sub
'This may still fail due to permissions, etc.
MkDir pathName
End Sub
La instrucción RmDir
se puede utilizar para eliminar carpetas existentes. Acepta rutas en las mismas formas que MkDir
y usa la misma relación con el directorio y la unidad de trabajo actuales. Tenga en cuenta que la instrucción es similar al comando de Windows rd
shell, por lo que arrojará un error de tiempo de ejecución 75: "Error de acceso a la ruta / archivo" si el directorio de destino no está vacío.
Public Sub DeleteDirectory(ByVal pathName As String)
If Right$(pathName, 1) <> "\" Then
pathName = pathName & "\"
End If
'Rmdir will fail if the directory doesn't exist.
If Not FolderExists(pathName) Then Exit Sub
'Rmdir will fail if the directory contains files.
If Dir$(pathName & "*") <> vbNullString Then Exit Sub
'Rmdir will fail if the directory contains directories.
Dim subDir As String
subDir = Dir$(pathName & "*", vbDirectory)
Do
If subDir <> "." And subDir <> ".." Then Exit Sub
subDir = Dir$(, vbDirectory)
Loop While subDir <> vbNullString
'This may still fail due to permissions, etc.
RmDir pathName
End Sub