Динамически установить ListFillRange в Excel ComboBox с помощью VBA - PullRequest
3 голосов
/ 17 ноября 2010

Я пытался сделать что-то вроде:

 cmbMyBox.ListFillRange = "E2"

Но поле со списком, похоже, не заполняется.

Ответы [ 6 ]

11 голосов
/ 11 июня 2012

Прежде всего, для того, чтобы попытаться установить диапазон listfill из VBA, вам нужно включить знак '=', например:

combobox.ListFillRange = "=E3:E13"

, а не combobox.ListFillRange = "E3:E13", это не сработает.

Вы можете иметь динамический именованный диапазон, например:

listItems: "=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))"

Используйте VBA, чтобы установить ListFillRange следующим образом: combobox.ListFillRange = "=listItems" Опять же, используйте знак '=' !!

Этот динамический диапазон listItems динамически увеличивается / уменьшается в зависимости от того, какие значения есть в столбце A.

Я знаю, что отвечаю очень поздно, но я заметил, что многие люди думают, что именованные диапазоны всегда должны быть фиксированными, хотя они также могут быть динамичными ...

Как ты это делаешь? В Excel 2007 и выше вы переходите на вкладку ленты "Formulas" и нажимаете кнопку «Диспетчер имен» Вместо того, чтобы выбирать ячейки и давать им имя в этом верхнем левом поле, вы можете управлять всеми определенными именованными диапазонами здесь. Создайте новый и присвойте ему значение (без кавычек):

"=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))".

Вот, пожалуйста ...

P.S. Когда вы позволяете динамическому именованному диапазону изменяться, вы должны использовать VBA для переустановки .ListFillRange так, чтобы комбинированный список обновлял свои элементы списка.

2 голосов
/ 17 ноября 2010

Хорошо, не хочу снова отвечать на мой собственный вопрос, но это свойство ListFillRange в выпадающем списке для Excel было просто невыносимым.Вот последний код, который я реализовал.

   Sheet1.Range("E3").CurrentRegion.Select
   Dim example as Range
   Set example = Selection

   With cmbMyBox
     .ListFillRange = example.Address(0, 0, x1A1, True)
   End With

Проблема здесь заключалась в том, что я пытался динамически установить комбинированный список, используя динамический диапазон, который изменяется в зависимости от того, какие заданные пользователем значения были заданы.Насколько я понимаю, я не мог использовать именованный диапазон, потому что именованные диапазоны являются ИСПРАВЛЕННЫМИ, например (A3: Z20) и не могут быть скорректированы.

1 голос
/ 15 февраля 2018

У меня возникла похожая проблема, так как я не смог заполнить ActiveX ComboBox ссылкой на список, взятой из правила проверки ячейки.

Так же, как и собственное решение Firedrawndagger, я решил вручную перевести правило проверки в формат, понятный .ListFillRange. Я также понял, что он должен быть в формате рабочей области, иначе вызов не будет работать с других листов.

Это работает со всеми исходными форматами проверки, включая: $ A $ 1 / = NamedRange / = INDIRECT ("Table1 [Col2]") Перевод был:

Dim xStr As String        
xStr = Target.Validation.Formula1
xStr = Right(xStr, Len(xStr) - 1)
xStr = Split(Range(xStr).Address(, , , True), "]")(1)
'...other irrelevant code
.ListFillRange = xStr
1 голос
/ 24 апреля 2017
Private Sub ComboBox1_Change()

Me.ComboBox2.ListFillRange = "=" & ComboBox1.Value

End Sub

Это тоже работает. Но вы должны сделать либо определенные имена с индексом и счетчиком, как уже предлагалось, либо вы можете ссылаться на них дважды, находясь в таблице. Под этим я подразумеваю превращение ваших данных в таблицу. Обратитесь к столбцу, который вы хотите использовать в качестве заголовка вашего параметра в Combobox1, и добавьте к имени единицу, например, Fruits1, затем определите вторичный именованный диапазон, который ссылается на Fruits1 и называется Fruits . Фрукты Fruits1

0 голосов
/ 01 февраля 2018

Это нормально работает в Excel 2010:

У меня есть список элементов в столбце «AN», который меняется (становится больше / короче) каждую неделю. Я создал переменную с именем "c", которая содержит количество элементов в списке. Используя эту переменную, ComboBox (расположенный в ячейках S7: U7) теперь динамически отображает элементы, фактически содержащиеся в списке (без пустых мест или отсутствующих элементов в комбинированном списке).

Код:

Dim rng As Range

Set rng = ActiveSheet.Range("S7:U7")
ActiveSheet.DropDowns.Add(rng.Left, rng.Top, rng.Width, rng.Height).Select
With Selection
    .ListFillRange = "AN1:AN" & c
    .LinkedCell = "$V$7"
    .DropDownLines = 8
    .Display3DShading = False
End With
0 голосов
/ 05 августа 2016

Или вот как я это делаю:

Определить имя диапазона, который включает строки заголовка и трейлера плюс одну строку данных для начала, скажем «DataList»

Затем определите следующее имя диапазона данных без заголовка и записи трейлера, используя функцию смещения.

Скажите "DataRange" = Смещение (DataList, 1,0, Rows (DataList) -2)

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