ComboBox con listado de carpetas

En su día puse la siguiente pregunta y obtuve mi respuesta. En principio totalmente adecuada, sin embargo, me ha surgido un pequeño problema. Yo busco carpetas y no archivos, por lo que la función Dir me da como resultado ("."), y no me obtiene las carpetas creadas.
Tengo una capeta denominada "Contabilidad". Dentro de esta carpeta tengo una carpeta para cada año, es decir, 2010, 2011... He creado un formulario en el que he puesto un comboBox para poder elegir el año. He añadido como valores unos cuantos años(me he cubierto poniendo desde 2010 hasta 2015), de tal forma que al elegir el año abre un excel guardado en la carpeta correspondiente a ese año.
Sin embargo, me gustaría que los posibles valores del ComboBox fueran sólo los ejercicios creados, o lo que es lo mismo las carpetas existentes dentro de la carpeta "Contabilidad", es decir, de momento 2010 y 2011, pero al crear el ejercicio 2012, que también aparezca en entre los posibles valores del ComboBox.
Creo que podría poner una función al cargar este formulario, utilizando la función Dir, pero no se como hacerlo.
Gracias
Experto
Hola:
Se me ocurre que cargues el combo con el rango de años, por ej al abrir el formulario, en lugar de asignarle un rango de valores desde sus propiedades.
En el evento Initialize del form colocá esto:
Private Sub UserForm_Initialize()
'por Elsamatilde
anio = Year(Date)
For i = 2010 To anio
ComboBox1.AddItem i
Next i
End Sub
Sdos
Elsa
http://aplicaexcel.galeon.com/index.htm
Usuario
Por tanto, ¿no es posible utilizar alguna función (p.e. Dir) que enumere las carpetas existentes en la carpeta Contabilidad y traspasar esos valores al ComboBox?
Experto
Si, también se puede, pero como mencionaste que ...'valores del ComboBox fueran sólo los ejercicios creados, o lo que es lo mismo las carpetas existentes...'
Si era lo mismo te dejé la más sencilla... Aquí va la más larga. Notarás que el combo lleva el nombre de los libros, es decir con extensión (*)
Private Sub UserForm_Activate()
'por Elsamatilde
Dim strArchivos As String
Dim strNombreCarpeta As String
'carpeta donde se hará la búsqueda - AJUSTAR
strNombreCarpeta = "C:\Documents and Settings\All Users\Documentos\CarpetaAños\"
'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("*.xlsm")
'recorremos los archivos de la carpeta
Do While strArchivos <> ""
'mostramos el nombre de cada archivo encontrado
ComboBox1.AddItem strArchivos
'obtenemos la siguiente entrada
strArchivos = Dir
Loop
Exit Sub
sincarpeta:
MsgBox "No se encuentra la carpeta en el directorio " & strNombreCarpeta, , "ERROR"
Unload Me
End Sub

2 Respuestas

Respuesta
1
Ahora que lo leo reparo en que efectivamente solicitaste lista de 'carpetas'.
Bien, aquí va entonces una rutina para que la adaptes a tu combo:
Sub soloCarpetas()
'por Elsamatilde
ruta = "C:\Users\Usuario\Documents\"     'coloca la ruta de tu directorio a evaluar
nombre = Dir(ruta, 16)     'fijate en la Ayuda el valor del 2do argumento (*)
Range("A5").Select
Do While nombre <> ""
ActiveCell.Value = nombre
ActiveCell.Offset(1, 0).Select
nombre = Dir()
Loop
End Sub
(*) en este caso se trata de : directorios o carpetas además de archivos sin atributos.
He hecho una combinación de ambas para poder añadir los resultados al ComboBox, pero me surgen dos problemas:
Private Sub UserForm_Activate()
'por Elsamatilde
Dim strArchivos As String
Dim strNombreCarpeta As String   'carpeta donde se hará la búsqueda - AJUSTAR
strNombreCarpeta = "C:\Documents and Settings\All Users\Documentos\CarpetaAños\"
'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 archivo encontrado
ComboBox1.AddItem strArchivos
'obtenemos la siguiente entrada
strArchivos = Dir()
Loop
Exit Sub
sincarpeta:
MsgBox "No se encuentra la carpeta en el directorio " & strNombreCarpeta, , "ERROR"
Unload Me
End Sub
Pero me han surgido dos problemas:
1.- La función Dir(strNombreCarpeta, 16) me da como resultado "."
2.- En la línea ComboBox1.AddItem strArchivos, me sale el siguiente error "Se ha producido el error 70 en tiempo de ejecución: permiso denegado." Y no consigo encontrar donde dar ese permiso de acceso.
GRACIAS por tu esfuerzo
El pto 1 es correcto en parte, porque te devuelve la lista de carpetas además de algunos elementos solo con ptos. Te recuerdo lo que dice la Ayuda: Especifica directorios o carpetas además de archivos sin atributos
El 2do problema no sé porqué se te produce... ¿se me ocurre que quizás tengas un rango asignado al combo? La propiedad RowSource debe quedar vacía
Para evitar las entradas con . (en mi directorio aparecen 2 : con 1 y 2 puntos) lo evito con esta instrucción:
'mostramos el nombre de cada elemento encontrado si no tiene puntos
If InStr(strArchivos, ".") = 0 Then ComboBox1.AddItem strArchivos
Si tus carpetas tienen x nbre el año, es decir que tienen mínimo un largo de 4, podrías evaluarlo con esta otra:
If Len(strArchivos) > 3 then Combobox1 AddItem strArchivos
Respuesta

Buenos días/tardes/noches sra. Elsa Matilde.

Espero que disfrute de esta semana santa y espero también que descanse.

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 suya 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ía ayudarme al respecto?
Anexo encontrara el link de su respuesta de enero de 2012:

ComboBox con listado de carpetas

Como vera en el codigo a continuación, 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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas