はじめに
本家xlwingsドキュメント で十分なのと VBA との差があまり無い作りな為 VBA と Python を知っていたら資料的価値は高くない。 ただ VBA のメンテナンスで心が折れた事と Excel オジサンの如くこき使われたので、身の回りの人にもある程度把握出来るよう簡易リファレンスを残す事にした。 可能ならオジサンと立場を変わってもらえれば幸いである。
動作環境の用意
xlwings は Excel を OLE で操作するため動作には Excel が必要である、Excel を用意出来ない状況では openpyxl などを利用すると良いだろう。
xlwings を Windows 上で動作させるには xlwings pypiwin32 comtypes のモジュールが必要である、 Python のパスが通っている状態であれば次のようにすると良いだろう。 詳しくは 本家インストール説明 を参照の事。
pip install xlwings pypiwin32 comtypes
実際に Excel から Python スクリプトを呼び出すには 本家アドイン説明 を参照の事。 本家クイックスタート説明 は環境差を設定シートで指定する、複数環境で実行する際は煩雑になるのでお勧めしない。
Python からファイル選択ダイアログを表示させ呼び出し元 Excel ファイルを選択してしまうと OLE が固まってしまう 為、私はアドインもクイックスタートも使わず以下を利用している。 この python.bat 内では利用する Python の決定とモジュールの追加と実行結果表示を担っている。
Sub PythonGoing(cmd As String)
cmd = "%COMSPEC% /C " & ThisWorkbook.Path & "\python.bat" & " " & cmd
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run cmd, 0, False
Set wsh = Nothing
End Sub
- xlwings の RunPython を使った場合はログ出力等の位置が衝突するので複数実行は考慮していないと思われる。 この様なバッチはその問題も回避できると考えている。
- 複数実行時にはカットバッファを使用しないように注意の事。
クラス索引
クラス | 内容 |
---|---|
xlwings.App | 実行環境(Excelインスタンス) |
xlwings.Book | ワークブック |
xlwings.Sheet | ワークシート |
xlwings.Range | 範囲 |
xlwings.Name | 名前付き範囲 |
xlwings.Chart | 本家チャート |
xlwings.Picture | 本家画像 |
xlwings.Shape | 本家シェイプ |
引数凡例 | 内容 |
---|---|
... | 何かしらの有効な指定を示している |
文字列 | 例程度の文字列 |
数値 | 例程度の数値 |
英単語 | 目的が理解出来る程度の単語で実際名とは限らない |
VBA機能呼び出し
api プロパティがあるクラスはネイティブの機能を呼び出すことが可能である。 これにより xlwings がサポートしていない機能も利用する事が出来ので多くの VBA を Python と xlwings で置き換える事が出来る。 実際の Excel を利用するためバグも互換である。 ただ VBA のオブジェクトをラップしているだけなら VBA で良いと思われるだろう... 黙れ!
例
rng1 = xw.Range('a1')
rng2 = xw.Range('a2')
rng1.api.Copy(rng2.api)
VBA で利用される xl~ 等の定数は xw.constants.~ に定義されている。
openpyxlから移行する時のヒント
使用範囲の取得
# openpyxl
import openpyxl as px
wb = px.load_book('ブック名')
rows = wb['Sheet1'].rows
# xlwings
import xlwings as xw
wb = xw.Book('ブック名')
ws = wb.sheets['Sheet1']
ur = ws.api.UsedRange.Row + ws.api.UsedRange.Rows.Count
uc = ws.api.UsedRange.Column + ws.api.UsedRange.Columns.Count
rows = ws.range((1, 1), (ur, uc)).rows