- Код: Выделить всё
Function GetClickButtonID(ArrCurCaller)
'считаем ID нажатого Control'а, не учитывая разделители (BeginGroup) Application.Caller
Dim BeginGroupCount As Integer
With Application.CommandBars(ArrCurCaller(2))
For CurCtrl = 1 To .Controls.Count
If .Controls(CurCtrl).BeginGroup Then
BeginGroupCount = BeginGroupCount + 1
End If
If CurCtrl + BeginGroupCount = ArrCurCaller(1) Then Exit For
Next CurCtrl
End With
GetClickButtonID = CurCtrl
End Function
ArrCurCaller передается из вызывающей программы (обычно это назначенная для данной кнопки VBA-программа) и является результатом вызова Application.Caller, т.е. массивом, где первый элемент - номер контрола на панели (с учетом разделителей), а второй - номер панели в коллекции панелей. Результат работы функции - правильный номер кликнутого контрола (без учета разделитей контролов на панели).
Все работало до установки Service Pack 3. После этого "бедствия" при вызове Application.Caller во втором элементе массива, получаемого по ArrCurCaller, возвращается 0!!! И, соответственно, вся логика работы приведенной выше функции ломается.
Кто про эту фичу что-нибудь знает? Как ее обойти, не откатывая назад Service Pack 3 для MS Office 2003?