Cuadro de diálog "Abrir archivo"
Saludos hen9! Podrías compartirme ¿cómo puedo invocar el cuadro de diálog "Abrir Archivo" común de Windows y usar el resultado? De antemano Gracias!
Respuesta de hen9
1
1
hen9, Experiencia de 10 años en manejo de programación en access,...
Activa operaciones de entrada/salida (E/S) con un archivo.
Sintaxis
Open rutaacceso [For modo] [Access acceso] [bloquear] As [#]númeroarchivo [Len=longitudregistro]
En este ejemplo se ilustran varios usos de la instrucción Open para habilitar operaciones de entrada y salida a un archivo.
El siguiente ejemplo abre en modo secuencial para entrada el archivo PRUEBA.
Open "PRUEBA" For Input As #1
' Cierra antes de volver a abrir en otro modo.
Close #1
Este ejemplo abre el archivo en modo binario para operaciones de sólo escritura.
Open "PRUEBA" For Binary Access Write As #1
' Cierra antes de volver a abrir en otro modo.
Close #1
El siguiente ejemplo abre el archivo en modo de acceso aleatorio. El archivo contiene registros del tipo definido por el usuario Record.
Type Record ' Define un tipo definido por el usuario.
Id As Integer
Nombre As String * 20
End Type
Dim MiRegistro As Record ' Declara una variable.
Open "PRUEBA" For Random As #1 Len = Len(MiRegistro)
' Cierra antes de volver a abrir en otro modo.
Close #1
Este ejemplo abre el archivo para salida secuencial; cualquier proceso podrá leer y escribir en el archivo.
Open "PRUEBA" For Output Shared As #1
' Cierra antes de volver a abrir en otro modo.
Close #1
Este ejemplo abre el archivo en modo binario para lectura; ningún otro proceso podrá leer el archivo.
Open "PRUEBA" For Binary Access Read Lock Read As #1
Sintaxis
Open rutaacceso [For modo] [Access acceso] [bloquear] As [#]númeroarchivo [Len=longitudregistro]
En este ejemplo se ilustran varios usos de la instrucción Open para habilitar operaciones de entrada y salida a un archivo.
El siguiente ejemplo abre en modo secuencial para entrada el archivo PRUEBA.
Open "PRUEBA" For Input As #1
' Cierra antes de volver a abrir en otro modo.
Close #1
Este ejemplo abre el archivo en modo binario para operaciones de sólo escritura.
Open "PRUEBA" For Binary Access Write As #1
' Cierra antes de volver a abrir en otro modo.
Close #1
El siguiente ejemplo abre el archivo en modo de acceso aleatorio. El archivo contiene registros del tipo definido por el usuario Record.
Type Record ' Define un tipo definido por el usuario.
Id As Integer
Nombre As String * 20
End Type
Dim MiRegistro As Record ' Declara una variable.
Open "PRUEBA" For Random As #1 Len = Len(MiRegistro)
' Cierra antes de volver a abrir en otro modo.
Close #1
Este ejemplo abre el archivo para salida secuencial; cualquier proceso podrá leer y escribir en el archivo.
Open "PRUEBA" For Output Shared As #1
' Cierra antes de volver a abrir en otro modo.
Close #1
Este ejemplo abre el archivo en modo binario para lectura; ningún otro proceso podrá leer el archivo.
Open "PRUEBA" For Binary Access Read Lock Read As #1
Oye Gracias por el esfuerzo, pero disculpame, no era eso de lo que estoy hablando : Cuando en casi cualquier aplicación Windows tu accesas a la opción del menu : 'File-Open', te aparece una ventana de dialogo común para que selecciones un archivo que se pueda abrir con la aplicación en cuestión. Esa ventana para selección es la que ando buscando invocar desde Access. He sabido que se puede, pero no se como. Mil disculpas por el malentendido y Muchas Gracias!
Hay varias alternativas, una es:
Un ejemplo de como abrir una MDB desde otra MDB (Que te copio más
abajo). Cuando digo 'abrir' me refiero a abrir otra instancia de access. En
ese código que te indico sobre el Docmd. Quit que te cerraría la actual base
de datos.
En realidad esa API vale para abrir cualquier fichero, en este caso la
aprovechamos para abrir una segunda instancia de access con otra mdb.
Y respecto a la segunda pregunta, con el ejemplo que te propongo, no hace
falta preocuparse si la segunda MDB esta abierta o no. Si no lo está, la
abre y si ya está abierta, simplemente la da el foco.
'esto en un modulo bas de tu aplicacion, por ejemplo
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
Public Const SW_SHOW = 1
'***********************************
'Esto en cualquier boton de comando de tu formulario
Dim FrmVentaActiva As Form
Set FrmVentaActiva = Me
ShellExecute FrmVentaActiva.hwnd, "open", "C:\Carpeta\DATOS.MDB", "", "",
SW_SHOW
Otro ejemplo es:
'Crea un módulo nuevo y pega este código. Nombre: basEjecutarAplicacion
Option Compare Database
Option Explicit
'********************************************************************************************
'API. Esta declaración es necesaria para la función mc_strEjecutarAplicación.
Public 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 apiShellExecute 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
'***App Window Constants***
Public Const WIN_NORMAL = 1 'Open Normal
Public Const WIN_MIN = 2 'Open Minimized
Public Const WIN_MAX = 3 'Open Maximized
'***Error Codes***
Private Const ERROR_SUCCESS = 32&
Private Const ERROR_NO_ASSOC = 31&
Private Const ERROR_OUT_OF_MEM = 0&
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
'** Fin de API para mc_strEjecutarAplicación ************************************************
Private Sub Demo_mc_strEjecutarAplicación()
'Abrir una carpeta:
' Call mc_strEjecutarAplicación("C:\TEMP\", WIN_MAX)
'Iniciar otra aplicación de Access:
' Call mc_strEjecutarAplicación("C:\Archivos de programa\Microsoft Office\Office\Ejemplos\Neptuno.mdb", WIN_NORMAL)
'Iniciar un programa cualquiera:
' Call mc_strEjecutarAplicación("C:\Archivos de programa\Accesorios\Wordpad.exe", WIN_NORMAL)
End Sub
Public Function mc_strEjecutarAplicación(strRutaArchivo As String, lngModoApertura As Long) As String
'********************************************************************************************
'Actualización: 02/04/2002 Fecha Creación: 21/10/2001
'Autor: Code Courtesy of Dev Ashish
'Modificación: McPegasus
'Contacto: [email protected], www.mcpegasus.com
'
'Propósito: Abrir un fichero(sabiendo su nombre y path) con el visor por defecto que _
tenga.
'Devuelve un valor True/False, dependiendo si se ha producido un error al intentar abrir.
'La sintaxis del Procedimiento o Función, consta de estos argumentos:
'Parte Descripción
'-------------------------------------------------------------------------------------------
'strRutaArchivo: Requerido Ruta completa, ver más en ejemplos en _
Demo_mc_strEjecutarAplicación _
lngModoApertura: Requerido Modo de apertura de la ventana _
WIN_NORMAL = Normal _
WIN_MAX = Maximizada _
WIN_MIN = Minimizada.
Dim lngResutado As Long
Dim strResultado As String
Dim varTaskID As Variant
'First try ShellExecute
lngResutado = apiShellExecute(hWndAccessApp, vbNullString, _
strRutaArchivo, vbNullString, vbNullString, lngModoApertura)
strResultado = vbNullString
If lngResutado > ERROR_SUCCESS Then
lngResutado = -1
Else
Select Case lngResutado
Case ERROR_NO_ASSOC:
'Abrir el cuadro de diálogo para seleccionar una aplicación. "Abrir con..."
varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " _
& strRutaArchivo, WIN_NORMAL)
lngResutado = (varTaskID <> 0)
Case ERROR_OUT_OF_MEM:
strResultado = strResultado & "No hay Memoria/Recursos."
Case ERROR_FILE_NOT_FOUND:
strResultado = strResultado & "Archivo no encontrado."
Case ERROR_PATH_NOT_FOUND:
strResultado = strResultado & "Ruta no encontrada."
Case ERROR_BAD_FORMAT:
strResultado = strResultado & "Formato de archivo desconocido."
Case Else:
strResultado = strResultado & "Indefinido."
End Select
strResultado = strResultado & vbCr & vbCr & "La aplicación no se puede ejecutar."
End If
If Not strResultado = "" Then
DoCmd.Beep
MsgBox strResultado, vbCritical + vbOKOnly, "McPegasus informa."
mc_strEjecutarAplicación = True
Else
mc_strEjecutarAplicación = False
End If
End Function
Un ejemplo de como abrir una MDB desde otra MDB (Que te copio más
abajo). Cuando digo 'abrir' me refiero a abrir otra instancia de access. En
ese código que te indico sobre el Docmd. Quit que te cerraría la actual base
de datos.
En realidad esa API vale para abrir cualquier fichero, en este caso la
aprovechamos para abrir una segunda instancia de access con otra mdb.
Y respecto a la segunda pregunta, con el ejemplo que te propongo, no hace
falta preocuparse si la segunda MDB esta abierta o no. Si no lo está, la
abre y si ya está abierta, simplemente la da el foco.
'esto en un modulo bas de tu aplicacion, por ejemplo
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
Public Const SW_SHOW = 1
'***********************************
'Esto en cualquier boton de comando de tu formulario
Dim FrmVentaActiva As Form
Set FrmVentaActiva = Me
ShellExecute FrmVentaActiva.hwnd, "open", "C:\Carpeta\DATOS.MDB", "", "",
SW_SHOW
Otro ejemplo es:
'Crea un módulo nuevo y pega este código. Nombre: basEjecutarAplicacion
Option Compare Database
Option Explicit
'********************************************************************************************
'API. Esta declaración es necesaria para la función mc_strEjecutarAplicación.
Public 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 apiShellExecute 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
'***App Window Constants***
Public Const WIN_NORMAL = 1 'Open Normal
Public Const WIN_MIN = 2 'Open Minimized
Public Const WIN_MAX = 3 'Open Maximized
'***Error Codes***
Private Const ERROR_SUCCESS = 32&
Private Const ERROR_NO_ASSOC = 31&
Private Const ERROR_OUT_OF_MEM = 0&
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
'** Fin de API para mc_strEjecutarAplicación ************************************************
Private Sub Demo_mc_strEjecutarAplicación()
'Abrir una carpeta:
' Call mc_strEjecutarAplicación("C:\TEMP\", WIN_MAX)
'Iniciar otra aplicación de Access:
' Call mc_strEjecutarAplicación("C:\Archivos de programa\Microsoft Office\Office\Ejemplos\Neptuno.mdb", WIN_NORMAL)
'Iniciar un programa cualquiera:
' Call mc_strEjecutarAplicación("C:\Archivos de programa\Accesorios\Wordpad.exe", WIN_NORMAL)
End Sub
Public Function mc_strEjecutarAplicación(strRutaArchivo As String, lngModoApertura As Long) As String
'********************************************************************************************
'Actualización: 02/04/2002 Fecha Creación: 21/10/2001
'Autor: Code Courtesy of Dev Ashish
'Modificación: McPegasus
'Contacto: [email protected], www.mcpegasus.com
'
'Propósito: Abrir un fichero(sabiendo su nombre y path) con el visor por defecto que _
tenga.
'Devuelve un valor True/False, dependiendo si se ha producido un error al intentar abrir.
'La sintaxis del Procedimiento o Función, consta de estos argumentos:
'Parte Descripción
'-------------------------------------------------------------------------------------------
'strRutaArchivo: Requerido Ruta completa, ver más en ejemplos en _
Demo_mc_strEjecutarAplicación _
lngModoApertura: Requerido Modo de apertura de la ventana _
WIN_NORMAL = Normal _
WIN_MAX = Maximizada _
WIN_MIN = Minimizada.
Dim lngResutado As Long
Dim strResultado As String
Dim varTaskID As Variant
'First try ShellExecute
lngResutado = apiShellExecute(hWndAccessApp, vbNullString, _
strRutaArchivo, vbNullString, vbNullString, lngModoApertura)
strResultado = vbNullString
If lngResutado > ERROR_SUCCESS Then
lngResutado = -1
Else
Select Case lngResutado
Case ERROR_NO_ASSOC:
'Abrir el cuadro de diálogo para seleccionar una aplicación. "Abrir con..."
varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " _
& strRutaArchivo, WIN_NORMAL)
lngResutado = (varTaskID <> 0)
Case ERROR_OUT_OF_MEM:
strResultado = strResultado & "No hay Memoria/Recursos."
Case ERROR_FILE_NOT_FOUND:
strResultado = strResultado & "Archivo no encontrado."
Case ERROR_PATH_NOT_FOUND:
strResultado = strResultado & "Ruta no encontrada."
Case ERROR_BAD_FORMAT:
strResultado = strResultado & "Formato de archivo desconocido."
Case Else:
strResultado = strResultado & "Indefinido."
End Select
strResultado = strResultado & vbCr & vbCr & "La aplicación no se puede ejecutar."
End If
If Not strResultado = "" Then
DoCmd.Beep
MsgBox strResultado, vbCritical + vbOKOnly, "McPegasus informa."
mc_strEjecutarAplicación = True
Else
mc_strEjecutarAplicación = False
End If
End Function
Oye Muchas Gracias! Si que te esfuerzas por ayudar. Solo quiero serte honesto. Ya he descubierto la solución: la encontré en un foro de herramientas VBA (http://www.ittoolbox.com)
Y en la página de MSDN. Descubrí que desde el office XP para acá, hay una nueva librería llamada Microsoft Office Library 10.0 que se debe incluir en los references y una vez hecho eso tienes a tu disposición el comando "Application.FileDialog(msoOpenFileDialog).Show". Este te invoca la ventana de dialogo común "File-Open" de Windows. Muchas gracias!
Y en la página de MSDN. Descubrí que desde el office XP para acá, hay una nueva librería llamada Microsoft Office Library 10.0 que se debe incluir en los references y una vez hecho eso tienes a tu disposición el comando "Application.FileDialog(msoOpenFileDialog).Show". Este te invoca la ventana de dialogo común "File-Open" de Windows. Muchas gracias!
- Compartir respuesta
- Anónimo
ahora mismo