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が便利になったなー。

■ 参考リンク