ListBox crear automáticamente Títulos y anchura de columnas (ColumnWidths) | VBA Excel

แชร์
ฝัง
  • เผยแพร่เมื่อ 19 ก.ย. 2024

ความคิดเห็น • 50

  • @GerardoExcel
    @GerardoExcel  10 หลายเดือนก่อน +1

    En la descripción del vídeo tienes el vínculo para descargar el ejercicio.
    Vínculo a un ejercicio modificado según consulta de los comentarios: bit.ly/GerardoExcel-ListBoxDinamico-v2

    • @elmorocho4502
      @elmorocho4502 10 หลายเดือนก่อน

      Excelente la modificación, gracias por compartir.

  • @miguelseijas2719
    @miguelseijas2719 2 หลายเดือนก่อน +1

    Gerardo, la verdad es que, como dicen en mi país, "eres un verdugo". Me encantan este tipo de códigos que generan cosas dentro de la aplicación. Si pudiera, te daría 10 "me gusta", pero al menos te doy el que me permiten. Mil gracias.

    • @GerardoExcel
      @GerardoExcel  2 หลายเดือนก่อน

      Muchas gracias Miguel!!

  • @JoseBellone
    @JoseBellone หลายเดือนก่อน +1

    Hola Gerardo, muchísimas gracias, esperaré ansioso el video. Saludos

  • @elmorocho4502
    @elmorocho4502 10 หลายเดือนก่อน +1

    Excelente, siempre en bueno seguir sus videos, aportan mucho conocimiento. GRACIAS

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      Muchas gracias!!

  • @JoseBellone
    @JoseBellone 2 หลายเดือนก่อน +1

    Ok, muchas gracias Gerardo. Saludos

  • @lalocalle8738
    @lalocalle8738 10 หลายเดือนก่อน +1

    Gerardo, excelente contenido. Gracias. Continuos éxitos para tu canal.

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      Gracias Lalo!

  • @josevivas4982
    @josevivas4982 9 หลายเดือนก่อน +1

    Excelente e Interesante manera de DINAMISAR EL LISTBOX, Gracias Gerardo, Saludos desde Managua.

    • @GerardoExcel
      @GerardoExcel  9 หลายเดือนก่อน

      Gracias a ti!!

  • @tomasbenitocarpintero
    @tomasbenitocarpintero 10 หลายเดือนก่อน +1

    Muy buena formación. Un capitulo interesantísimo. Muchas gracias Gerardo

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      Muchas gracias!

  • @josevivas4982
    @josevivas4982 9 หลายเดือนก่อน +1

    no tuve necesidad del factor 0.8, lo elimine. y me callo como "anillo al dedo" la colocacion de los encabezados, con sus respectivas columnas, luego le agregue dos columnas mas y el comporatamiento fue perfecto tambien. Saludos.

    • @GerardoExcel
      @GerardoExcel  9 หลายเดือนก่อน

      Ok muy bien!

  • @danielgalan2934
    @danielgalan2934 10 หลายเดือนก่อน +1

    Hola Gerardo, me encantó el contenido. Para aportar , te comento que al ejecutar la macro tuve un comportamiento que no esperaba, las columnas que tenían anchos con decimales al momento de poblar el listBox eliminaban el punto decimal y convertían por ejemplo ( 22.7 a 227); es decir, propiedad .ColumnWidths del listBox en su cadena quitaba los puntos decimales y de ahí el comportamiento.
    Me imagino que esto se debe a las configuraciones regionales y como Excel no logra ajustarse. Yo soy de México.
    Para corregir el problema habría que hacer los siguientes cambios:
    En la Subrutina UserForm_Initialize sustituir.
    En las declaraciones:
    'Dim ppc, totalLB As Double
    Dim ppc, totalLB As Long
    * sustituyo el tipo de variable de Doble a Long para no manejar decimales.
    Dentro del ciclo FOR para construir la cadena strCW
    'ppc = loMiTabla.ListColumns(c).Range.Width * 0.8)
    ppc = Int(loMiTabla.ListColumns(c).Range.Width * 0.8) + 1
    * Uso la función Int para truncar y el + 1 para controlar la diferencia de los decimales.
    En la subrutina crearTitulosColumnas.
    En el segundo ciclo FOR:
    For i = LBound(arrLabels) To UBound(arrLabels)
    If i = 1 Then
    With arrLabels(i)
    .Height = 12
    '.Width = loMiTabla.ListColumns(i).Range.Width * 0.8 *COMENTADO para efecto de ver cambio
    .Width = Int(loMiTabla.ListColumns(i).Range.Width * 0.8) + 1
    '.Left = Me.ListBox1.Left + 7 *COMENTADO para efecto de ver cambio
    .Left = Me.ListBox1.Left + 10 'Ajuste en la posición de la primer etiqueta
    .Top = Me.ListBox1.Top - .Height
    .Caption = loMiTabla.HeaderRowRange(i)
    End With
    Else
    With arrLabels(i)
    .Height = 12
    '.Width = loMiTabla.ListColumns(i).Range.Width * 0.8 *COMENTADO para efecto de ver cambio
    .Width = Int(loMiTabla.ListColumns(i).Range.Width * 0.8) + 1
    .Left = arrLabels(i - 1).Left + arrLabels(i - 1).Width
    .Top = Me.ListBox1.Top - .Height
    .Caption = loMiTabla.HeaderRowRange(i)
    End With
    End If
    Next i
    Obviamente los comentarios se pueden quitar, sólo los integro para entender el ajuste realizado. Espero les sirva.

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      Doble gracias Daniel!! Por el comentario y por el aporte. Es bueno saber este tipo de "inconvenientes". Saludos!!

    • @jhoncharles4121
      @jhoncharles4121 6 หลายเดือนก่อน

      Hola Gerardo, a mi me pasa lo mismo en el ancho de columnas, entonces la Solución es poner el ancho de las columnas de la tabla en numero entero ó se resuelve con código vba?@@GerardoExcel

    • @GerardoExcel
      @GerardoExcel  6 หลายเดือนก่อน

      @@jhoncharles4121 Hola Jhon. El archivo de descarga ya lo modifiqué y ahora estaba funcionando correctamente que yo sepa.

  • @jordigarciadiaz8894
    @jordigarciadiaz8894 10 หลายเดือนก่อน +1

    Genial 👏👏👏👏 Muchísimas gracias!!!

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน +1

      Gracias... muy amable Jordi!!

  • @antoniobuendia8636
    @antoniobuendia8636 24 วันที่ผ่านมา +1

    Hola muy buenas , video muy bien explicado e ilustrativo, he añadico una pequeña cosita y es crear las etiquetas en tiempo de ejecución porque cuando añadía una columna nueva me retorna un error y es esto:
    Dim lblcontrol As MSForms.Label
    'Set lblcontrol = Me.Controls.Add("Forms.Label.1", "lblTitulo" & i)
    Espero sea de utilidad

    • @GerardoExcel
      @GerardoExcel  21 วันที่ผ่านมา

      Muchas gracias! Esa variante la tengo creada para un vídeo posterior. De cualquier forma agradecido por contribuir...

  • @maximilianoorezzo8015
    @maximilianoorezzo8015 7 หลายเดือนก่อน +1

    Excelente tutorial!! Me resulta extremadamente útil. Gracias!! Va el mg y suscripción crack!

    • @GerardoExcel
      @GerardoExcel  7 หลายเดือนก่อน

      Muchas gracias, muy amable!!

  •  8 หลายเดือนก่อน +1

    Muy útil! Si se crea una función a la cual se le pase por parámetros el formulario, construir (diseñar) el formulario resulta mucho más sencillo. Se guardarla toda la estructura de diseño en un módulo que se pueda importar y de ahi en adelante es pan comido...

    • @GerardoExcel
      @GerardoExcel  8 หลายเดือนก่อน

      Gracias por comentar!!

  • @jorgetorreszavala5940
    @jorgetorreszavala5940 10 หลายเดือนก่อน +1

    Hola, buenos días...
    Para empezar, mi agradecimiento por tu aporte técnico. EXCELENTE.
    Tengo una situación: ésta MACRO, funciona SÓLO en el archivo que contiene la MACRO.
    Sí se ejecuta para otro archivo, no funcionan los encabezados.
    ¿Tendrá alguna sugerencia para ésta situación?
    Reciba mi agradecimiento y felicitación desde México

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      Gracias por comentar Jorge!!
      Si no lo ha realizado, es posible que precises realizar algunos pequeños ajustes:
      Por ejemplo, ¿el control ListBox se llama igual? (ListBox1)
      En la parte inicial del evento Initialize del formulario existen las siguientes asignaciones a las variables objeto:
      Set ws = Worksheets("Ejercicio")
      Set loMiTabla = ws.ListObjects("Tabla1")
      ¿Ha actualizado los nombres de la hoja (de "Ejercicio" para el nombre de tu hoja) y de la tabla (de "Tabla1" para el nombre de tu tabla)?
      He realizado una prueba en otro libro de Excel copiando el código y realizando los ajustes que menciono y funciona todo bien.
      Saludos!!

  • @jmaciasanino
    @jmaciasanino 3 หลายเดือนก่อน +1

    Exelente información, saludos desde Panamá, Consulta, de que manera se puede hacer para seleccionar solo las columnas que se desean mostrar.
    Saludos S.S.

    • @GerardoExcel
      @GerardoExcel  3 หลายเดือนก่อน

      Gracias por visitar y comentar!! En la descripción del vídeo hay un vínculo: El texto dice así: Descarga para el mismo ejercicio pero solo carga algunas columnas...
      Espero que esa versión y ejercicio te pueda inspirar...
      Saludos!!

  • @pablogarciadelamelena6077
    @pablogarciadelamelena6077 4 หลายเดือนก่อน +1

    Buenas noches Gerardo. Saludos desde Perú.
    He adaptado tu código, en mi proyecto en Excel. Tengo una consulta:
    Mi Control de inventarios tiene una Hoja con la Base de Datos de Productos, otra donde registro las Entradas y en otra las Salidas de los productos. En estas últimas, he implementado un Formulario de Búsqueda con tu ListBox Dinámico. Todo perfecto, hasta el paso de etiquetar las columnas en el ListBox de Salidas.
    Formo la cadena de la propiedad ColumnWidths (strCW) del ListBox para 5 columnas, del total de 7 de la Base de datos: para el ListBox de Ingresos como para el de Salidas, se muestran las columnas 1, 3, 4 y 5, para el de Ingresos la 6 (Cto. Unit.) y para el de Salidas la 7 (Precio Vta.). La data carga, según lo esperado, en ambos ListBox.
    Con tu código he podido crear y posicionar las etiquetas para las columnas del ListBox de Ingresos (OK), pero no puedo hacerlo para el de salida.
    ---------------------------------------------------------------------------------------------
    Private Sub CrearTitulosColumnas()
    ' Variables para la iteración del array (c) para asignar valores a las propiedades de los controles
    Dim c As Byte
    Dim i As Byte
    ' Crear una variable array dinámica y redimencionarla
    Dim arrEtiqueta() As MSForms.Control
    ReDim arrEtiqueta(1 To numColLB)

    ' Asignar a la variable array cada uno de los controles de etiqueta: 5 (numColLB)
    For c = 1 To numColLB
    Set arrEtiqueta(c) = Me.Controls.Add("Forms.Label.1", "lblTit" & c)
    Next c

    ' Asignar valores a propiedades de las etiquetas
    For i = LBound(arrEtiqueta) To UBound(arrEtiqueta)
    If i = 1 Then
    With arrEtiqueta(i)
    .Height = 15
    .Width = Int(MisProductos.ListColumns(i).Range.Width) + 1
    .Left = Me.lst_ListaProducto.Left
    .Top = Me.lst_ListaProducto.Top - .Height
    .Caption = MisProductos.HeaderRowRange(i)
    End With
    Else
    With arrEtiqueta(i)
    .Height = 15
    .Width = Int(MisProductos.ListColumns(i + 1).Range.Width) + 1
    .Left = arrEtiqueta(i - 1).Left + arrEtiqueta(i - 1).Width
    .Top = Me.lst_ListaProducto.Top - .Height
    .Caption = MisProductos.HeaderRowRange(i + 1)
    End With
    End If
    Next i
    End Sub
    ---------------------------------------------------------------------------------------------
    En la última iteración (i=5) no logro que la etiqueta de la última columna del ListBox, para el caso del formulario de búsqueda de Salidas, sea la cabecera de la columna 7 de la Base de Datos.
    Te agradecería, me aconsejaras como debo resolver este problema.
    Gracias.

    • @GerardoExcel
      @GerardoExcel  4 หลายเดือนก่อน

      Gracias por comentar y visitar el canal. Si entendí bien tu consulta pienso que se solucionaría con la siguiente modificación (por favor, compare el código y vea donde están las modificaciones)
      Saludos!!
      ' Asignar valores a propiedades de las etiquetas
      For i = LBound(arrEtiqueta) To UBound(arrEtiqueta)
      If i = 1 Then
      With arrEtiqueta(i)
      .Height = 15
      .Width = Int(MisProductos.ListColumns(i).Range.Width) + 1
      .Left = Me.lst_ListaProducto.Left
      .Top = Me.lst_ListaProducto.Top - .Height
      .Caption = MisProductos.HeaderRowRange(i)
      End With
      Else
      With arrEtiqueta(i)
      .Height = 15
      .Width = Int(MisProductos.ListColumns(i + 1).Range.Width) + 1
      .Left = arrEtiqueta(i - 1).Left + arrEtiqueta(i - 1).Width
      .Top = Me.lst_ListaProducto.Top - .Height
      If i 5 then
      .Caption = MisProductos.HeaderRowRange(i + 1)
      Elseif i = 5 then
      .Caption = MisProductos.HeaderRowRange(i + 2) ' o MisProductos.HeaderRowRange(7) Porque es la columna 7 de tu tabla se precisa que la iteración 5 corresponda con la columna 7 de tu tabla Salidas
      End If
      End With
      End If
      Next i

    • @pablogarciadelamelena6077
      @pablogarciadelamelena6077 4 หลายเดือนก่อน +1

      @@GerardoExcel, implementé tu modificación y en primera instancia, en los ListBox de ambas hojas, se muestra el título de la columna 7 (Precio Vta.) de la BD. Analizando, la lógica está bien, cuando el índice es diferente a 5, le suma 1 (i+1), cuando es 5 le suma 2 (i+2), es decir, en ambos se muestra el título de la columna 7 de la BD.
      Encontré la solución (quemé cerebro). Adicioné una condición a tus líneas de código:
      If i 5 Then
      .Caption = MisProductos.HeaderRowRange(i + 1)
      ElseIf i = 5 Then
      If MiHojaAct = "Ingresos" Then .Caption = MisProductos.HeaderRowRange(i + 1)
      If MiHojaAct = "Salidas" Then .Caption = MisProductos.HeaderRowRange(i + 2)
      End If
      Muchas gracias por el apoyo y la rapidez de tu respuesta a mi consulta.
      Acá tenemos un dicho "Una pena entre dos, es menos atroz"... 🙂

  • @JoseBellone
    @JoseBellone 2 หลายเดือนก่อน +1

    Hola Gerardo, como estás, una consulta, hay alguna manera de colocar los títulos de cabecera de la tabla sin la propiedad rowsource? (sin etiquetas) o sea, que no sean seleccionables, para que cuando recorra mas de 10 columnas (16 que tengo) recorra hacia el costado derecho la barra de desplazamiento del listbox y se muevan junto con las cabeceras (lo hice mas chico al ancho del formulario porque era muy grande en tamaño). Esto obedece en razón de poder filtrar el contenido del listbox. Gracias Gerardo. Saludos

    • @GerardoExcel
      @GerardoExcel  หลายเดือนก่อน

      Hola José. Me parece que te respondí en otro comentario. Bueno... solo decirte que acabo de grabar un vídeo con una solución a lo que me planteas... el vídeo se publicará en septiembre. Gracias y saludos!!

  • @contacaccelmh
    @contacaccelmh 4 หลายเดือนก่อน +1

    Exelente tutorial. Una pregunta: Como le inserto un buscador?

    • @GerardoExcel
      @GerardoExcel  4 หลายเดือนก่อน +1

      Gracias por visitar el canal y comentar!! Respecto a tu pregunta, mira este vídeo: th-cam.com/video/jjB6jZ8iLMQ/w-d-xo.html

    • @contacaccelmh
      @contacaccelmh 4 หลายเดือนก่อน

      @@GerardoExcel eres bueno en esto, me parece que es muy eficiente la forma de cargar los datos. Muchas Gracias. Guillermo Rodriguez

  • @JoseBellone
    @JoseBellone 2 หลายเดือนก่อน +1

    O sea, sería con ciclo for y la propiedad list. Gracias. Saludos

    • @GerardoExcel
      @GerardoExcel  2 หลายเดือนก่อน

      Trataré de crar alguna solución a tu consulta... pero ni se cuando... gracias por seguir el canal y comentar!

  • @elmorocho4502
    @elmorocho4502 10 หลายเดือนก่อน +1

    Profe hay alguna forma de solo cargue columnas espeficicas y no toda la tabla. Gracias

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      Si. Puedes cargar el ListBox con un ciclo For To Next y con algunos ajustes en el código se puede hacer...
      Bueno ya lo he probado y he realizado el ejercicio y me funciona bien.
      También incluye modificaciones aportadas por Daniel Galan.
      En la descripción y en el primer comentario dejo el vínculo.
      Gracias y saludos!!

    • @elmorocho4502
      @elmorocho4502 10 หลายเดือนก่อน

      Va subirlo. Gracias

  • @jhoncharles4121
    @jhoncharles4121 6 หลายเดือนก่อน

    Hola Gerardo, tengo el problema de que no me funcionan los encabezados, la macro no envía ningún error simplemente no se cargan los "Labels".

    • @GerardoExcel
      @GerardoExcel  6 หลายเดือนก่อน

      Hola Jhon. Lo he probado varias veces y en tres computadoras diferentes y me funciona bien. No se que puede ser.

  • @aditdesarrolloeinnovacion9076
    @aditdesarrolloeinnovacion9076 10 หลายเดือนก่อน

    Hola. A mi no me toma el ancho de las columnas de la tabla en el listbox. Me aparecen super separadas las columnas. Ya he revisado el código una y otra vez y no se que hacer.

    • @GerardoExcel
      @GerardoExcel  10 หลายเดือนก่อน

      He actualizado el vínculo. Ahora pienso que funciona todo bien: bit.ly/GerardoExcel-ListBoxDinamico
      A mi me funciona todo bien, pero parece que debido a algunas configuraciones regionales no siempre funcionaba como a mí. Puedes ver el comentario de Daniel Galan.
      Saludos!!