Надстройкой создается панель инструментов и на неё добавляются кнопки и раскрывающийся список, например, так:
Код
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 лет назад), получается туго. Прошу помочь.
Для аппроксимации передаточной характеристики измерительных приборов часто используют полином. С точки зрения электроники - это очень удобный способ, требующий от МК относительно мало ресурсов и предоставляющий очень хорошую точность.
Для получения коэффициентов однофакторного полинома я традиционно использовал встроенную в Excel функцию ЛИНЕЙН. Однако в имеющейся в данный момент задаче выяснилось, что погрешность аппроксимации этим способом очень высока, - значительно выше, чем при использовании математических пакетов или линии тренда графика в Excel.
Предположив, что проблема в некорректном использовании функции ЛИНЕЙН, перешерстил интернет, пробовал сторонние файлы. Оказалось, проблема известная, и связана она с алгоритмом работы этой функции (подробности я не понял, в математике не очень).
Я взял одну и ту же выборку и сравнил четыре способа получения коэффициентов: 1. с использованием ЛИНЕЙН 2. с помощью утилиты Agraph 3. построением линии тренда на графике Excel 4. с помощью функций polyfit/polyval в Octave
Выяснилось, что на большой выборке (13 точек по 600 измерений в каждой) первый способ (ЛИНЕЙН) даёт примерно в 1,5...2 раза бОльшую погрешность, чем другие. При меньшей выборке (13 точек по 5 в каждой, итого 65 точек) ещё интереснее: и ЛИНЕЙН, и Agraph дают погрешность в 4 раза больше, чем два последних. Agraph имеет ещё два недостатка - максимальное количество обрабатываемых точек - 5000, а количество значащих цифр в коэффициентах - не более 9. Два последних способа дают отличный результат, но есть одна проблема - сложность извлечения коэффициентов. Требуется постоянно менять данные, и, соответственно, производить множество вспомогательных действий для загрузки/конвертирования данных и "выдёргивания" коэффициентов.
Хотелось бы все действия максимально автоматизировать и привязать к Excel. Возможно, можно как-то исхитриться и заставить ЛИНЕЙН работать по другому? Или есть способ (может, с помощью VBA) автоматически выдернуть коэффициенты из линии тренда? Попадались в сети фрагменты VBA для вычисления коэффициентов, но тоже приемлемого ничего не подобрал...
p.s. Движок запрещает грузить файлы свыше 100к, поэтому нарезал скринов.