Удалите пустые строки в многоколоночном ComboBox в VBA - PullRequest
0 голосов
/ 13 февраля 2020

У меня проблемы с удалением пустых строк, показанных в моем ComboBox, и сохранением двух моих столбцов. Я попробовал этот код:

  For Each c In Range(Range("A3"), Range("A" & Rows.Count).End(xlUp)) 
       If c.Value <> vbNullString Then ComboBox1.AddItem c.Value
  Next c

Но он просто не работает, есть ли способ изменить диапазон для двух столбцов? Вот мой код с параметрами ComboBox.

Private Sub UserForm_Activate()

Dim c As Range

   With ComboBox1

     .ColumnCount = 2

     .ColumnWidths = "70;30"

     .ColumnHeads = False

     .BoundColumn = 1

     .List = Union(Range("A2:A100"), Range("B2:B100")).Value


  For Each c In Range(Range("A3"), Range("A" & Rows.Count).End(xlUp)) 
       If c.Value <> vbNullString Then ComboBox1.AddItem c.Value
  Next c

End With


End Sub

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Попробуйте следующий код ...

Dim currentCell As Range

With Worksheets("Sheet1") 'change the sheet name accordingly
    With .Range("A2:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
        For Each currentCell In .Cells
            If Len(currentCell) > 0 Then
                With Me.ComboBox1
                    .AddItem currentCell.Value
                    .List(.ListCount - 1, 1) = currentCell.Offset(, 1).Value
                End With
            End If
        Next currentCell
    End With
End With

Надеюсь, это поможет!

1 голос
/ 13 февраля 2020

Еще один способ использования массивов. Это будет быстрее в очень большом диапазоне.

Option Explicit

Private Sub CommandButton1_Click()
    Dim rngCombo As Range
    Dim lRow As Long, i As Long, n As Long
    Dim blanks As Long
    Dim ws As Worksheet
    Dim preArray As Variant, NewArray() As String

    '~~> Set this to the relevant sheet
    Set ws = Sheet1

    With ws
        '~~> Find last row of Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Define your range
        Set rngCombo = .Range("A3:B" & lRow)

        '~~> Store that range in an array
        preArray = rngCombo.Value

        '~~> Get blanks in Column 1 of that range
        blanks = Application.WorksheetFunction.CountBlank(rngCombo.Columns(1))

        '~~> Define your new array to store data
        ReDim NewArray(rngCombo.Rows.Count - blanks - 1, 1 To 2)

        '~~> Populate the new array
        For i = LBound(preArray) To UBound(preArray)
            If Len(Trim(preArray(i, 1))) <> 0 Then
                NewArray(n, 1) = preArray(i, 1)
                NewArray(n, 2) = preArray(i, 2)
                n = n + 1
            End If
        Next i
    End With

    With ComboBox1
        .ColumnCount = 2
        .ColumnWidths = "70;30"
        .ColumnHeads = False
        .List = NewArray '<~~ Assign array to list
    End With
End Sub
...