仕事でExcelマクロをいじったりExcelファイルを自動で操作したりということが多いので自分のやり方の備忘録です。以下は2022年最初の頃の情報をもとにした内容です。
VS Code対応
Excelからマクロ部分を抜き出してVS Codeでコーディングする場合、vbac.wsfを使って抜き出したファイルを使用するか、XVBAというVS Codeの拡張機能を使うのが一般的なようです。
XVBAはExcelからのImport、ExcelへのExportをVS Code内で簡単に実行でき楽そうです。
使用してみたところ、Exportする際クラスモジュールが日本語名だと失敗しました(v4.0.26にて確認)。これに気づかずちょっと詰まりました。標準モジュールやフォームは日本語を含んでいてもExportできました。Exportは日本語名のクラスモジュールを読み込むまで行うため、ぱっと見成功しているように見えて途中で失敗していたりします。その場合VBEのエラーダイアログが表示されるのですが、意味がよく分からず無視してExcelファイルを保存するとExportを失敗した後のコードが消えます。その状態でVS Code側にImportすると終わります:)
参考
![](https://debuggingdiary.com/wp-content/uploads/cocoon-resources/blog-card-cache/b88e538b912da4daadd9fdbc1873de84.jpg)
Pythonから操作
シート保護
Python初心者なので変なことかいてたらすいません。
PythonからExcelを操作するライブラリはいくつかあります。Excelのシートに画像を貼りつけている場合、xlwingsを使用するのが簡単だと思います。
xlwingsの使い方は調べればいろいろと出てくるしAPIのリファレンスもあるのですが、シート保護でちょっと悩んだのでメモしておきます。
調べた感じでは現状xlwings自体にシート保護のメソッドは実装されていないと思います。ただ、apiプロパティでnative objectを取得することが可能です。Windows OS上ではpywin32のオブジェクトが取得できます。pywin32の使用方法も調べればいろいろ出てくるのですが、apiで取得したシートのオブジェクトをProtect()すればシート保護できました。私の使い方だとxlwingsで手が届かないところだけこの方法で操作すればよさそうです。
ws.api.Protect()
Xdebugクラスの解放
XVBAがDebug用に追加しているっぽいXdebugクラスモジュールですが、納品時に不要なため忘れないように解放します。これは上記内容を参考にワークブックのnative objectを取得すると可能でした。
# XDebugクラスの解放
module = wb.api.VBProject.VBComponents.Item("Xdebug")
wb.api.VBProject.VBComponents.Remove(module)
参考
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9UHl0aG9uJTIwcHl3aW4zMiUyOHdpbjMyY29tJTI5JTIwRXhjZWwlMjAlRTYlOTMlOEQlRTQlQkQlOUMlRTUlODIlOTklRTUlQkYlOTglRTklOEMlQjImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWI3MzM2NGIwOGM5ODBkOWZiMTcyNDVhMTg5M2RhY2Zj&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTcxNiZ0eHQ9JTQwZmVvNTImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zMiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWJmZGQ4OTQ5Y2QwZWQ1ZjAxYTg0NmNlZjYyN2M2NmVh&blend-x=142&blend-y=491&blend-mode=normal&s=9b96a095d31dc75b67a9dedc849a31f7)
![](https://debuggingdiary.com/wp-content/uploads/cocoon-resources/blog-card-cache/a5b681ba818fb7696c6215d9488da1ee.png)