Como sacar estadísticos de datos del lisbox la cual mencionare en la descripción

Siguiendo con la duda y las investigaciones y también gracias a las ayudas y recomendaciones constantes de los expertos JAMES BOND y Andy Machin sobre los lisbox.

En mi anterior pregunta tenia un problema buscar en un lisbox de más de 10 columnas ya que solo soporta hasta 10 y me recomendaron utilizar arrys y otros métodos, me puse investigar y leer lo cual solucione este problema de como cargar mi lisbox y buscar por tres criterios solo seleccionando en el control OptionButton y buscar en una caja de texto ahora ya funciona perfecto así tenga más de 10 columnas.

Ahora lo que no logro adaptarle al código es que al momento de seleccionar profesión y cuando busque me aparezca los estadísticos mencionados como Nota Aprobada Mayor, Nota Aprobada Menor, Nota Desaprobada menor y Disponibles(Esto es que cuando hayan coincidencias en la búsqueda como por ejemplo LENGUAJE, me tiene que traer de la hoja profesión el numero de lo que se necesitan ese caso fue 2)

Esta es la hoja cuando la ejecuto la hoja busca perfecto y cuando le de en el botón profesión se me activen los estadísticos y si quiero buscar las profesiones vayan cambiando los estadísticos dependiendo de las notas cargadas en el lisbox.

No sae hasta que punto se puede realizar con este código.

adjunto hoja de trabajo.

https://drive.google.com/file/d/1u6TFcKA7pZFWt3ghHxzv6lr_k2kJIjkX/view?usp=sharing 

1 respuesta

Respuesta
1

Como te mencione en otro post los array son muy buenos y excelentes para cargar información de forma masiva el único inconveniente es que tienen sus desventajs y limitaciones una de ellas es que se rquiere demasiado código para hacer cálculos o comparaciones como encontrar máximo y mínimos en este archivo te muestro una opción con una cantidad mínima de código, la macro usa

1.- Array para carga de información

2.- Usa tablas insertadas para facilitar la programación es este caso se llaman alumnos y cursos

3.- Usa opciones de autofiltrado para búsqueda masiva de información y hace copias masivas de datos a una hoja auxiliar desde donde los combobox y listbox lo cargan masivamente, no uso la opción additem porque es una programación muy lenta y limitada a 11 columnas

4.- Usa instrucciones set que es lo mismo que usar matrices o arrays con la única diferencia que no tiene las limitaciones de los array

5.- Usa funciones naturales de Excel worksheetfunction. Max(), worksheetfunction. Min, con lo cual con una sola instruccion se hace lo mismo que con una programacion de array de mas de 20 lineas para encontrar el maximo y minimo

6.- La carga se hace a través de rowsource dinámico el cual sin importar cuanto añadas o quites a la tabla insertada de Excel este lo toma en cuenta a la hora de cargarlo

Todo esto combinado da una macro muy simple y al vez muy veloz otra cosa agregue 4 combobox en el primero se cargaran los nombre de las columnas una vez que selecciones uno, los datos de esta columna se cargaran al combobox2 y hará el primer filtrado de datos después que selecciones un curso de esta columna junto con las estadísticas, en la columna 3 se cargaran de nuevo los títulos de las columnas y una vez que selecciones uno hará un segundo filtro dentro del filtro, es decir si el primer filtro es lenguaje, podrás filtrar por cualquiera de las 11 columnas y te mostrara las estadísticas, esto es más practico que los opttion button, prueba la macro, a pesar de que le hice un, montón de pruebas y depure los errores que se presentaron pudieran presentarse otros-

https://1drv.ms/x/s!Aqt18sdMf2xXiSNeHAOyyjR3GfQn 

Experto JAMES BOND, el archivo enviado es el mismo del anterior no es el actualizado este no tiene lo que menciona.

Pongo de nuevo el link del archivo https://1drv.ms/x/s!Aqt18sdMf2xXiSdB2fsZRuKG7ntb y estas son las imagenes del resultado, en el combobox 1 seleccionas la columna de busqueda, al hacerlo se cargan los datos de esa columna excluyendo los duplicados y hara los calculos de las estadisticas en esta segunda imagen seleccionas un segundo parametro de filtrado e igual se cargaran los datos de esa columna en el combobox4 excluyendo duplicados, seleccionas un dato de ese combobox y te hara un segundo filtrado sobre el primer filtrado cargandolo al listbox y calculando las estadisticas, en este cambio sustitui los option button por los combobox ya que te da posibilidades infinitas de filtrado sobre cualquier columna que selecciones en los combobox 1 y 3

Y en esta tercera imagen te muestro las tres tablas creadas en Excel en cuato selecciones una te enviara directo a esa tabla es como un hipervinculo solo que con mucho mas ventajas

 Si quedo bien Experto JAMES BOND, pero no se si ese detalle de cuando busco por Profesión al momento de buscar me trae los registros excelente pero cuando borro en disponibles me queda la palabra cantidad no se si para que no quede allí esta palabra se puede sumar el conjunto de las cantidades ya que cuando borro me regrese los datos en total o en todo caso otra posibilidad es que cuando borre profesión y ese combobox quede sin texto quede en blanco las cajas de texto queden vacías por que el objetivo es quiero que aparezcan esos estadísticos solo cuando busque por profesión nada mas por allí voy a obtener los datos estadísticos que se presentaron por profesión elegida quien saco mas nota y menos nota.

Cambia las macro de los combobox1 y combobox2 por estas

Private Sub ComboBox1_Change()
Set ha = Worksheets("auxiliar"): ha.Range("a4").CurrentRegion.Clear
indice = ComboBox1.ListIndex + 1
filtro1 = ComboBox1.Value
Range("alumnos").Columns(indice).Copy: ha.Range("a4").PasteSpecial
Set tabla = ha.Range("a4").CurrentRegion
With tabla
    .RemoveDuplicates Columns:=1
    matriz = .CurrentRegion
End With
TxtDisponibles = 0: TextBox5.Text = 0: TextBox6 = 0
TextBox7.Text = 0: TextBox8 = 0
ComboBox2.Clear
ComboBox2.List = matriz
Set tabla = Nothing
End Sub
Private Sub ComboBox1_Enter()
End Sub
Private Sub ComboBox2_Change()
Set ha = Worksheets("auxiliar")
ha.Range("c4").CurrentRegion.Clear
indice = ComboBox1.ListIndex + 1
filtro1 = ComboBox2.Value
ComboBox3. Clear
ComboBox4. Clear
With Range("alumnos")
    . AutoFilter
    . AutoFilter indice, filtro1
    . Copy
    Ha. Range("c4"). PasteSpecial
    Set tabla = ha.Range("c4").CurrentRegion
    .Rows(0).Copy: tabla.Rows(0).PasteSpecial
    LstEP.RowSource = ha.Name & "!" & tabla.Address
    tabla.Name = "tabla"
    .AutoFilter indice
End With
If UCase(ComboBox1.Value) = "CURSON" Then
    estadisticas
Else
    TxtDisponibles = 0
    TextBox5.Text = 0: TextBox6.Text = 0
    TextBox7.Text = 0: TextBox8.Text = 0
End If
ComboBox3.List = Application.Transpose(Range("alumnos").Rows(0))
End Sub

Ahora quedó excelente experto JAMES BOND, muchas gracias por sus aclaraciones y despejar todas las dudas con respecto a las búsquedas y cargas en lisbox.

Saludos.

Experto James Bond una última consulta y salir de mi última duda si en el combobox1 de parámetros yo quisiera que me aparezca solo 2 o 3 columnas y no todas a filtrar para seleccionar  como se haría allí en este caso.

En el evento initialize cambia la línea para cargar el combobox1 por esta, dentro de los parentisis tu agregas o quitas campos

ComboBox1. List = Array("DNI", "APELLIDOS Y NOMBRES", "CURSON")

en el evento combobox1_change cambia las líneas que cargan el filtro1 y el indice por estas líneas y es todo, ahora cada que la macro lea el combobox1 buscara en los títulos en que columna se encuentra y continuara la macro sin ningún problema, como puedes ver aquí se ilustran varios puntos de lo que te comente en el post sobre macros eficientes y búsquedas rápidas

FILTRO1 = ComboBox1.Value
INDICE = WorksheetFunction.Match(FILTRO1, Range("ALUMNOS").Rows(0), 0)

Que excelente experto JAMES BOND gracias por su valiosa ayuda y tiempo, tengo una ultima duda que ya que voy a empezar a modificar la estructura de mi código en los lisbox como el que usted me recomendó ya que me menciono que con la instrucción SET se puede ver en tiempo real cuando se guarde, modifique y elimine así como un arrays, y saque el de los arrays para cargar el lisbox, pero tengo una duda por que ya no funcionan bien mis códigos para guardar, modificar y eliminar no se si habrá algo que modificar o capaz por que convertí a tabla en el excel tendrá algo que ver.

Le adjunto mi código de formulario de cursos el cual es el primero que lo he modificado.

https://drive.google.com/file/d/1H09c45neuXtvYHP5xvj5TNWusnWzwg8Y/view?usp=sharing 

Tu archivo no lo puedo leer en cuanto lo abro me pone esto, en cuanto a la instrucción set esta es para convertir datos en objetos los cuales tienen las propiedades de un array junto con todas las ventajas de Excel quien les asigna todas sus propiedades como dar formato, convertir a tabla dinámica, usar todas las funciones de excel, optimizar las búsquedas, etc, por cierto esto ya es motivo de otra consulta puesto que el tema con el que abriste esa consulta ya quedo concluido

Listo experto JAMES BOND, voy a volver hacer otra pregunta pero que raro que no habrá ami si funciona perfecto no sera temas de compatibilidad ya que tengo Excel 2016.

Voy a generar otra pregunta.

Gracias por su ayuda.

El problema esta en el frmcarrera es el único que presenta problemas, me pone además un mensaje de memoria insuficiente y otro de inicio de archivo mayor al fin de archivo y no es por compatibilidad, sube una imagen de ese formulario y explica con detalle que es lo que quieres que haga la macro

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas