Option Compare Database Option Explicit '======================================================================= 'En este modulo se muestran las diferentes posibilidades 'que tenemos para abrir el cuadro de dialogo de escoger archivo 'A saber: Desde Access 2002 y 2003 el objeto nativo FileDIalog 'La API de Access 'La API de Windows 'y utilizando el objeto oculto WizHook de Access 'aunque intuyo y supongo que todos, conducen al mismo sitio, de una forma 'u otra, es decir, a la propia API de Windows. '======================================================================= '*************************************************************************** ' U T I L I Z A N D O A P I D E A C C E S S '*************************************************************************** 'El siguiente Tipo definido por el usuario, es para utilizar la propia API 'de Access (Realmente del ejecutable MSACCESS.EXE para abrir ficheros. 'Es la primera variedad de poder escoger ficheros. Expuesto en las News 'de Microsoft Access por Juan M. Afán de Ribera. Type OFFICEGETFILENAMEINFO hwndOwner As Long szAppName As String * 255 szDlgTitle As String * 255 szOpenTitle As String * 255 szFile As String * 4096 szInitialDir As String * 255 szFilter As String * 255 nFilterIndex As Long lView As Long flags As Long End Type Declare Function GetFileName _ Lib "msaccess.exe" _ Alias "#56" _ (gfni As OFFICEGETFILENAMEINFO, _ ByVal fOpen As Integer) As Long Function EscogeFichero_Con_ApiAccess() As String Dim FileInfo As OFFICEGETFILENAMEINFO With FileInfo .hwndOwner = Access.hWndAccessApp .szFilter = "Ficheros de texto (*.txt)" + Chr$(0) + "*.txt" + Chr$(0) .szInitialDir = "C:\" .szDlgTitle = "Escoja fichero de texto a cargar" .szOpenTitle = "Escojer ficheros con la API de Access" End With GetFileName FileInfo, True If FileInfo.szFile <> "" Then EscogeFichero_Con_ApiAccess = Trim(FileInfo.szFile) Else EscogeFichero_Con_ApiAccess = "" End If End Function '************************************************************************************** 'Aqui se termina el primer método de escoger fichero, utilizando API del propio Access '************************************************************************************** '************************************************************************************** 'Utiliznado el objeto nativo de Access 2002/2003 FileDialog. 'Expuesto por el Búho en las News de Microsoft Access '************************************************************************************** Function EscogeFichero_Con_OpenDialog() As String 'Esta segunda variante, es utilizando el objeto FileDialog 'que viene integrado en Access 2002/2003 'Se necesita referenciar en el editor de VBA Microsoft Office XX.X Object Library Dim vrtSelectedItem As Variant Dim fd As FileDialog, Escogido As String Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd .AllowMultiSelect = False 'Solo dejo coger un fichero (No multiseleccion) .InitialView = msoFileDialogViewPreview 'aqui hemos puesto la vista previa .Filters.Add "Archivos de texto: ", "*.txt", 1 'solo dejo ficheros de texto" .InitialFileName = "C:\" 'aqui digo en qué carpeta se tiene que abrir por defecto If .Show = -1 Then For Each vrtSelectedItem In .SelectedItems Escogido = vrtSelectedItem Next vrtSelectedItem EscogeFichero_Con_OpenDialog = Escogido Else EscogeFichero_Con_OpenDialog = "" End If End With Set fd = Nothing End Function '******************************************************************************************** 'Aqui se termina el segundo método de escoger fichero, utilizando FileDialog Access 2002/2003 '******************************************************************************************** '************************************************************************************** 'Tercer método: Utilizando el objeto Indocumentado Wizhook de Access: 'Seguramente, la más ingeniosa, gracias a la labor de investigación de Juan 'sobre el objeto indocumentado WizHook. Access 2000 o superior '************************************************************************************** Function EscogeFichero_Con_WizHook() As String '© Juan M. Afán de Ribera Dim wzhwndOwner As Long Dim wzAppName As String Dim wzDlgTitle As String Dim wzOpenTitle As String Dim wzFile As String Dim wzInitialDir As String Dim wzFilter As String Dim wzFilterIndex As Long Dim wzView As Long Dim wzflags As Long Dim wzfOpen As Boolean Dim ret As Long WizHook.Key = 51488399 wzhwndOwner = 0& wzAppName = "" wzDlgTitle = "Cuadro de diálogo con WizHook" wzOpenTitle = "Abrir con Wz" wzFile = String(255, Chr(0)) wzInitialDir = "C:\" wzFilter = "Archivos gráficos " _ & "(*.txt)" wzFilterIndex = 1 wzView = 1 wzflags = 64 wzfOpen = True ret = WizHook.GetFileName(wzhwndOwner, _ wzAppName, wzDlgTitle, wzOpenTitle, wzFile, _ wzInitialDir, wzFilter, wzFilterIndex, _ wzView, wzflags, wzfOpen) ' Si no se ha pulsado el botón Cancelar (-302) If ret <> -302 Then EscogeFichero_Con_WizHook = wzFile Else EscogeFichero_Con_WizHook = "" End If End Function '***************************************************************************************** 'Aqui se termina el tercer método de escoger fichero, utilizando WizHook del propio Access 'Si quieres saber más sobre este objeto indocumetado, visita la Web de Juan M. Afan 'http://www.juanmafan.tk/ '****************************************************************************************** '***************************************************************************************** 'El método de la API de Windows le pongo en otro módulo aparte. Y con este método de la API 'de Windows ya son 4 las formas de escoger ficheros desde Access, expuestas aquí 'Esta es la API conocida hasta ahora... 'Esto pegarlo en otro modulo aparte Option Compare Database Option Explicit 'Utilizando la Librería comdlg32.dll Private Declare Function AbrirArchivo Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As NOMBREARCHIVO) As Long Private Type NOMBREARCHIVO lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type ' NOMBREARCHIVO Function EscogeFichero_Con_ApiWindows() As String Dim strArchivo As NOMBREARCHIVO strArchivo.lStructSize = Len(strArchivo) ' establezco el filtro de archivos strArchivo.lpstrFilter = "Ficheros de texto (*.txt)" + Chr$(0) + "*.txt" + Chr$(0) ' creo un buffer para el nombre del archivo strArchivo.lpstrFile = Space$(254) ' establezco el tamaño máximo para el nombre del archivo strArchivo.nMaxFile = 255 ' creo un buffer para el titulo strArchivo.lpstrFileTitle = Space$(254) ' establezco el tamaño máximo para el titulo strArchivo.nMaxFileTitle = 255 ' establezco el directorio por defecto strArchivo.lpstrInitialDir = "C:\" ' establezco el titulo strArchivo.lpstrTitle = "Seleccionar Fichero de Texto" ' elimino flags strArchivo.flags = 0 ' abro el cuadro de dialogo y refresco la imagen If AbrirArchivo(strArchivo) Then EscogeFichero_Con_ApiWindows = Trim$(strArchivo.lpstrFile) Else EscogeFichero_Con_ApiWindows = "" End If End Function