¿Cómo definir un rango para utilizarlo en un combobox?

Tengo un combobox del cuál, quiero que los valores que muestre, los tome de una columna que se registra en automático mediante una pequeña rutina (este rango puede ser variable en cuanto al número de valores). Lo que quiero hacer es tomar este rango y que se muestre al desplegar el combobox.

Medianamente lo he logrado, pero ahorita me muestra todos los renglones de la columna, incluyendo las celdas en blanco y quiero que sólo se muestren las que tienen valores.

El código que estoy utilizando es el siguiente:

Private Sub UserForm_Initialize()

Worksheets("CLAVE").Range("AC2:AC" & Rows.Count).ClearContents
Dim valdga As String

Set inidga = Worksheets("BD").Cells(7, 6)
valdga = inidga

82: Worksheets("CLAVE").Cells(Rows.Count, 29).End(xlUp).Offset(1, 0) = valdga

81: Set inidga = inidga.Offset(1, 0)
If inidga = "" Then
GoTo 83
ElseIf inidga = valdga Then
GoTo 81
ElseIf inidga <> valdga Then

Set H1 = Sheets("CLAVE")

Set inidgaexist = H1.Columns(29).Find(inidga.value, lookat:=xlWhole)
If Not inidgaexist Is Nothing Then

GoTo 81
Else
valdga = inidga
GoTo 82
End If

83: Me.ComboBox2.RowSource = "Clave!AC2:AC" & Rows.Count ----------> Esta instrucción es la que quiero modificar
End If
End Sub

3 Respuestas

Respuesta
4

Tu duda sobre esta línea:

83: Me.ComboBox2.RowSource = "Clave!AC2:AC" & Rows.Count ----------> Esta instrucción es la que quiero 

Quedaría resuelta así:

83: Me.ComboBox2.RowSource = "Clave!AC2:AC" & Sheets("Clave").Range("AC" & Rows.Count).End(xlUp).Row

Sin embargo, podrías simplificar la macro si copias el rango, obtienes los únicos y después cargas con Rowsource:

Private Sub UserForm_Initialize()
    Sheets("BD").Range("F7:F" & Sheets("BD").Range("F" & Rows.Count).End(xlUp).Row).Copy Sheets("CLAVE").Range("AC2")
    Sheets("CLAVE").Range("AC2:AC" & Sheets("CLAVE").Range("AC" & Rows.Count).End(xlUp).Row).RemoveDuplicates Columns:=1
    ComboBox2.RowSource = "Clave!AC2:AC" & Sheets("Clave").Range("AC" & Rows.Count).End(xlUp).Row
End Sub

O también podrías cargar los datos con el método .AddItem

Para este caso requieres de un ciclo y no es necesaria la columna auxiliar AC para cargar.

Private Sub UserForm_Initialize()
    Set h = Sheets("BD")
    For i = 7 To h.Range("F" & Rows.Count).End(xlUp).Row
        If WorksheetFunction.CountIf(h.Range("F" & i & ":F7"), h.Cells(i, "F")) = 1 Then ComboBox2.AddItem h.Cells(i, "F").Value
    Next
End Sub

Lo que hace es verificar si el valor es único desde la celda F7 a la celda i, si es único entonces lo carga, si hay más valores iguales, entonces no lo carga.


[Avísame cualquier duda.

Respuesta
2

[Hola

Solo por si acaso, se recomienda no usar "Goto" y al parecer estás usando "Set" cuando bastaría un "Let". Te recomendaré algo sin usar tu macro. Ah, eso sí, no se puede hacer con "RowSource". Prueba así:

With Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
    .AutoFilter 1, "<>"
    For Each celda In .SpecialCells(xlCellTypeVisible)
        Me.ComboBox1.AddItem celda
    Next
    Me.ComboBox1.RemoveItem 0
    .AutoFilter
End With

Obvio reemplaza la "A" de ser otra tu columna.

Saludos]

Abraham Valencia

PD: Si mal no recuerdo el código es de mi amigo Gerson

¡Gracias! Usé tu respuesta y también me funcionó.

La verdad soy relativamente nuevo en esto de la programación, pero sus comentarios me ayudan mucho. Muchas gracias

Saludos!

Respuesta
2

Este es el resultado que buscas modifique un poco tu macro

y esta es la macro modificada

Private Sub UserForm_Initialize()
Worksheets("CLAVE").Range("AC2:AC" & Rows.Count).ClearContents
Dim valdga As String
Set inidga = Worksheets("BD").Cells(7, 6)
valdga = inidga
82: Worksheets("CLAVE").Cells(Rows.Count, 29).End(xlUp).Offset(1, 0) = valdga
81: Set inidga = inidga.Offset(1, 0)
If inidga = "" Then
GoTo 83
ElseIf inidga = valdga Then
GoTo 81
ElseIf inidga <> valdga Then
Set h1 = Sheets("CLAVE")
Set inidgaexist = h1.Columns(29).Find(inidga.Value, lookat:=xlWhole)
If Not inidgaexist Is Nothing Then
GoTo 81
Else
valdga = inidga
GoTo 82
End If
End If
83:
col = h1.Range("ac2").Column
filas = h1.Range("ac2").CurrentRegion.Rows.Count
ComboBox2.RowSource = h1.Range("ac2:ac" & filas).Address
End Sub

Gracias por tu ayuda, sin embargo hay un pequeño detalle: si ejecuto la macro ubicándome en una hoja distinta a la que copio los valores (hoja “CLAVE”) el combo me muestra lo renglones en blanco. ¿Sabes a que se debe?

Cambia la ultima línea por esta

ComboBox2.RowSource = "clave!" & "ac2:ac" & filas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas