keyhacからcomtypes経由でExcelマクロ関数をコールする
前回に引き続き、keyhacネタ。keyhacはPythonコードでWindowsのショートカットキーをカスタマイズできるフリーソフト。バージョン1.34からcomtypesが使用できるようになった。
このおかげでWScriptでやれていたことがkeyhacでもできるようになった。下記コードのようにすればExcel側で定義している自作マクロ関数も呼び出せる。
from keyhac import * def configure(keymap): def personal_xls(macro_name, *args): def _job_1(job_item): import comtypes.client xl = comtypes.client.GetActiveObject("Excel.Application") is_older_than_2007 = lambda: float(xl.Version) < 12 if is_older_than_2007(): book_name = "PERSONAL.XLS" else: book_name = "PERSONAL.XLSB" xl.Run(book_name + "!" + macro_name, *args) def _job_2(job_item): # print macro_name, args pass job_item = JobItem(_job_1, _job_2) JobQueue.defaultQueue().enqueue(job_item) # Excel用キーマップ keymap_excel = keymap.defineWindowKeymap(exe_name=u"EXCEL.EXE") # ボタンを大きくするマクロ keymap_excel["C-S-b"] = lambda: personal_xls("SwitchLargeButtons") # 引数付きの関数もコール可能! keymap_excel["C-S-m"] = lambda: personal_xls("Macro1", u"abcde.") keymap_excel["C-S-n"] = lambda: personal_xls("Macro1", u"あいうえお!")
一応Excel2003も2007も動くようにしている。
それとSwitchLargeButtonsは前に書いたやつ → 一発でエクセルのボタンをビッグサイズに切り替えるマクロ
ちなみにこのコードではJobQueueを使っているが、これを使わずに直に関数コールするとエラーにになってしまう。
ERROR : _onKeyDown failed [Error -2147417843] アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。 Traceback (most recent call last): File "keyhac_keymap.pyo", line 804, in _onKeyDown File "keyhac_keymap.pyo", line 728, in _keyAction File "C:\Program Files\craftware\keyhac\config.py", line 1764, in <lambda> File "C:\Program Files\craftware\keyhac\config.py", line 1747, in personal_xls File "comtypes\client\__init__.pyo", line 180, in GetActiveObject File "comtypes\__init__.pyo", line 1165, in GetActiveObject File "_ctypes/callproc.c", line 936, in GetResult WindowsError: [Error -2147417843] アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。
Excelは無理なのかなと色々試してたら一応動いた。結果オーライ。ますますkeyhacが便利になったなー。