Access & VBA FAQ
| | | |
Indice de temas
Tablas
Consultas
Formularios
Informes
Macros
Módulos
Base de datos
Miscelánea
API
Utilidades
Problemas
Cadenas
Fechas
Todos los temas
API : OpenFile. Abrir un archivo ejecutable o un documento
Autor/es:
Juan M Afán de Ribera
Pregunta : ¿Qué código puedo utilizar para abrir un documento, sin tener que conocer la ruta del ejecutable al cual está asociado el documento?
Respuesta : En Access tienes la instrucción
Application.FollowHyperlink [ruta del archivo]
que tendrá el mismo efecto que el producido por un campo de tipo hipervínculo.

Este método es simple, claro y sencillo. Pero, en según qué circunstancias, podemos recibir un mensaje algo molesto (si queremos que el proceso sea transparente para el usuario) sobre la posibilidad de que algunos ficheros puedan contener virus, y bla, bla, bla...

Para poder evitar estos mensajes y conservar la funcionalidad de Application.FollowHyperlink debemos utilizar el API de Windows. A continuación os expongo una función para poder conseguirlo. Esta función (OpenFile) devuelve True, en caso de tener éxito, o un mensaje del sistema explicando el error que se haya producido.

Ejemplo de uso:
Dim Resultado As Variant

    ' intentamos abrir el archivo
    Resultado = OpenFile("C:\MiArchivo.txt")
    ' si ha habido cualquier problema ...
    If Resultado <> True Then
        ' mostramos el mensaje que nos envía el sistema
        MsgBox Resultado
    End If
Pega este código en un módulo estandar:
'---------------------------------------------------------
'
' OpenFile
'
' Código escrito originalmente por Juan M. Afán de Ribera
'
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
'     accessvbafaq@mvp-access.com
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
Private Declare Function ShellExecute Lib "shell32.dll" _
                Alias "ShellExecuteA" _
                (ByVal hwnd As Long, _
                ByVal lpOperation As String, _
                ByVal lpFile As String, _
                ByVal lpParameters As String, _
                ByVal lpDirectory As String, _
                ByVal nShowCmd As Long) As Long

Private Declare Function FormatMessage Lib "kernel32" _
                Alias "FormatMessageA" _
                (ByVal dwFlags As Long, _
                lpSource As Any, _
                ByVal dwMessageId As Long, _
                ByVal dwLanguageId As Long, _
                ByVal lpBuffer As String, _
                ByVal nSize As Long, _
                Arguments As Long) As Long

Private Const SW_NORMAL = 1&
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

' función que abre cualquier archivo ejecutable o documento
' que esté registrado en el sistema con su respectiva aplicación
Public Function OpenFile(FileName As String) As Variant
Dim RetVal As Long
Dim sError As String
Dim LenMsg As Long

    ' se manda abrir el archivo
    RetVal = ShellExecute(0&, "open", FileName, 0&, vbNullString, SW_NORMAL)

    ' si se ha producido algún error
    If RetVal < 33 Then
        sError = Space(1024)
        ' obtenemos el mensaje de error que manda el sistema
        LenMsg = FormatMessage( _
                               FORMAT_MESSAGE_FROM_SYSTEM, _
                               ByVal 0&, _
                               RetVal, _
                               0&, _
                               sError, _
                               Len(sError), _
                               0&)
        ' devolvemos el mensaje de error
        OpenFile = Left(sError, LenMsg - 1)
    Else
        ' la función tuvo éxito
        OpenFile = True
    End If

End Function
'---------------------------------------------------------

Ejemplos:

 

Temas relacionados:

Imprimir un fichero o documento

 

Última actualización: 28/9/2005