Jump to content
cottavi

ComoboBox que lista el contenido de un directorio, al pulsar un item, abre un archivo o una carpeta

Recommended Posts

ComboBox que lista las sub carpetas (y archivos) de un directorio, seleccionar un item

Buenos días/tardes/noches al foro.

Espero que disfruten de esta semana santa y espero también que descansen.

Mi problema es el siguiente:

Deseo ejecutar una macro en excel para aplicaciones para vaciar el contenido de un directorio en un combobox, en dicho combobox se listaran las carpetas y los archivos que existan en ese directorio. Si al seleccionar un item en el combobox, este es una sub carpeta, esta se abrirá mostrando su contenido (como al inicio), pero si es un archivo abrirá el archivo sin importar su extensión. Para abrir el archivo he creado una rutina llamada "abrir".

Me he apoyado en una respuesta de la Sra Elsa Matilde del 13 de enero de 2012 y la he adaptado a mi propósito pero tengo problemas al cargar de nuevo el combobox con la nueva ruta.

¿Podrían ayudarme al respecto?
Anexo encontraran el link de Elsa Matilde de enero de 2012:

ComboBox con listado de carpetas

A continuación encontraran el código completo que estoy utilizando y las notas que voy dejando.

Como verán en el código solo tengo un UserForm, un ComboBox y un botón para salir.

Este es el código:

Public strArchivos As String

Public strNombreCarpeta As String

Public ruta As String

Public archivo As String

Sub AUTO_OPEN()

Load UserForm1

UserForm1.Show

End Sub

Sub abrir(archivo As String)

'con esta sub rutina se abren los archivos seleccionados sin importar su extensión

ShellExecute Application.Hwnd, "Open", archivo, _
vbNullString, _
vbNullString, _
SW_SHOWNORMAL

End Sub

Private Sub ComboBox1_Click()

'aqui añadimos la variable strNombreCarpeta lo seleccionado en el ComboBox1

strNombreCarpeta = ruta & ComboBox1.Text
archivo = strNombreCarpeta

'si lo seleccionado en el combobox1 es un texto, vuelve a cargar el combobox1
'con el contenido de la nueva ruta

'de lo contrario, llama a la rutina "abrir" para abrir el archivo sin importar su extensión

End Sub

Private Sub CommandButton1_Click()

Unload Me

End Sub

Private Sub UserForm_Activate()

'por Elsamatilde en:
'http://www.todoexpertos.com/categorias/tecnologia-e-internet/software-y-aplicaciones/microsoft-excel/respuestas/onu9ao4jz3afw/combobox-con-listado-de-carpetas

'carpeta donde se hará la búsqueda - AJUSTAR
strNombreCarpeta = "C:\Users\Usuario\Downloads\Ppto\"
'guardamos la ruta inicial para luego pegarle el directorio (o el nombre del archivo)
'seleccionado en el comobobox1
ruta = strNombreCarpeta
'limpiamos el combobox1
ComboBox1.Clear

'pasamos al directorio elegido
On Error GoTo sincarpeta
ChDir strNombreCarpeta
On Error GoTo 0

'recorremos la carpeta buscando archivos de esta extensión - AJUSTAR EXTENSIÓN
strArchivos = Dir(strNombreCarpeta, 16)

'recorremos los archivos de la carpeta
Do While strArchivos <> ""

'mostramos el nombre de cada elemento encontrado si no tiene puntos

'con esta instrucción solo se ven los directorios (carpetas)

'If InStr(strArchivos, ".") = 0 Then ComboBox1.AddItem strArchivos

'con esta instrucción vemos todo (archivos y carpetas, incluye archivos . Y ..)
ComboBox1. AddItem strArchivos

'obtenemos la siguiente entrada
strArchivos = Dir()
Loop

Exit Sub

sincarpeta:

MsgBox "La carpeta seleccionada está vacia" & strNombreCarpeta, , "ERROR"

Unload Me

End Sub

ComboBox con listado de carpetas-rev3.rar

Share this post


Link to post
Share on other sites

Hola cottavi,

Cambia tu procedimiento 'Sub Abrir' por este.

En RutaExcel debes de poner donde tienes tu ejecutable de Excel.exe (en mi caso la que te he puesto), mas un espacio en blanco( fijate)
 

Sub Abrir_Click()
    archivo = ruta & ComboBox1.Text
    RutaExcel = "C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe "
    ejecutar = Shell(RutaExcel & archivo, vbMaximizedFocus)
End Sub

Saludos

Ikanni

Share this post


Link to post
Share on other sites

Gracias ikkani por tu sugerencia.

Te recomiendo utilizar mi sub rutina pues te permite abrir cualquier archivo en cualquier ordenador, sin importar la ruta donde este el .exe.

Deseo aclarar que esta sub rutina no es de mi autoría, estaba como parte de un archivo que baje de la red.

Saludos.

Share this post


Link to post
Share on other sites

Hola cottavi,

La verdad no se por donde empezar. Voy a empezar por lo primero.

Me bajo tu archivo y normalmete lo primero que hago es compilar para ver si hay algun error antes de ponerme a ver tu problema.

Depuro y me da error de compilación. No se ha definido la Sub o función.

Me señala la linea       ShellExecute...., como la función la conozco, pertenece a la API de Win. Estonces deduzco que el error es que no has declarado la API. Las API's hay que declararlas a nivel de módulo y como la estas usando en un UserForm pues la deberias de declarar a nivel de formulario. Busco por internet cual es la frase (no me la se de memoria) y la coloco

Delclaración de variable :

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

Entonces veo que ya no da error. Me pongo con tu pregunta

En tu pregunta

... pero tengo problemas al cargar de nuevo el combobox con la nueva ruta.

me pongo con el combobox,  aver como esta todo... y me encuentro

 Private Sub ComboBox1_Click()

'aqui añadimos la variable strNombreCarpeta lo seleccionado en el ComboBox1

strNombreCarpeta = ruta & ComboBox1.Text
archivo = strNombreCarpeta

'si lo seleccionado en el combobox1 es un texto, vuelve a cargar el combobox1
'con el contenido de la nueva ruta

'de lo contrario, llama a la rutina "abrir" para abrir el archivo sin importar su extensión

End Sub 

Luego en la variable strNombreCarpeta guardas una cadena compuesta por una ruta ya prefijada

 "C:\Users\Usuario\Downloads\Ppto\" unida al archivo del combo, y luego me nombras la variable archivo a la variable con la ruta y el archivo (¿Para qué?). y sigo para abajo y termina el procedimiento. Ahi va¡¡¡¡ ¿Que hace ese procedimiento?, no hace realmente nada.

Sigo echando una ojeada al código....y me encuentro que poones un comentario cuando activas el Userform

'recorremos la carpeta buscando archivos de esta extensión - AJUSTAR EXTENSIÓN
strArchivos = Dir(strNombreCarpeta, 16)

Entiendo que lo que quieres es abrir archivos con una extensión en particular y deduzco que serán hojas de calculo .

Entonces para dar una solución a la pregunta que has hecho. Pienso que para abrir hojas de calculo, no hace falta usar las API's de windows, no sé es como usar un camion para trasportar una tarta:D....

Asi que te creo un procedimiento que te abra Hojas de calculo segun el archivo que elijas en el combobox usando las variables publicas que habías creado. Sí pruebas mi procedimiento veras que funciona perfecto

Pero si quieres seguir usando la API, libre eres de hacer lo que te venga en gana...

cambia tu procedimiento

Private Sub ComboBox1_Click()

'aqui añadimos la variable strNombreCarpeta lo seleccionado en el ComboBox1


    strNombreCarpeta = ruta & ComboBox1.Text
    
    archivo = strNombreCarpeta
    

'si lo seleccionado en el combobox1 es un texto, vuelve a cargar el combobox1
'con el contenido de la nueva ruta




'de lo contrario, llama a la rutina "abrir" para abrir el archivo sin importar su extensión




End Sub

por este otro....

Private Sub ComboBox1_Click()

'aqui añadimos la variable strNombreCarpeta lo seleccionado en el ComboBox1


    strNombreCarpeta = ruta & ComboBox1.Text
    
    abrir strNombreCarpeta
    

'si lo seleccionado en el combobox1 es un texto, vuelve a cargar el combobox1
'con el contenido de la nueva ruta




'de lo contrario, llama a la rutina "abrir" para abrir el archivo sin importar su extensión




End Sub

 Ah y no te olvides de declarar la API..... que sino tampoco funcionará

 

Saludos

Ikanni

 

 

Share this post


Link to post
Share on other sites

 

Buenos días/tardes/noches al foro.

Gracias por sus comentarios y aportes.

Amigo ikanni en relación a tus comentarios, deseo puntualizar lo siguiente:

1.- Mi objetivo con esta rutina es buscar archivos dentro de las sub carpetas de un directorio raíz.

2.- No soy un programador de macros, para desarrollar mis ideas dedico tiempo y esfuerzo a estudiar los foros, a seguir consejos y trozos de códigos que me ayuden a desarrollar mi idea. He allí el porqué encuentras errores.

3.- En relación a la “Declaración de variable: Private Declare Function ShellExecute….”, acepto el consejo. Quizás el problema que vez es que deseo abrir “cualquier” archivo.

4.- En relación a tu segundo comentario en “Private Sub ComboBox1_Click()” donde preguntas que hace el código, pues ese es el objetivo de mi pregunta: que hacer en este caso?

Más adelante explicare lo que deseo de una manera coloquial.

5.- En cuanto al tipo de extensión del archivo, deseo abrir cualquier extensión (doc, xls, dwg, ppt, txt, avi, mp3, wav, jpeg, ….), siempre y cuando el programa al que se refiere la extensión esté instalado en el ordenador, de lo contrario está claro que no se podrá abrir.

6.- Gracias por el procedimiento para abrir hojas de cálculo.

A continuación, explico de forma coloquial lo que deseo hacer en el punto 4, en el evento click del combobox1, el cual pretendo resolver con un simple "if":

Hasta este momento, tengo una ruta inicial (C:\Users\Usuario\Downloads\CalVarVB6N-foro) a la cual le he “pegado” un ítem seleccionado en el combobox1, aquí se presentan dos casos:

a.- La selección es una sub carpeta, por ejemplo:

C:\Users\Usuario\Downloads\CalVarVB6N-foro\Aca-Autocad

b.- La selección es un archivo, por ejemplo:

C:\Users\Usuario\Downloads\CalVarVB6N-foro\dibujo.dwg

Ahora bien, para saber si lo que he seleccionado es una sub carpeta o un archivo, mi idea es identificar el carácter “.” Pues el solamente aparece cuando selecciono un archivo (por ejemplo dibujo.dwg)

Esta es la esencia de mi pregunta al foro: como identificar el carácter "." en una cadena de texto?

Si el resultado es que hay un “.”, significa que tengo un archivo y ejecuto Sub abrir(archivo As String),

Si no hay “.”, significa que tengo una nueva dirección donde buscar (C:\Users\Usuario\Downloads\CalVarVB6N-foro\Aca-Autocad), lleno el combobox1 con el contenido de esta nueva dirección y repito el proceso hasta encontrar el archivo que me interesa.  

Espero haber aclarado las dudas al respecto.

A la espera de sus oportunos comentarios y agradeciendo los realizados por ikanni

Saludos.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png