Я смотрел на этот вопрос: Как создать и заполнить поле со списком 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


Я немного подправил ваш код, чтобы очистить его. Избегайте использования 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 и т. д. как я могу ссылаться на позицию выбранной ячейки?