1 (изменено: pavel.garshin.01, 2022-05-09 22:30:58)

Тема: AHK: Получить список кнопок на листе excel и вызвать событие нажатия

Добрый день.
Скажите пожалуйста, возможно ли получить список кнопок на листе excel и вызвать событие нажатия любой из них? Требуется включить макрос в Excel через скрипт Autohotkey.


^6::
	MsgBox, Начали!
	xlApp := ComObjActive("Excel.Application")
	
	;Получить список Buttons

	;Вызвать нажатие кнопки "Запуск" чтобы включить макрос 
return

2

Re: AHK: Получить список кнопок на листе excel и вызвать событие нажатия

Пример:

Excel := Excel_Get()
XLSht := Excel.ActiveSheet

for item in XLSht.buttons {
   MsgBox, % "Caption: " . item.Caption . "`n"
           . "Name: "    . item.Name    . "`n"
           . "Macro: "   . macro := item.OnAction
   Excel.Run(macro)
}

Excel_Get(WinTitle := "ahk_class XLMAIN") {
   ControlGet, hwnd, hwnd,, Excel71, %WinTitle%
   if !hwnd
      return
   Window := AccObjectFromWindow(hwnd, -16)
   Loop {
      try Application := Window.Application
      catch
         ControlSend, Excel71, {esc}, %WinTitle%
   } Until !!Application
   return Application
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
   DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject, Ptr, &IID, PtrP, pAcc) = 0
      Return ComObjEnwrap(VT_DISPATCH, pAcc, F_OWNVALUE)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Получить список кнопок на листе excel и вызвать событие нажатия

teadrinker, идеально! Я уже думал придется использовать команду клика мыши. Но были бы проблемы, если бы масштабирование менялось. С этим решением все намного проще.
Спасибо за помощь!