Поле со списком ActiveX с динамически выбираемым списком

Я смотрел на этот вопрос: Как создать и заполнить поле со списком ActiveX

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

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

Sub CreateComboBox1()
    With ActiveSheet.OLEObjects.Add(ClassType: = "Forms.ComboBox.1", _
                Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, _
                Height:=15)
        With .Object
            .AddItem "Date"
            .AddItem "Player"
            .AddItem "Team"
            .AddItem "Goals"
            .AddItem "Number"
        End With
    End With
End Sub
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
673
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я немного подправил ваш код, чтобы очистить его. Избегайте использования ActiveSheet и вместо этого используйте явные ссылки на интересующий вас рабочий лист. Также вы должны хранить свои объекты в переменных:

Option Explicit

Sub CreateComboBox1()

Dim sht As Worksheet
Dim cb As ComboBox
Dim sourceRange As Range
Set sht = ThisWorkbook.Worksheets("Name of your worksheet")
Set sourceRange = sht.Range("A1:A10") 'example source range

Set cb = sht.OLEObjects.Add(ClassType: = "Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, Height:=15).Object
cb.List = sourceRange.Value

End Sub

По сути, вы можете использовать свойство .List, чтобы указать исходный диапазон.

Другой способ сделать это — использовать цикл For-Each, чтобы перебирать элементы, которые вы хотите добавить в список. Таким образом, вы можете добавить в список элементы двух разных диапазонов с разных листов:

Option Explicit

Sub CreateComboBox1()
Dim cell As Range
Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim cb As ComboBox
Dim sourceRange1 As Range
Dim sourceRange2 As Range

Set sht1 = ThisWorkbook.Worksheets("Name of your worksheet 1")
Set sht2 = ThisWorkbook.Worksheets("Name of your worksheet 2")
Set sourceRange1 = sht1.Range("A1:A10")
Set sourceRange2 = sht2.Range("A1:A10")

Set cb = sht1.OLEObjects.Add(ClassType: = "Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, Height:=15).Object

For Each cell In sourceRange1
    cb.AddItem cell.Value
Next cell
For Each cell In sourceRange2
    cb.AddItem cell.Value
Next cell

End Sub

это подход, которому я следовал: pastebin.com/rK026Czr поле со списком появляется, но сразу же вызывает ошибку в строке «Set cb ...»: Ошибка: 438 Конечно, потому что у Target нет свойств Left, Top и т. д. как я могу ссылаться на позицию выбранной ячейки?

Akinn 18.07.2019 16:51

понял, проблема была в совмещенном диапазоне! К сожалению, выбор поля со списком не вставляется как ячейка значения, есть ли способ добиться этого?

Akinn 18.07.2019 17:14

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

Stavros Jon 18.07.2019 17:45

Другие вопросы по теме