pepepe__tic__
@pepepe__tic__ (Pepepe__tic__)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

xlwingsで図形にマクロを登録したい 解決済

やりたいこと

  • xlwingsで画像の「マクロ名の登録」に相当するコードを実装したい
    • ※水色ハイライトの関数を図形に登録したい
  • 図形をクリックした際にVBAの関数を実行するコードを教えていただけないでしょうか?
  • xlwingsで実装が不可な場合、Excelファイル外からのアクセスで上記太文字を満たす手段を教えてもらえないでしょうか?
    • 言語・ライブラリはなんでもOKです スクリーンショット

前提

  • Excelアプリから操作はできず、xlwingsからのアクセスのみ編集可能
  • 関数は既にExcel内にコードとして保存されている状態
  • 図形はExcel内に保存されいてる状態
  • 図形と関数の紐づきだけが無い

該当のソースコード / 試したこと

  • ShapeオブジェクトにOnActionプロパティが無さそう(デバッガより確認)
  • shape.OnAction="関数名"で代入はできるが、実際にExcelを開いたときマクロは登録されていない
import xlwings as xw
"""
>>> pip install xlwings --version 0.23.3
"""
path="ファイル名"
work_book = xw.Book(path)
for sheet in work_book.sheets:
    for shape in sheet.shapes:
        # ファイル名!Sheet1.isClicked してもNGだった
        shape.OnAction = "Sheet1.isClicked"
work_book.save(path)
print("save")

公式ドキュメント

VBA Shapeオブジェクト

https://docs.microsoft.com/ja-jp/office/vba/api/excel.shape

xlwings Shapeオブジェクト

https://docs.xlwings.org/ja/latest/api.html?highlight=shape#shape

0

2Answer

自己解決できました。

原因

  • xlwingsでShape.OnActionプロパティを対応していないことが原因(元々わかっていた)

代替策

  1. GitHub issue をopenにする
  2. pywin32 で書き込む
    今回は2で対応しました

説明

  • pywin32 は、xlwingsにラップされているモジュール
    • 呼び出し方法さえわかれば、xlwingsのみのインストールでOK!
  • pywin32 はxlwingsよりもできることが多そうだが、コードが散らかりそう。。。

対応方法

import xlwings as xw
"""
>>> pip install xlwings --version 0.23.3
"""
path="ファイル名"
work_book = xw.Book(path)
for sheet in work_book.sheets:
    for shape in sheet.shapes:
        # Object.api.プロパティでアクセスできる
        shape.api.OnAction = "Sheet1.isClicked"
work_book.save(path)
print("save")

詳細

  • shape.api.OnAction = '関数名' で図形に関数を登録できる
  • Object.apiでVBAのオブジェクトを直接操作できる
1Like

Your answer might help someone💌