Comprobar si un archivo existe

Suponemos que hay un informe diseñado para ejecutarse diariamente y que genera una serie de ficheros de resultados con distintos datos automáticamente. Éstos ficheros se guardan en directorios específicos que están definidos en la macro de exportación.
La realidad nos dice que al final éste informe se ejecuta más de una vez al día y lo que se quiere no es regenerarlo sino actualizar los datos. De hecho la primera ejecución puede haber generado ficheros o no o sólo unos pocos. ¿Cómo sabemos si un fichero existe para abrirlo y actualizarlo?
Para saberlo utilizaremos un objeto que iremos viendo a menudo cuando queramos acceder a las funciones de sistema, el FileSystemObject. Éste objeto nos permite operar con Windows usando scripts de sistema.

Ejemplo:
Sub abrir_fichero_si_existe()
Dim Archivo As String
Archivo = "C:\test.xls"
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(Archivo) Then
    Workbooks.Open FileName:= Archivo
Else
    Workbooks.Add
End If

End Sub

Éste ejemplo abre el fichero test.xls si existe o crea un libro nuevo.

12 comentarios:

Anónimo dijo...

Muy bueno!!
Saludos

Anónimo dijo...

Excelente mi hermano. Aunque si hay personas que quieren q excel buske donde esta abierto la macro, pondriamos: Archivo = ThisWorkBook.Path & "\consultas.xls"

Jeancarlo R.
No le des pescado al que tiene hambre, Enseñale a pescar... (proverbio chino)

RoBoot dijo...

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Worksheets("ENCUESTA").TextBox2.Text = "" Or Worksheets("ENCUESTA").TextBox3.Text = "" Or Worksheets("ENCUESTA").TextBox3.Text = "XXXXXXXX-X" Or Worksheets("ENCUESTA").TextBox4.Text = "" Or Worksheets("ENCUESTA").TextBox5.Text = "" Then
Cancel = True 'BLOQUEAMOS CIERRE
MsgBox "¡Vaya! es imposible cerrar la aplicación. Revise los datos solicitados al comienzo de la encuesta.", vbApplicationModal + vbCritical + vbOKOnly
Else
ThisWorkbook.SaveAs (Worksheets("ENCUESTA").TextBox3.Text)
MsgBox "El archivo quedará guardado con el nombre de: " & Worksheets("ENCUESTA").TextBox3.Text & Chr(13) & Chr(13) & "Ruta: " & ThisWorkbook.Path & Chr(13) & Chr(13) & "Si desea modificarlo debera eliminar el archivo ubicado en la ruta especifica." & Chr(13) & Chr(13) & "... Muchas gracias por su tiempo.", vbApplicationModal + vbInformation + vbOKOnly
ThisWorkbook.Close (1) 'CIERRE Y GUARDA AUTOMATICO
End If
End Sub

Funcionando impecablemente!!! condiciona la salida del libro... XD!!!

roberto dijo...

Muchísimas Gracias!!!
Lo siguiente me ha sido de gran utilidad.

'Cuando un proceso previo obtiene un error, genera un archivo llamado errores.txt con el motivo del fallo
'Si existe dicho archivo (hubo un erro), quiero que se muestre, para ver que ha fallado
Dim Archivo As String
Archivo = "C:\AEAT\REDISTRIBUIR\ERRORES.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
'Si existe, abrimos el nuevo archivo para mostrar los errores del módulo de impresión
If fso.FileExists(Archivo) Then
ActiveWorkbook.FollowHyperlink Address:="C:\AEAT\REDISTRIBUIR\ERRORES.txt"
End If

roberto dijo...

'Detectado problema de compatibilidad: FileSystemObject da error con Windows XP. Se soluciona fácil habilitando referencia:
'Ir a Herramientas -> Referencias -> Microsoft Scripting Runtime (esto no es necesario en Windows 7)
'Aún despues de habilitar referencia: Microsoft Scripting Runtime, no funciona si no hacemos previamente la siguiente declaración (no necesaria en Windows 7 según mi experiencia):
Dim fso As Scripting.FileSystemObject

roberto dijo...

Ahora sí!!, prometo no comentar más (para no liar).
Probando, ocurre que la línea de declaración es mejor que sea así:
Dim fso As New FileSystemObject

Sub abrir_fichero()
'Aquí un ejemplo con Scripting.FileSystemObject que funciona tanto en Windows XP como en Windows 7:
'***Recordar añadir referencia: Herramientas -> Referencias -> marcamos en la lista "Microsoft Scripting Runtime"
'*****You need to add reference to the library: Microsoft Scripting RunTime.
Dim Archivo As String
Archivo = ThisWorkbook.Path & "\ejemplo.txt"
Dim fso As New FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(Archivo) Then
ActiveWorkbook.FollowHyperlink Address:=Archivo
Else: MsgBox "No existe el archivo ejemplo.txt en:" & ThisWorkbook.Path
End If
End Sub

Hugo Armando Rodríguez Franco dijo...

Muchas gracias, me sirvió mucho

JESUS MARTINEZ NAVARRO dijo...

Muchas gracias Oriol Garrote, debemos valorar las cosas simples y funcionales como tu ejemplo. Saludos

Javier dijo...

Otra opción es usar Dir$("archivo.ext")
:)

Unknown dijo...

If Len(Dir("c:\Instructions.doc")) = 0 Then
Msgbox "This file does NOT exist."
Else
Msgbox "This file does exist."
End If

xumeiqing dijo...

sac longchamp pas cher
ugg boots
jordan shoes
ed hardy sale
gucci uk
louis vuitton factory outlet
vans outlet store
the north face outlet
coach outlet
michael kors purses

Zz Zz dijo...

canada goose outlet
ralph lauren outlet
coach factory outlet
ugg outlet
coach outlet
louis vuitton outlet
ray ban sunglasses
ralph lauren outlet
ugg outlet
canada goose outlet
clb1113

Publicar un comentario

Gracias por dejar tu comentario.