FileDialog Error de compilación: No se ha definido el tipo definido por el usuario

Desde un procedimiento de formulario, llamo a una función que se llama "CarpetaArchivo" a la cual le paso un valor. La función la tengo en un módulo llamado "basFileDialog". La función está basada en el ejemplo que Microsoft muestra en la Ayuda, pero no me está funcionando. Me da el siguiente error:
Error de compilación
   No se ha definido e tipo definido por el usuario

Y de hay no salgo. La función tiene lo siguiente:
Function CarpetaArchivo(strBuscar As String) As String
'Requiere referencia a Microsoft Office 12.0 Object Library.
   Dim fDialog As Office.FileDialog
   'Set up the File Dialog.
   If strBuscar = "carpeta" Then
      Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
   Else
      Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
   End If
   With fDialog
      .AllowMultiSelect = False
      .ButtonName = "Seleccionar"
      .Title = "Seleccionar el archivo o la carpeta"
      .InitialFileName = "C:\"
      .InitialView = msoFileDialogViewDetails
      .Filters.Clear
      .Filters.Add "Ficheros Excel", "*.xls; *.xlsx"
      .Filters.Add "All Files", "*.*"
      If .Show = True Then
         CarpetaArchivo = .SelectedItems(1)
      Else
         MsgBox "Ha pulsado el botón <Cancelar>."
      End If
   End With
End Function

la llamada a la función se realiza de la siguiente forma:
   strPath = CarpetaArchivo("carpeta")

En este caso le paso un valor "carpeta" para que me devuelva la ruta de la carpeta que seleccione (para exportar access a excel), de esta forma si le paso el valor "archivo" que me devuelva la ruta del archivo seleccionado (para cargas de excel a access)y lógicamente la referencia a Microsoft Office 12.0 Object Library, la tengo activada.
¿Me podrías decir que es lo que estoy haciendo mal para que no me funcione el FileDialog?

2 Respuestas

Respuesta
3
Te comento un par de cositas sobre la consulta que me haces, a ver si podemos hacer que "pirule".
1. En el código tienes todas las variables bien definidas, por lo que el problema que me comentas no te viene de la función CarpetaArchivo, sino que debe de venir de la llamada a la función.
2. Me comentas que la llamada a la función es strPath = CarpetaArchivo("carpeta"). Antes de la llamada a la función escribe la definición de la variable. El código debería quedarte así:
---
    Dim strPath As String
    strPath = CarpetaArchivo("carpeta")
---
Si vieras la posibilidad de que strPath te devolviera un valor vacío (nulo), para evitarte el error de "Uso no válido de Null", define strPath como Variant, y colocas una salida al procedimiento (si no ves que pueda ocurrir eso pues dejas el código de arriba). Por ejemplo, podría quedarte una cosa así:
---
    Dim strPath As Variant
    If IsNull(strPath) Then Exit Sub
    strPath = CarpetaArchivo("carpeta")
---
3. El código de la función te va a dar un error de "el objeto no admite esta propiedad o método". Esto te viene dado por las líneas de código:
.Filters.Add "Ficheros Excel", "*.xls; *.xlsx"
.Filters.Add "All Files", "*.*"
Eso te lo da por lo siguiente:
Cuando estableces, a través del bloque IF... END IF, la variable fDialog mediante "Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)" te estás refiriendo a la una carpeta (FolderPicker), y una carpeta no tiene extensión. Por el contrario, cuando utilizas "Set fDialog = Application.FileDialog(msoFileDialogFilePicker)" te estás refiriendo a un archivo (FilePicker), y un archivo sí tiene extensión, y en este caso el procedimiento sí te admitirá la adición de filtros.
4. Finalmente, como lo que me comentas es que lo que quieres es pillar una ruta hasta un archivo Excel situado en el disco duro, yo dejaría el código de la función un poco más simplificado (teniendo en cuenta que, al desconocer exactamente cuál es el proceso global que quieres hacer, quizá no sea la solución óptima para ti). El código podría quedar así (sin tener que pasarle ningún argumento):
Nota: si quieres probarlo inserta un módulo y haz un copy-paste en ese módulo del código que te indico, cambiando el nombre de la función. Después puedes hacer pruebas en la llamada a la función desde el formulario cambiando simplemente strPath = nuevonombrefuncion(). Así no te "cargarás" el vas que tienes ya hecho, por si acaso ;)
---
Function CarpetaArchivo() As String
'Requiere referencia a Microsoft Office 12.0 Object Library.
   Dim fDialog As Office.FileDialog
   'Set up the File Dialog.
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
   With fDialog
      .AllowMultiSelect = False
      .ButtonName = "Seleccionar"
      .Title = "Seleccionar el archivo o la carpeta"
      .InitialFileName = "C:\"
      .InitialView = msoFileDialogViewDetails
      .Filters.Clear
      .Filters.Add "Ficheros Excel", "*.xls; *.xlsx"
      .Filters.Add "All Files", "*.*"
      If .Show = True Then
         CarpetaArchivo = .SelectedItems(1)
      Else
         MsgBox "Ha pulsado el botón <Cancelar>."
      End If
   End With
End Function
---
Y la llamada a la función simplemente:
---
Dim strPath As String
strPath = CarpetaArchivo()
---
Ya me dirás qué tal te ha ido ;)
Bueno, ya he probado con el código que me indicas y me sigue dando el mismo error:
Error de compilación
No se ha definido el tipo definido por el usuario

Y el error se posiciona en la línea de código:
Dim fDialog As Office.FileDialog
No sé que más hacer, es muy raro, ¿ves algo más?, ¿Es posible que te pueda pasar un fichero reducido y le das un vistazo?
Quedo a la espera
Saludos
Juanjo
Pues sí que es extraño... Pásamelo y lo miro, a ver si descubro alguna cosa que me suene "rara".
Mi correo es [email protected]
He estado echando un vistazo por Internet y la mayoría de respuestas que he visto sobre el problema que a ti te sale dan como solución registrar la referencia "Microsoft Office 12.0 Object Library".
Aunque parezca una tontería comprueba de nuevo si efectivamente tienes esa librería registrada... por si acaso.
Ya me dirás cosas.
Hola,
Ya te lo he enviado.
Gracias
Saludos
Ya tienes la respuesta. Ya me dirás ;
Respuesta

Posiblemente ya el problema fue resuelto.

Pero voy a escribir mi respuesta, por si alguien más tiene el mismo problema.

Esto sucede con versiones de Access viejitas y lo que se debe hacer es activar la referencia de la Librería "Office".

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas