miércoles, 13 de febrero de 2013

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.

Hoy aprenderemos a definir el aspecto de un control ActiveX (ComboBox o ListBox) multicolumna; lo que haremos mediante la configuración de la propiedad ColumnWidths. Aunque hablaremos en todo momento de controles ActiveX, esta propiedad es igualmente válida si vamos a trabajar con estos controles en un UserForm (formulario de usuario).
Partiremos de una tabla en el rango A1:D7 con cuatro columnas; sobre este rango en particular configuraremos nuestros controles, para que aparezcan a la hora de seleccionar sobre ellos, las cuatro columnas cada una de ellas con un ancho diferente. Esta sería nuestra tabla:

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.


Recordar que es importante trabajar sobre rangos convertidos en Tablas o bien con Nombres definidos, ya que facilita entre otras cosas la detección de la cabecera.

El siguiente paso es insertar un control ActiveX tipo Cuadro de Lista (ListBox) y un Cuadro Combinado (ComboBox):

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.



Primero sobre el ComboBox y después sobre el ListBox accederemos a las Propiedades de ambos controles, para ello o bien con el botón derecho del ratón, o desde la ficha Programador > grupo Controles > botón Propiedades, abriremos la ventan diálogo con el listado de Propiedades. Modificaremos algunas de ellas para llenar de datos los controles:

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.


En la imagen se ven sólo las propiedades del ComboBox, pero son las mismas para el Listbox.
Propiedad BoundColumn: 4, que nos devuelve de la selección realizada sobre el Control, el valor correspondiente a la cuarta columna.
Propiedad ColumnCount: 4, que nos dice el número de columnas que queremos mostrar.
Propiedad ColumnHeads: True, para mostrar la cabecera en el desplegable del control.
Propiedad LinkedCell: F4 ó F9 (para el ComboBox y el ListBox respectivamente).
Propiedad ListFillRange: A2:D7. Que es el rango, sin cabecera donde se encuentran los valores que aparecerán en el desplegable de los controles.

Podemos ver un detalle ampliado del Cuadro de lista (ListBox):

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.



En el detalle anterior se aprecia cómo el ancho de las cuatro columnas es constante, lo que impide podamos leer con comodidad el contenido de cada una de ellas. Este ancho predefinido se determina de dividir por igual entre todas las columnas de la lista.
Además conviene tener presente que el ancho mínimo de columna calculado es de 72 puntos (1 pulgada). Para crear columnas más estrechas, deberemos especificar el ancho explícitamente. A menos especifiquemos lo contrario, los anchos de columna se miden en puntos. Sin embargo, podremos especificar otra unidad de medida (centimetros -cm- o pulgadas -in-), incluyendo las unidades como parte de los valores.
Bastará con indicar el ancho deseado para cada columna, separados por punto y coma (;), y la unidad de medida. Si no indicamos la unidad, Excel entenderá que hablamos de puntos (sabiendo que 72 puntos = 1 pulgada). De igual forma dejar vacío o con cero el ancho de una o varias columnas produce el efecto de ocultar a la vista dicha columna en el desplegable del control.


Para nuestro ejemplo, determinaremos los siguientes anchos en la propiedad ColumnWidths:
60 pt;135 pt;55 pt;70 pt

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.


Estéticamente hemos conseguido un resultado más agradable, y porque no, más práctico al poder visualizar los textos completos.

Estos anchos tienen una relación muy directa con el Ancho general del Control, que podemos ver en otra propiedad de dicho control, la propiedad Width, ya que si la suma de los anchos de columna especificados excediera el ancho del control, la lista se alinearía a la izquierda dentro del control y probablemente una o varias de las columnas situadas más a la derecha no se mostrarían, aunque nos podríamos desplazar a través de la lista utilizando la barra de desplazamiento horizontal para mostrar las columnas situadas más a la derecha.

Por ejemplo, nuestros anchos suman 60 + 135 +55 + 70 = 320; si redujeramos el ancho del control (Width) de 354 (ancho actual del ejemplo) a 300 veríamos los siguiente:

El ancho de las columnas en un ListBox o ComboBox: ColumnWidths.

14 comentarios:

  1. Hola tengo una pregunta, estoy tratando de realizar una macro que muestre un userform, por cada celda seleccionada, esto es para mostrar los datos de ventas por ejemplo.
    Estoy utilizando este codigo:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim comportamiento As Range
    Set comportamiento = Range("c11,C12, c13, c14, c15, c18, c19, c20, c21")
    If Intersect(Target, Range("C13")) Then
    LightDoble.Show

    Else
    If Intersect(Target, Range("C19")) Then
    RelaxDoble.Show

    End If
    End If


    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Georgesand,
      prueba con:
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

      If Not Intersect(Target, Range("C13")) Is Nothing Then
      LightDoble.Show
      Exit Sub
      End If
      If Not Intersect(Target, Range("C19")) Is Nothing Then
      RelaxDoble.Show
      Exit Sub
      End If

      End Sub

      lo único es que una vez abierto el formulario tendrás que operar sobre él para cerrarlo, etc.
      Slds

      Eliminar
  2. Saludos!
    lo mejor en este año que comienza para la gestión de esta pagina que tanto nos ayuda a los que no podemos pagar un curso. Bueno esta ayuda que le esto y pidiendo es para saber si ¿es posible dar mascaras de negrita, números enteros y fecha cuando se usa la función concatenar?
    por ejemplo: tengo la siguiente función en un rango que esta justificado =concatenar("por saldo a financiar";let_saldo_financ;"(";mont_saldo_financ;")";" y comienza a pagar la primera cuota el dia:";fecha_venc_cuot_1") y debería mostrarme algo así: por saldo a financiar dos millones (2.000,00) y comienza a pagar la primera cuota el día: 01/03/2013 claro esta debería aparecer solamente en negritas el monto en letras, el monto en números y la fecha pero no se como hacer esta función, por favor si puede brindarme esta ayuda le agradeceré por jaivergil@gmail.com
    gracias !!!!



    ResponderEliminar
    Respuestas
    1. Hola Javier,
      bien, claramente tendrás que construir una función personalizaada en VBA que componga ese concatenada, incluyendo en ese mismo código variables que determinen la posición en el teexto completo de los saldos (en número y letras) y por otro lado de la fecha, para a conitnuación cambiar el tipo de fuente de esas dos partes aplicando la propiedad Range.Characters.
      Por ejemplo, en nuestra celda activa pone Cursos Excelforo,
      si mediante macros quiero poner en negrita sólo 'Excelforo' escribiría:
      ActiveCell.Characters(Start:=8, Length:=9).Font.FontStyle = "Negrita"

      Espero te sirva.
      Slds

      Eliminar
  3. gracias Ismael me sirvió de mucho tu ayuda saludos desde la isla de margarita

    ResponderEliminar
  4. Buenas:
    Una pregunta como agrego varias columna de la hoja1 a un listbox
    Ej ColumnaA rango A8:A32
    ColumnaB rango B8:B32
    ColumnaC rangp C8:C32
    ColumnaM rango M8:M32

    Gracias de antemano

    ResponderEliminar
  5. Hola, consulto

    En una macro excel tengo asociado a un bomboBox una base de datos ( texto) , pero al ejecutarla solo se despliega parte del texto en pantalla, pero si desplazo el mouse se puedo leer en su totalidad . Mi consulta ¿como logro que el texto aparezca desplegado inmediatamente en su totalidad en pantalla.

    ResponderEliminar
    Respuestas
    1. Hola Hugo,
      entiendo te refieres a mostrar todos los item del texto dentro del ComboBox?.
      Existe una propiedad del ComboBox (.ListRows) donde puedes indicar cuántos item quieres visualizar al desplegar el ComboBox...

      Espero haberte entendido bien.
      Un saludo

      Eliminar
  6. Buenas tardes Ismael. Quiero utilizar un ComboBox para que me traiga todos los nombres de las carpetas que tengo en una carpeta de mi disco (las carpetas son nombres de personas) , puede ser posible? desde ya muchas Gracias!

    ResponderEliminar
    Respuestas
    1. Hola Maca,
      lee lo expuesto en esta entrada del blog:
      http://excelforo.blogspot.com.es/2012/05/vba-macro-para-listar-ficheros-de-una.html

      Luego con la propiedad AddItem del combobox podrás rellenarlo...
      Saludos

      Eliminar
  7. Buenas Ismael tengo una consulta quiero usar un cuadro combinado active X para cargar una lista con números, todo bien pero cuando llama el dato que selecciono en la lista me aparece en formato de texto, ademas los números que van con decimales me aparecen con coma, cuando quisiera que los separa con punto que por defecto como esta mi hoja.

    ResponderEliminar
    Respuestas
    1. Hola Luis Alberto,
      es un problema habitual al trabajar con decimales.. y es que VBA trabaja con la notación anglosajona (separador decimal con punto y separador de miles con coma), lo que se enfrenta normalmente con el sistema (separador decimal coma..).
      Lo normal es forzar el reemplazo antes de devolverlo a la hoja de cálculo, empleando ,Replace (hay otras formas).
      Echa un vistazo al ejemplo siguiente:
      http://excelforo.blogspot.com.es/2013/05/vba-los-decimales-y-los-filtros.html

      Saludos

      Eliminar