VBA динамическое заполнение поля со списком - PullRequest
0 голосов
/ 10 февраля 2012

Вот настройка (весь код тестирования)

У меня есть поле со списком на листе под названием "Devmod"

Я создал модуль под названием «Тестирование» и в нем создал следующую подпрограмму

Sub setcomb()

    Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _
                      Sheets("Device_info").Range("l3").End(xlDown)).Select
End Sub

все работает нормально, но не заполняет поле со списком какими-либо данными (хотя и выбирает нужные ячейки, которые я хочу)

Теперь я знаю, что могу сделать это, создав диапазон имен и назначив его комбинированному списку.

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

В логическом смысле это будет

Выберите диапазон ячеек на листе Device_info, Начните с ячейки L3 и определите последнюю использованную ячейку. Назначьте эти значения в поле со списком.

могу ли я сделать это с одной или двумя строками кода?

Приветствия

DevilWAH

ОТВЕТ Моя простая функция заканчивается как

    Function setcomblist(wsheet As String, startrng As String, Optional endrng As Variant)

'used to populate comboboxes from a dynamic lenth range taking named sheet and starting cell as argument.
'use: combobox.ListFillRange = setcombolist("sheetname", "startcell")

If IsMissing(endrng) Then

setcomblist = Range(Sheets(wsheet).Range(startrng), Sheets(wsheet).Range(startrng).End(xlDown)).Address(External:=True)

Else

setcomblist = Range(Sheets(wsheet).Range(startrng), Sheets(wsheet).Range(endrng)).Address(External:=True)
End If

End Function

спасибо агину за помощь людям

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

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

Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _
                  Sheets("Device_info").Range("l3").End(xlDown)).Address(External:=True)

Для ясности я бы переписал его следующим образом.

Sub setcomb()
    Dim rng as Range
    Set rng = Sheets("Device_info").Range("L3")
    Sheet1.Devmod.ListFillRange = Range(rng, rng.End(xlDown)).Address(External:=True)
End Sub

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


Для динамического именованного диапазона введите что-то вроде этого в Refers To.

=OFFSET(Device_info!$L$3,0,0,COUNTA(Device_info!$L$3:$L$303),1)

Функция COUNTA должна включать максимальное количество строк, которое вы хотите разрешить. В приведенном выше примере создается динамический именованный диапазон, который может увеличиваться до 300 строк. И как говорится в моей верной книге Excel Hacks :

Определяя диапазон для COUNTA, не поддавайтесь искушению включить целый столбец данных, поэтому вы не заставляете функцию COUNTA считать потенциально тысячи ненужных клеток.

2 голосов
/ 10 февраля 2012
Dim rngList as range

With Sheets("Device_info") 
   Set rngList = .Range(.Range("l3"),.Range("l3").End(xlDown))
End With

Sheet1.Devmod.ListFillRange = rngList.Address(,,,true)
...