【Python】エクセル操作:win32comを通してマクロVBAを使用する方法
2020.10.28 /
Pythonでエクセルを操作するパッケージにはopenpyxlやxlwings、win32comなどがあります。
それぞれにメリット・デメリットがありますが、エクセルのマクロVBAに慣れている方はwin32comを使用するのがお勧めです。
なぜかというと、win32comならばVBAを操作することができるからです。
そのためほかのエクセル操作のパッケージではできないようなことも、win32comなら実現することができます。
逆にwin32comはPythonだけでなく、VBAの知識が必須になります。
本記事ではエクセル操作を目的として、Pythonのwin32comを通してマクロVBAを使用する方法を解説していきます。
win32comとは
pywin32ライブラリは、PythonからWindowsAPIのアクセスを提供しています。
公式GitHUBは以下リンクになります。
このライブラリ内にwin32comモジュールがあり、エクセル操作にはwin32comを使用します。
このwin32comでのエクセル操作での注意点は、OSがWindowsであり、かつMicrosoft製品であるExcelがインストールされている必要があるということです。
win32comでVBAを利用する準備
pywin32のパッケージインストール
pywin32は標準ではインストールされていないため、pipコマンドでインストールする必要があります。
pip install pywin32
win32comモジュールのインポート
エクセル操作で使用するwin32comが使えるように、必ずpyファイルの先頭でwin32comモジュールをインポートします。
import win32com.client
win32comでのVBA基本操作
エクセルの起動
まずはエクセルを起動させる必要があります。
excel = win32com.client.Dispatch(“Excel.Application”)
エクセルを起動後、VBAを使ってエクセルを操作できますが、操作中のエクセルの動きを見たい場合は以下のようにVisibleをTrueにします。
excel.Visible = True
これ以降の操作では、excelに対してVBAコマンドを使い、エクセル操作を行っていく流れになります。
警告を表示しないようにする
VBA操作時の警告を表示しないようにすることができます。
excel.DisplayAlerts = False
警告が表示するたびにマクロがストップと効率的が悪いので、私は基本的におまじないのように必ず記載するようにしています。
エクセル(ワークブック)の新規作成
エクセルを新規で作成する場合はAdd()を使用します。
excel.Add()
エクセル(ワークブック)を開く・閉じる
既存のエクセルファイル(ワークブック)を開くためにはWorkbooks.Open()を使用します。
wb = excel.Workbooks.Open(‘絶対パス’)
ここでは開いたエクセル情報をfileに格納しています。
ワークブックを読み取り専用で開く場合は、ReadOnly=Trueを入れます。
wb = excel.Workbooks.Open(‘絶対パス’, ReadOnly=True)
VBA操作などが終了しましたら、最後に必ず開いたエクセルファイルは閉じましょう。
wb.Close()
エクセルの保存
VBAで操作したエクセルを上書き保存するにはSave()を使用します。
wb.Save()
新たに名前を付けて保存したい場合はSaveAs()を使用します。
wb.SaveAs(“絶対パス+ファイル名”)
ワークシートの操作
ワークシートの選択
対象のエクセルファイル(ワークブック)を開いたら、操作するワークシートを取得(操作可能状態)します。
sheet = wb.Worksheets(“シート名”)
上記ではシート名を指定していますが、シート番号(左から1,2)でも取得可能です。
sheet = wb.Worksheets(1)
ワークシートを取得したら、次に操作できるように選択状態(アクティベイト)にします。
sheet.Activate()
or
sheet.Select
ワークシートの追加・削除
ワークシートの追加は、以下のように行います。
sheet = wb.Worksheets(1)
wb.Sheets.Add(Before=sheet)
上記では、ワークシート1番(一番左)の左側に新しいワークシートが挿入されます。
では、対象のワークシートの右側に新しいワークシートを挿入したい場合はどうするのか。
Afterを使うというのは思いつくと思います。
ですがただAfterを使うだけだとうまくいかないんです!!
wb.Sheets.Add(Before=None, After=sheet)
このようにBefore=Noneにする必要があります。ややこしい。
ワークシートの削除にはDelete()を使用します。
wb.Worksheets(3).Delete()
ワークシート名の取得
すでにワークシートを取得(操作可能状態)にしていれば、nameでワークシート名を取得することができます。
print(sheet.name)
別のワークシートの名前を取得する場合は、以下の方法で取得できます。
print(wb.Worksheets(2).name)
ワークシート名の変更
ワークシート名の変更には、取得の時と同様にnameを使います。
sheet.name = “新しいシート名”
ワークシート内のセル操作
セルに値を入力
ワークシートを選択状態にしている場合、そのワークシートから指定したセルに値を入力できます。
sheet.Range(“A1”).Value = “入力する値”
or
sheet.Cells(1, 1).Value = “入力する値”
セルの値の取得
ワークシートを選択状態にしている場合、そのワークシートからセルの値を取得できます。
sheet.Cells.Item(1, 1).Value
セルの削除
セルの削除にはDelete()を使用します。
sheet.Range(“A1:D2”).Delete()
指定範囲内を削除すると自動的に上にセルがシフトします。
行・列の高さ・幅を変更
行の高さを変更する場合は、以下のようにして変更する。
sheet.Rows(“1:1”).RowHeight = 100
列の幅を変更する場合は、以下のようにして変更する。
sheet.Columns(“A:A”).ColumnWidth = 100
セルのフォント変更
セルのフォント変更(太さ、サイズ、文字色)は以下のようにして変更できます。
sheet.Range("A1").CurrentRegion.Font.Color = 0x0000FF
sheet.Range("A1").CurrentRegion.Font.Bold = True # 太字
sheet.Range("A1").CurrentRegion.Font.Size = 20
エクセルに登録されているマクロの起動
エクセルに登録されているマクロを起動したい場合は、以下のようにしてマクロを起動することができます。
xl = win32com.client.Dispatch("Excel.Application")
wb = xl.Workbooks.Open(Filename=絶対パス+ファイル名, ReadOnly=1)
xl.Run("ファイル名!マクロ名")
まとめ
win32comを使ったVBA操作はいかがでしたでしょうか。
今回紹介した方法でPythonから自由にエクセルを操作することができます。
これらは仕事を自動化する際にも非常に有用です。
またwin32comを用いてエクセルをPDFに変換することもできます。
【Python】エクセルをPDFに変換する方法(win32com)
今回紹介した方法を応用して、ぜひ仕事の効率化や、アプリ作成にチャレンジしてみてください。