Надстройкой создается панель инструментов и на неё добавляются кнопки и раскрывающийся список, например, так:
Код
Sub Auto_open()
Панель_App
End Sub
Код
Public Sub Панель_App()
Const MyBarName As String = "Approximation"
Dim myBar As CommandBar, FindBar As Boolean
FindBar = False
'Проверка наличия панели среди всех панелей
For Each myBar In Application.CommandBars
If myBar.Name = MyBarName Then
FindBar = True
Exit For
End If
Next
'Если панель не найдена, создать её и отобразить
If Not FindBar Then
Set myBar = Application.CommandBars.Add(Name:=MyBarName, Temporary:=False)
'End If
myBar.Visible = True
'Создать на панели кнопки
Set myControl = Application.CommandBars(myBar.Index).Controls.Add(Type:=msoControlButton, Before:=1)
With myControl
.Style = ButtonStyle
.FaceId = 422
.Caption = ""
.TooltipText = ""
.OnAction = "App1"
End With
Set myControl = Application.CommandBars(myBar.Index).Controls.Add(Type:=msoControlComboBox, Before:=2)
With myControl
.Caption = "Order"
'.ControlTipText = ""
.AddItem Text:="1 вариант", Index:=1
.AddItem Text:="2 вариант", Index:=2
.DropDownLines = 3
.DropDownWidth = 65
.ListHeaderCount = 0
.OnAction = "App2"
.ListIndex = 5
'.Value = "1 вариант" ', Index:=1
End With
End If
End Sub
Но никак не могу нормально извлечь данные из раскрывающегося списка.
Цель: по нажатию кнопки вызывается процедура с параметром, извлеченным из раскрывающегося списка. Точнее, по нажатию кнопки вызывается вспомогательная процедура (без параметра), которая, в свою очередь, должна получить данные из ComboBox. И вот здесь затык. Пытался по .OnAction вызывать вспомогательную процедуру и из неё получить данные ComboBox, но тоже не удалось. С ComboBox на формах никаких проблем нет, а что делать с CommandBars, прошу подсказать.
В сети очень мало информации о ComboBox на CommandBars, если помножить это на мой малый опыт в VBA (немного программировал более 10 лет назад), получается туго. Прошу помочь.
Public Sub Панель_App()
Const MyBarName As String = "Approximation"
Dim myBar As CommandBar
Dim myControl As Object, FindBar As Boolean
FindBar = False
'Проверка наличия панели среди всех панелей
For Each myBar In Application.CommandBars
If myBar.Name = MyBarName Then
FindBar = True
Exit For
End If
Next
Stop
'Если панель не найдена, создать её и отобразить
If Not FindBar Then
Set myBar = Application.CommandBars.Add(Name:=MyBarName, Temporary:=False)
'End If
myBar.Visible = True
'Создать на панели кнопки
Set myControl = Application.CommandBars(myBar.Index).Controls.Add(Type:=msoControlButton, Before:=1)
With myControl
.Style = 0 'ButtonStyle
.FaceId = 422
.Caption = ""
.TooltipText = ""
.OnAction = "App1"
End With
Set myControl = Application.CommandBars(myBar.Index).Controls.Add(Type:=msoControlComboBox, Before:=2)
With myControl
.Caption = "Order"
'.ControlTipText = ""
.AddItem Text:="1 вариант", Index:=1
.AddItem Text:="2 вариант", Index:=2
.DropDownLines = 3
.DropDownWidth = 65
.ListHeaderCount = 0
.OnAction = "App2"
.ListIndex = 1
'.Value = "1 вариант" ', Index:=1
End With
End If
End Sub
Sub App2()
MsgBox Application.CommandBars("Approximation").Controls(2).ListIndex
End Sub
МатросНаЗебре написал: Как понять, какой элемент выбран из ComboBox на панели инструментов CommandBars.
Код
Type:=msoControlComboBox
Я сделал две вспомогательные процедуры, одна считывает значение ComboBox в глобальную переменную, вторая запускается кнопкой и использует эту переменную в качестве параметра:
Код
Dim OrderBox As Integer
Private Sub ApproxRead()
OrderBox = Application.CommandBars("Approximation").Controls(2).ListIndex
End Sub
Private Sub ApproxOrder()
Call Polynomial(OrderBox + 2)
End Sub
При изменении комбобокса срабатывает макрос, который берет текст из комбобокса, и запоминает его txt$ = Application.CommandBars.ActionControl.Text вы сделали, по сути, то же самое