• 👏 Bienvenido a nuestra comunidad Excel

    ¿Todavía no estás registrado? 😲

    Registrate gratis aquí y podrás:

    💪 Hacer preguntas a los expertos
    ⬇️ Descargar ejemplos y plantillas
    🏅 
    Acceder a contenidos premium

Listbox con más de 10 columnas

haroldofus

New member
Estimados, los molesto con la siguiente consulta. Quiero hacer un buscador de eventos en función de una lista, en principio la idea es buscar por fecha. Cuando muestro la tabla original se ven todas las columnas, pero cuando quiero hacer la consulta por fecha, me da error 380 y es por el limitante de columnas. Si hago el listado de menos de 10 columnas la macro funciona perfectamente. Estuve buscando y entiendo que la tengo que definir como un arreglo para que pueda ver todas las columnas en el Listbox pero no sé realmente cómo. Adjunto el archivo. Desde ya les agradezco la ayuda.
 

Adjuntos

haroldofus

New member
Se puede llenar un listbox/combobox con más de 10 columnas con AddItem utilizando un truquillo.
Muchisimas Gracias!!!, Excelente!, te molesto con otra consulta... cuando hago la busqueda me cambia el formato de dd/mm como lo tengo en la planilla a mm/dd que puedo hacer?. Muchas gracias de vuelta!
 
Última edición:

Antoni

Well-known member
No acabo de entender lo que dices, sube un archivo con más datos y pon un ejemplo de lo que te sucede.
 

haroldofus

New member
No acabo de entender lo que dices, sube un archivo con más datos y pon un ejemplo de lo que te sucede.
Antoni, ahi ví cual era mi problema. Tenía en la planilla configuradas las celdas como mm/dd y el userform me lo tomaba como dd/mm como realmente lo quería, asi que cambié el formato de las celdas de la hoja de excel y funcionó. Muchas gracias por la ayuda y por tu tiempo
 

protostecnologia

Active member
Estimados, los molesto con la siguiente consulta. Quiero hacer un buscador de eventos en función de una lista, en principio la idea es buscar por fecha. Cuando muestro la tabla original se ven todas las columnas, pero cuando quiero hacer la consulta por fecha, me da error 380 y es por el limitante de columnas. Si hago el listado de menos de 10 columnas la macro funciona perfectamente. Estuve buscando y entiendo que la tengo que definir como un arreglo para que pueda ver todas las columnas en el Listbox pero no sé realmente cómo. Adjunto el archivo. Desde ya les agradezco la ayuda.
Propongo otro enfoque, sin utilizar el metodo AddItem, el cual es bastante ineficiente.


Código:
Private Sub UserForm_Initialize()

'Parametros del Listbox
With Me.Listbox1

    .ColumnCount = 35
    .ColumnHeads = True
    
End With


End Sub


Private Sub fechabusqueda_Change()

Worksheets("hoja1").Activate
ultimafila = Cells(Rows.Count, "A").End(xlUp).Row
Listbox1.ColumnHeads = False

Dim x, Arr As Variant
Dim b() As Variant
Dim j As Long


'Busqueda inteligente

ReDim Preserve b(j)
b(0) = 1
j = 1

For fila = 2 To ultimafila

    fechaingreso = Worksheets("hoja1").Range("A" & fila).Value

            If fechaingreso Like "*" & Me.fechabusqueda.Value & "*" Or fila = 1 Then


            ReDim Preserve b(j)
            b(j) = fila
            j = j + 1

            End If

Next

If j = 0 Then
  MsgBox "No records"
  Exit Sub


 Else

  ReDim Preserve b(j)
  b(j) = Worksheets("hoja1").Range("A" & Rows.Count).End(xlUp).Row + 1


End If


   Arr = Application.Index(Cells, Application.Transpose(b), Application.Transpose([row(1:35)])) 'Generando el Array "Arr"
 
  'Formatea la columna 1 con formato de fecha "d/m/yyyy"
  For x = 1 To UBound(Arr)
    Arr(x, 1) = Format(Arr(x, 1), "d/m/yyyy")
  Next
  
Listbox1.List = Arr



End Sub


Este codigo permite cargar un listbox con mas de 10 columnas, utilizando la funcion Application.index y combinada con la busqueda inteligente.

El codigo completo es de mi creacion con aportes de algunas investigaciones.

Espero te sirva, saludos.


Paso adjunto
 

Adjuntos

haroldofus

New member
Propongo otro enfoque, sin utilizar el metodo AddItem, el cual es bastante ineficiente.


Código:
Private Sub UserForm_Initialize()

'Parametros del Listbox
With Me.Listbox1

    .ColumnCount = 35
    .ColumnHeads = True
   
End With


End Sub


Private Sub fechabusqueda_Change()

Worksheets("hoja1").Activate
ultimafila = Cells(Rows.Count, "A").End(xlUp).Row
Listbox1.ColumnHeads = False

Dim x, Arr As Variant
Dim b() As Variant
Dim j As Long


'Busqueda inteligente

ReDim Preserve b(j)
b(0) = 1
j = 1

For fila = 2 To ultimafila

    fechaingreso = Worksheets("hoja1").Range("A" & fila).Value

            If fechaingreso Like "*" & Me.fechabusqueda.Value & "*" Or fila = 1 Then


            ReDim Preserve b(j)
            b(j) = fila
            j = j + 1

            End If

Next

If j = 0 Then
  MsgBox "No records"
  Exit Sub


Else

  ReDim Preserve b(j)
  b(j) = Worksheets("hoja1").Range("A" & Rows.Count).End(xlUp).Row + 1


End If


   Arr = Application.Index(Cells, Application.Transpose(b), Application.Transpose([row(1:35)])) 'Generando el Array "Arr"

  'Formatea la columna 1 con formato de fecha "d/m/yyyy"
  For x = 1 To UBound(Arr)
    Arr(x, 1) = Format(Arr(x, 1), "d/m/yyyy")
  Next
 
Listbox1.List = Arr



End Sub


Este codigo permite cargar un listbox con mas de 10 columnas, utilizando la funcion Application.index y combinada con la busqueda inteligente.

El codigo completo es de mi creacion con aportes de algunas investigaciones.

Espero te sirva, saludos.


Paso adjunto
Genial! Muchísimas gracias por tu ayuda
 

Antoni

Well-known member
Propongo otro enfoque, sin utilizar el metodo AddItem, el cual es bastante ineficiente.
Este codigo permite cargar un listbox con mas de 10 columnas, utilizando la funcion Application.index y combinada con la busqueda inteligente.
El codigo completo es de mi creacion con aportes de algunas investigaciones.
Hablas de la supuesta ineficiencia del método Additem, pero no dices nada sobre la ineficiencia de recorrer todo el rango de datos fila a fila, te recomiendo que sigas investigando y te documentes sobre AdvancedFilter y RowSource y lo combines con el tuyo y quizá entonces si tengamos un código más eficiente. ¿No te parece? :)😷
 

protostecnologia

Active member
Hablas de la supuesta ineficiencia del método Additem, pero no dices nada sobre la ineficiencia de recorrer todo el rango de datos fila a fila, te recomiendo que sigas investigando y te documentes sobre AdvancedFilter y RowSource y lo combines con el tuyo y quizá entonces si tengamos un código más eficiente. ¿No te parece? :)😷
Estimado Antoni, tenes razon en que no es tan eficiente recorrer todo el rango de las filas.

Pero mi optimizacion no fue en esa seccion de codigo, sino en reemplazar el ineficiente ( y aunque no lo aceptes ) metodo Additem, por la funcion Application.index. Y ya que me aconsejas y me recomiendas que siga investigando (lo hago dia a dia), yo creo sin lugar a dudas que deberias tambien vos interiorizarte en esta funcion Application.index y leer un poco mas, no te parece?. Cuando ambos leamos sobre esos temas, seguiremos discutiendo.

Me olvidaba: No nos olvidemos que el metodo Additem no te permite de forma "natural" cargar un Listbox con mas de 10 columnas. :);).
Saludos.
 

Cacho R

Well-known member
Adjunto cuatro formas de conseguir lo mismo.
Cabe agregar que -a la larga- terminan en promedio tardando lo mismo, pero el método basado en la función de Excel INDICE converge más rápidamente a su valor promedio que el filtro avanzado o que el uso de un Recordset.

Mientras que el "viejo y querido" Copiar y Pegar parece ser un par de milisegundos más rápido presenta como ventaja adicional: mantener los formatos fácilmente.

Saludos, Cacho R.
 

Adjuntos

protostecnologia

Active member
Adjunto cuatro formas de conseguir lo mismo.
Cabe agregar que -a la larga- terminan en promedio tardando lo mismo, pero el método basado en la función de Excel INDICE converge más rápidamente a su valor promedio que el filtro avanzado o que el uso de un Recordset.

Mientras que el "viejo y querido" Copiar y Pegar parece ser un par de milisegundos más rápido presenta como ventaja adicional: mantener los formatos fácilmente.

Saludos, Cacho R.
Hola Cachor R, en el otro post sobre las alternativas, medi los tiempos de las 4 alternativas. Y dio como mas eficiente la del metodo Indice, tal como dices.

El codigo que propuse yo, es casi igual de eficiente que el metodo indice y hasta un poquitin mejor, a nivel de tiempo de respuesta. no a nivel de codigo.

El codigo que propuse yo con los mismos datos cargados en la hoja y el mismo ingreso en la caja de busqueda: Tiempo 21.48 ms.

eficiencia1.PNG

El codigo con el metodo indice : Tiempo 31.25 ms.

eficiencia2.PNG



Muchas gracias por todos los aportes Cacho R. Un gran saludo.
 

Cacho R

Well-known member
Ya fui explícito en el otro hilo. Pero: ¿Te diste cuenta que pusiste lo títulos en el popio listBox?...

Simplemente: te desplazas hacia abajo 15 o 20 filas y "pierdes los títulos" poniendo así en evidencia que el traspaso de la info a celdas para cargarlos a listBox mediante RowSource (en lugar de List) toma la "friolera" de 10 milisegundos: ¡Inaceptable!... Jajjjajajaj

O sea: no estás comparando lo mismo, ¿Ok?...
 

Cacho R

Well-known member
En mi opinión (es sólo una opinión) el uso de la función INDICE es muy interesante y veloz (aunque parece lo contrario).
Sin embargo la pérdida de los títulos y de los formatos me parece una "contra" a evaluar en cada caso, ¿No?...

Saludos, Cacho R.
 

protostecnologia

Active member
En mi opinión (es sólo una opinión) el uso de la función INDICE es muy interesante y veloz (aunque parece lo contrario).
Sin embargo la pérdida de los títulos y de los formatos me parece una "contra" a evaluar en cada caso, ¿No?...

Saludos, Cacho R.
Estimado Cacho R.

Tenes razon en cuanto a la perdida de los titulos, eso lo podria solucionar directamente, poniendo unos labels en el formulario para que tenga encabezado y listo.

Con respecto a la funcion indice, me gusta bastante por su velocidad. Aunque debo probarla mas. Muchas gracias.
 
Arriba