Hatena::ブログ(Diary)

Koonies/こりゃいいな! このページをアンテナに追加 RSSフィード Twitter

2009 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 10 |
2011 | 01 | 02 | 05 | 06 | 07 | 08 | 09 |
2012 | 05 | 06 |

2011-07-18

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

■ 参考リンク

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Koonies/20110718/keyhac_excel_vba
2009 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 10 |
2011 | 01 | 02 | 05 | 06 | 07 | 08 | 09 |
2012 | 05 | 06 |
日記の検索

ads
最近のコメント
etc
あわせて読みたいブログパーツ