【Python】エクセル操作:win32comを通してマクロVBAを使用する方法

時計 2020.10.28 / 時計

【Python】エクセル操作:win32comを通してマクロVBAを使用する方法

Pythonエクセルを操作するパッケージにはopenpyxlやxlwings、win32comなどがあります。

それぞれにメリット・デメリットがありますが、エクセルのマクロVBAに慣れている方はwin32comを使用するのがお勧めです。

なぜかというと、win32comならばVBAを操作することができるからです。

そのためほかのエクセル操作のパッケージではできないようなことも、win32comなら実現することができます。

逆にwin32comはPythonだけでなく、VBAの知識が必須になります。

本記事ではエクセル操作を目的として、Pythonのwin32comを通してマクロVBAを使用する方法を解説していきます。

win32comとは

pywin32ライブラリは、PythonからWindowsAPIのアクセスを提供しています。
公式GitHUBは以下リンクになります。

pywin32公式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に変換することもできます。

今回紹介した方法を応用して、ぜひ仕事の効率化や、アプリ作成にチャレンジしてみてください。