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

1 respuesta

Respuesta
1

Te anexo todo el código. Funciona de la siguiente manera:

  • En el evento activate, cambia "C:\trabajo\", por la ruta inicial donde desees empezar.
  • En el combo te va a aparecer la ruta "..", significa que si seleccionas ese dato, se cambiará a la carpeta inmediata superior.
  • En la rutina CargaCombo( ) se cargan todos los archivos y también las carpetas.
  • Si selecionas una carpeta, se borra el combo y se cargan los archivos y carpetas contenidos en la carpeta seleccionada
  • Si seleccionas un archivo, entonces se abre el archivo.
  • Nota: utilice FollowHyperlink para abrir el archivo, es más práctica que la función ShellExecute, además no pusiste la delcaración de la función.
  • Si seleccionas una carpeta, en automático se cargan los archivos en el combo y también se despliega la lista del combo.
Public ruta
'
Private Sub ComboBox1_Change()
'Por.Dante Amor
    '
    If ComboBox1 = "" Or ComboBox1.ListIndex = -1 Then Exit Sub
    dato = ruta & ComboBox1.Value
    If ((GetAttr(dato) And vbDirectory) = 16) Then  'si es carpeta, cambia la ruta
        ComboBox1.Clear
        ruta = dato & "\"                           'cambia la ruta
        Call CargaCombo                             'cargar carpetas y archivos
        SendKeys "%{Down}"                          'Para desplegar el combo
    Else
        ActiveWorkbook.FollowHyperlink dato         'para abrir el archivo
    End If
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    ruta = "C:\trabajo\"    'ruta inicial
    Call CargaCombo
    ComboBox1.DropDown
End Sub
'
Sub CargaCombo()
'Por.Dante Amor
    '
    'Cargar todos los archivos (carpetas y archivos)
    ChDir ruta
    arch = Dir("*.*", vbDirectory)
    Do While arch <> ""
        If arch <> "." Then
            ComboBox1.AddItem arch
        End If
        arch = Dir()
    Loop
    ComboBox1.DropDown
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

¡Gracias! 

Justo lo estaba buscando, un código corto y efectivo.

Lo he probado arrancando el archivo con la ruta de una memoria externa pero he tenido problemas.

Por lo demás, EXCELENTE!!
Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas