visual vbcritical sintaxis mensaje cuadro comando ms-access vba access-vba openfiledialog ms-access-2010

ms-access - vbcritical - sintaxis de msgbox en visual basic



¿Hay un cuadro de diálogo Abrir archivo para Access 2010 64bit? (7)

Nunca utilicé un control para el cuadro de diálogo Abrir archivo ya que solo es un contenedor para la llamada API de todos modos. Llamar al cuadro de diálogo Abrir / Guardar archivo de Windows estándar Además, puede haber problemas de distribución y control de versiones con los controles, así que hago todo lo posible para evitarlos.

¿Cómo obtengo un diálogo de Abrir archivo para Access 2010 64bit? Normalmente usaría el control de diálogo común, pero eso es de 32 bits y no se puede usar con Access 2010 de 64 bits.


En primer lugar, la "Clase CommonDialog" ni siquiera parece funcionar en una versión de 32 bits de Office. Da el mismo error OleDb. Como señala uno de los comentaristas, este no es el control que deberías estar usando. Y aunque podría haber otro control ActiveX que podría usar, no hay garantía de que esté disponible en cada máquina en la que quiera implementar su base de datos. Mi cuadro dev tiene Visual Studio 6, VS 2008 y VS 2010 en él, además de Office y otros programas, todos los cuales proporcionan archivos DLL de ActiveX que no se podría esperar que un usuario típico tenga. Además, muchas de estas bibliotecas no son redistribuibles, o presentan obstáculos de instalación únicos que pueden no valer la pena.

Con mucho, la solución más simple y universal es llamar al diálogo Abrir desde la API de Windows. Está ubicado en comdlg32.dll, que está disponible en todas las versiones de Windows a las que posiblemente pueda dirigirse, y no impone ninguna dependencia en comdlg32.ocx. También proporciona un mejor rendimiento que el uso de un control ActiveX porque no requiere que se cargue un módulo adicional en la memoria.

El código que se requiere tampoco es muy complicado. GetOpenFileName proporcionar una declaración para la función GetOpenFileName , que crea el cuadro de diálogo Abrir. Se necesita un único parámetro, una instancia de la estructura OPENFILENAME que contiene información utilizada para inicializar el cuadro de diálogo, así como también la ruta al archivo seleccionado por el usuario. Por lo tanto, también deberá proporcionar una declaración de esta estructura. El código en VBA sería algo como esto:

Private Type OPENFILENAME 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 Private Declare Function GetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (ByRef lpofn As OPENFILENAME) As Long

También hay un par de constantes que puede pasar como banderas para personalizar el comportamiento del diálogo. Para completar, aquí está la lista completa:

Private Const OFN_ALLOWMULTISELECT As Long = &H200 Private Const OFN_CREATEPROMPT As Long = &H2000 Private Const OFN_ENABLEHOOK As Long = &H20 Private Const OFN_ENABLETEMPLATE As Long = &H40 Private Const OFN_ENABLETEMPLATEHANDLE As Long = &H80 Private Const OFN_EXPLORER As Long = &H80000 Private Const OFN_EXTENSIONDIFFERENT As Long = &H400 Private Const OFN_FILEMUSTEXIST As Long = &H1000 Private Const OFN_HIDEREADONLY As Long = &H4 Private Const OFN_LONGNAMES As Long = &H200000 Private Const OFN_NOCHANGEDIR As Long = &H8 Private Const OFN_NODEREFERENCELINKS As Long = &H100000 Private Const OFN_NOLONGNAMES As Long = &H40000 Private Const OFN_NONETWORKBUTTON As Long = &H20000 Private Const OFN_NOREADONLYRETURN As Long = &H8000& Private Const OFN_NOTESTFILECREATE As Long = &H10000 Private Const OFN_NOVALIDATE As Long = &H100 Private Const OFN_OVERWRITEPROMPT As Long = &H2 Private Const OFN_PATHMUSTEXIST As Long = &H800 Private Const OFN_READONLY As Long = &H1 Private Const OFN_SHAREAWARE As Long = &H4000 Private Const OFN_SHAREFALLTHROUGH As Long = 2 Private Const OFN_SHAREWARN As Long = 0 Private Const OFN_SHARENOWARN As Long = 1 Private Const OFN_SHOWHELP As Long = &H10 Private Const OFS_MAXPATHNAME As Long = 260

Y para mayor comodidad, he envuelto todo este lío dentro de una función auxiliar a la que puede llamar desde dentro de VBA. Acepta como parámetros las propiedades que más comúnmente necesitará configurar para el diálogo de archivo abierto, maneja la API de Windows y luego devuelve la ruta completa al archivo seleccionado por el usuario, o una cadena vacía ( vbNullString ) si el usuario hizo clic en el botón Cancelar. Puede probar el valor de retorno en el código de llamada para determinar qué curso de acción tomar.

''This function shows the Windows Open File dialog with the specified '' parameters, and either returns the full path to the selected file, '' or an empty string if the user cancels. Public Function OpenFile(ByVal Title As String, ByVal Filter As String, _ ByVal FilterIndex As Integer, ByVal StartPath As String, _ Optional OwnerForm As Form = Nothing) As String ''Create and populate an OPENFILENAME structure ''using the specified parameters Dim ofn As OPENFILENAME With ofn .lStructSize = Len(ofn) If OwnerForm Is Nothing Then .hwndOwner = 0 Else .hwndOwner = OwnerForm.Hwnd End If .lpstrFilter = Filter .nFilterIndex = FilterIndex .lpstrFile = Space$(1024) & vbNullChar & vbNullChar .nMaxFile = Len(ofn.lpstrFile) .lpstrFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar .nMaxFileTitle = Len(.lpstrFileTitle) .lpstrInitialDir = StartPath & vbNullChar & vbNullChar .lpstrTitle = Title .flags = OFN_FILEMUSTEXIST End With ''Call the Windows API function to show the dialog If GetOpenFileName(ofn) = 0 Then ''The user pressed cancel, so return an empty string OpenFile = vbNullString Else ''The user selected a file, so remove the null-terminators '' and return the full path OpenFile = Trim$(Left$(ofn.lpstrFile, Len(ofn.lpstrFile) - 2)) End If End Function

Wow, eso terminó siendo largo. Hay muchas declaraciones que deberá copiar y pegar en un módulo, pero la interfaz con la que realmente tiene que lidiar es sorprendentemente simple. Aquí hay una muestra de cómo puede usar esto en su código para mostrar el diálogo de archivo abierto y obtener la ruta a un archivo:

Public Sub DoWork() ''Set the filter string (patterns) for the open file dialog Dim strFilter As String strFilter = "Text Files (*.txt)" & vbNullChar & "*.txt*" & vbNullChar & _ "All Files (*.*)" & vbNullChar & "*.*" & vbNullChar & vbNullChar ''Show the open file dialog with the custom title, the filters specified '' above, and starting in the root directory of the C: drive. Dim strFileToOpen As String strFileToOpen = OpenFile("Choose a file to open", strFilter, 0, "C:/") ''See if the user selected a file If strFileToOpen = vbNullString Then MsgBox "The user pressed the Cancel button." Else MsgBox "The user chose to open the following file: " & _ vbNewLine & strFileToOpen End If End Sub

La parte más larga de la redacción y prueba de esta solución fue, en realidad, intentar encontrar cómo abrir el editor de VBA y escribir una macro en Access. La cinta de opciones podría ser un gran invento para las personas que usan el menú principal para "Pegar" y "Guardar", pero qué dolor. Paso todo el día usando software, y todavía no puedo encontrar nada. [/despotricar]



Me perdí el detalle de acceso de 64 bits. Es muy poco probable que deba ejecutarlo, pero si lo es, aquí hay un artículo para su consideración que explica cómo debe modificar la llamada de API al trabajo: tiene que usar el nuevo tipo de datos de puntero largo:

Compatibilidad entre las versiones de Office 2010 de 32 bits y 64 bits

Si modifica el código de la API en consecuencia, debería funcionar bien en el acceso de 64 bits.

Pero realmente debería preguntar por qué está usando Access de 64 bits. Realmente, MS no recomienda en absoluto que alguien use Office de 64 bits a menos que tengan razones específicas por las que lo necesitan (como la necesidad de usar la memoria extra que proporciona, particularmente para cosas como los modelos complejos de hojas de cálculo de Excel). El acceso definitivamente no es una de las aplicaciones que se beneficia mucho con la conversión a 64 bits.

Discusión detallada del tema:

En resumen, la mayoría de las personas no debería ejecutar Office de 64 bits, precisamente por la razón que se encontró: hace que falle el código heredado con dependencias externas en componentes y API de 32 bits.


Puede usar el diálogo de archivo integrado. Ha estado allí desde el acceso 2003.

Dim f As FileDialog Set f = Application.FileDialog(msoFileDialogFilePicker) f.Show MsgBox "file choose was " & f.SelectedItems(1)

Puedes enlazar tarde si lo deseas:

necesidades anteriores: biblioteca de objetos de Microsoft Office 14.0

Si elimina la referencia a la biblioteca de objetos 14.0, entonces el siguiente código funcionará sin ninguna referencia:

Dim f As Object Set f = Application.FileDialog(3) f.AllowMultiSelect = True f.Show MsgBox "file choosen = " & f.SelectedItems.Count

Por lo tanto, anteriormente funciona en tiempo de ejecución o edición regular desde 2003 en adelante, y también funciona para las ediciones de acceso de 32 o 64 bits de 2010.


Estuve trabajando con este problema por un tiempo largo ...

Todo lo que has dicho arriba funciona, pero hay una última pieza para agregar ... bajo la declaración WITH OFN necesitas cambiar

.lStructSize = Len(ofn)

a

.lStructSize = LenB(ofn)

Y luego todo funciona.


Solo he estado luchando para resolver este problema en una versión de 64 bits de Excel 2013.

Una combinación de...

  1. Usar el tipo de datos LongPtr para 3 de los elementos ( hwndOwner , hInstance , lpfnHook ) en la estructura OPENFILENAME pasada a GetOpenFileNameA
  2. Reemplazar la función Len con la función LenB al obtener el tamaño de la estructura OPENFILENAME (como lo menciona Max Albanese)

... hizo el truco, gracias a la orientación documentada aquí: https://gpgonaccess.blogspot.co.uk/2010/03/work-in-progress-and-64-bit-vba.html