ActiveX ComboBox динамический диапазон для ListFillRange - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть ThisWorkbook.Sheets("MAIN") и ActiveX ComboBox11. У меня также есть таблица:

         A                    B 
1      John 1               10000
2      John 2               20000
3      John 3               20000
4      John 4               10000
5      John 5               50000
6      John 6               50000
7      John 7               50000
8      John 8               10000
9      John 9               20000
10     John 10              50000

Тогда в ячейке Q10 у меня есть значение, скажем, 32000

Я хотел бы динамически отображать диапазон столбца в ActiveX ComboBox11 с условием:

=IF(B1<Q10;"not in list";A1))

чтобы в ActiveX не было значений менее 32000 в раскрывающемся списке ActiveX ComboBox11.

В этом случае ActiveX ComboBox11 будет выглядеть так:

John 5
John 6
John 7
John 10

Легко иметь именованный диапазон в ListFillRange. Однако я хотел бы иметь динамический диапазон. Есть идеи как этого добиться?

Мне нужно как-то использовать фильтр?

Private Sub Worksheet_Change(ByVal Target As Range)

   'If Target.Address = Range("Q10").Address Then
       'Range("A1:B10").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B1:B10")
   'End If

End Sub

И после этого использовать отфильтрованный диапазон в ActiveX ComboBox11 ListFillRange?

1 Ответ

1 голос
/ 17 апреля 2019

Есть несколько способов сделать это. Вы можете зациклить все строки, найти значения выше 3200, скопировать их на скрытый лист, когда закончите с циклом, получить Range из этого скрытого листа и назначить его ListFillRange. Пример:

Function updateCombo1()
    Dim lastRow As Long, i As Long, x As Long, wk As Workbook
    Set wk = ThisWorkbook
    With wk.Sheets("Sheet1")
        lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
        wk.Sheets("HiddenSheet").Cells.ClearContents
        For i = 1 To lastRow
            If .Cells(i, 3).Value >= .Range("G10").Value Then
                x = x + 1
                wk.Sheets("HiddenSheet").Cells(x, 1).Value = .Cells(i, 2).Value
            End If
        Next i
        lastRow = wk.Sheets("HiddenSheet").Cells(Rows.Count, 1).End(xlUp).Row
        'If Form DropDown, Set Range
        .DropDowns("Drop Down 2").ListFillRange = "HiddenSheet!A1:A" & lastRow
        'If ActiveX DropDown, Set Range
        .ComboBox11.ListFillRange = "HiddenSheet!A1:A" & lastRow
    End With
End Function

Вы также можете зациклить все строки и добавить одну за другой в раскрывающемся списке. Пример:

Function updateCombo2()
    Dim lastRow As Long, i As Long, wk As Workbook
    Set wk = ThisWorkbook
    With wk.Sheets("Sheet1")
        lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
        'If Form Drop Down, Clear All Items
        .DropDowns("Drop Down 2").RemoveAllItems
        'If ActiveX Drop Down, Clear All Items
        .ComboBox11.Clear
        For i = 1 To lastRow
            If .Cells(i, 3).Value >= .Range("Q10").Value Then
                'If Form DropDown, Add Item
                .DropDowns("Drop Down 2").AddItem .Cells(i, 2).Value
                'If ActiveX DropDown, Add Item
                .ComboBox11.AddItem .Cells(i, 2).Value
            End If
        Next i
    End With
End Function

Просто вызовите функцию в Worksheet_Change

Редактировать: Работать с выпадающим списком ActiveX намного проще, но для совместимости я бы попробовал вместо этого использовать раскрывающийся список форм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...