** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - Combo en Formulario VBA
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCombo en Formulario VBA

 Responder Responder
Autor
Mensaje
Galathea Ver desplegable
Habitual
Habitual
Avatar

Unido: 15/Septiembre/2012
Localización: España
Estado: Sin conexión
Puntos: 134
Enlace directo a este mensaje Tema: Combo en Formulario VBA
    Enviado: 29/Agosto/2018 a las 23:58
Saludos, pretendo crear un combo donde me aparezcan dos columnas n un Userform de excel.

Con el siguiente código creo tenerlo a medias, pues me pone en la fila uno el dato de la primera columna, y en la fila dos, el dato de la segunda columna, y así hasta finalizar con los datos cargados en el combo. No entiendo porqué hace esto, pese a que le tengo puesto que se alimente de ambas columnas.

Combo_Centro.Clear

With Sheets("listas")
    For Each celda In .Range("A2:B" & .Range("B" & Rows.Count).End(xlUp).Row)
        If celda <> Empty Then Combo_Centro.AddItem celda.Value
        Combo_Centro.BoundColumn = 2
        Combo_Centro.ColumnCount = 2
        Combo_Centro.ColumnWidths = "40;40"
    Next
End With

Pueden encaminarme, no encuentro los motivos.
Gracias.
he escrito tanta inútil cosa, sin descubrirme, sin dar conmigo.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5345
Enlace directo a este mensaje Enviado: 30/Agosto/2018 a las 15:28
Lo que hace tu código es como si (p.e.)  A2:A20 & B2:B20 en realidad fuese A2:A39, por ello solo muestra una columna. De todos modos es complicarte.

No necesitas un bucle + addin:

. . .

 Combo_Centro.Clear

  Combo_Centro.BoundColumn = 2

  Combo_Centro.ColumnCount = 2

  Combo_Centro.ColumnWidths = "40;40"

  Combo_Centro.RowSource = "A2:B" & Cells _

      (Rows.Count, 2).End(xlUp).Row

. . .

Y si tus datos de origen son una tabla de Excel (puedes convertirlos en Tabla) con nombre  (p.e.) Tabla1, te basta con:

. . .

 Combo_Centro.Clear

  Combo_Centro.BoundColumn = 2

  Combo_Centro.ColumnCount = 2

  Combo_Centro.ColumnWidths = "40;40"

  Combo_Centro.RowSource = "Tabla1"

. . .



Aprendemos viendo respuestas de otros, también intentando resolver dudas (intenta ayudar cuando puedas/sepas).

Mi sitio_web con ejemplos Excel.
Arriba
Galathea Ver desplegable
Habitual
Habitual
Avatar

Unido: 15/Septiembre/2012
Localización: España
Estado: Sin conexión
Puntos: 134
Enlace directo a este mensaje Enviado: 30/Agosto/2018 a las 16:38
Mi problema es que el combo tiene que ser dinámico, pues no siempre mostrará los mismos datos, de ahí utilizar el bucle.
he escrito tanta inútil cosa, sin descubrirme, sin dar conmigo.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Prisión Brieva
Estado: Sin conexión
Puntos: 3195
Enlace directo a este mensaje Enviado: 30/Agosto/2018 a las 19:56
¿Y por qué no creas la tabla que te dice AnSanVal de forma dinámica?
Those are my principles, and if you don't like them... well, I have others. Groucho Marx
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5345
Enlace directo a este mensaje Enviado: 30/Agosto/2018 a las 19:57
Esto...

Combo_Centro.RowSource = "A2:B" & Cells(Rows.Count, 2).End(xlUp).Row

… hace que el rango sea dinámico.


Pero si lo quieres con bucle (aunque sea menos eficiente):

Private Sub UserForm_Initialize()

'Rellenar comboBox de múltiples columnas con AddItem.

  Dim celda As Range, hoja As Worksheet

  Set hoja = Worksheets("listas")

  With Combo_Centro

    .Clear

    .BoundColumn = 2

    .ColumnCount = 2

    .ColumnWidths = "40;40"

    For Each celda In hoja.Range("A2:A" & Range("tabla1").Rows.Count + 1)

      .AddItem

      .List(celda.Row - 2, 0) = celda

      .List(celda.Row - 2, 1) = celda.Offset(, 1)

    Next celda

  End With

  Set hoja = Nothing

End Sub


La Tabla Excel (Insertar>Tablas>Tabla>…) ya es dinámica por su propia naturaleza, pero si prefieres un rango ordinario, puedes hacerlo con el método de rango que prefieras.




Aprendemos viendo respuestas de otros, también intentando resolver dudas (intenta ayudar cuando puedas/sepas).

Mi sitio_web con ejemplos Excel.
Arriba
Galathea Ver desplegable
Habitual
Habitual
Avatar

Unido: 15/Septiembre/2012
Localización: España
Estado: Sin conexión
Puntos: 134
Enlace directo a este mensaje Enviado: 02/Septiembre/2018 a las 00:20
Gracias por su ayuda, siempre me complico la vida cuando lo más simple es una buena opción.

Al final dejé el bucle como decía AnSanVal y lo configuré de esta forma:

Dim rango As String

Sheets("listas").Select
rango = Sheets("listas").Range("B2").End(xlDown).Row

With Combo_Centro
    .RowSource = "listas!A2:B" & rango
    .ColumnHeads = True
    .BoundColumn = 1
    .ColumnCount = 2
    .ColumnWidths = "40;40"
    .ListRows = 10
End With

Por mi parte se puede cerrar el hilo.
he escrito tanta inútil cosa, sin descubrirme, sin dar conmigo.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable