Python

【VBA⇒Python】xlwingsを使ってワークブック操作をVBAとPythonで比較

記事内に商品プロモーションを含む場合があります

xlwingsの使い方、特にワークブック関連について解説します。
xlwingsはVBAライクでエクセルを使うPythonのライブラリ(コード集)です。

VBAユーザーが使いたいPythonライブラリはいくつかありますが、
VBAに慣れている方が一番使いやすいのはxlwingsだと思います。

VBAのように実際に画面上でエクセルが動いているのがわかるので、VBAを使っているような感覚で操作できます。

くわしくはこちら

【VBA⇒Python移行】VBA使いが使用したいエクセル関連ライブラリの紹介と使い分け方 こんにちは、hokkyokunです。 今回の記事はVBAを普段使っているユーザーさん向けに書いています。 VBAを使えるよ...

VBAユーザーがPythonを学習する理由はこちら

【VBA⇒Python】VBAからPythonへ移行した方がいい理由と実用的な書き換え用例10選 こんにちは、hokkyokunです。 私はVBAからプログラミングのキャリアをはじめ、Python,HTML,CSSと勉強し、今...

Pythonを学ぶための方法はこちら
プログラミングスクールとなっていますが、それ以外にも安価で学ぶ方法も紹介しています。

【VBAユーザー向け】Pythonを学べるプログラミングスクール VBAユーザーがPythonを学ぶ理由 私はVBAユーザーにPythonを取得することをお勧めしています。 理由は...

xlwingsとは

xlwingsは、PythonからMicrosoft Excelを操作したり、逆にExcelからPythonのコードを実行したりするためのオープンソースのライブラリです。

主な特徴は以下のとおりです。

  1. PythonとExcelの双方向連携
    • PythonからExcelのブックやシート、セルの操作、書式設定、グラフの操作などの操作ができます。
    • Excelにボタンを設置し、Pythonで作成した関数(UDF: ユーザー定義関数)を呼び出して実行できます。
  2. Excelの操作
    • 実際にExcelを自動操作し、データの入出力、保存、新規作成などが可能です。
    • VBAで処理するようにExcelを使うことができます。
  3. Pythonの強力なライブラリとの連携
    • pandasやNumPyなどのPythonのデータ分析ライブラリと連携し、高度なデータ処理や分析をExcel上で行えます。
    • pandas:データ処理
    • Numpy:数学処理
    • request,selenium:スクレイピング(インターネットからの情報処理)

xlwingsを使うための準備

VBAユーザー向けにxlwingsを使うための準備を解説します。

Pythonのインストール

Pythonダウロード先はこちら
公式のダウンロードサイトです。

2025/3/5時点では、バージョンが3.13.2となっています。
「Download Python ○○」のボタンをクリックすると、ダウンロードができます。

ダウンロードされたファイルを開いて適切にインストールすればOKです。

インストールについては、別記事で解説します。

オンライン上でPythonを動かす方法もありますが、できれば自身のPCにインストールすることをお勧めします。

オフライン上でも動かせておく方が良いためです。
外出先でネット接続が遅い場合も対応できるし、オンライン上で扱うのがためらわれるようなデータを動かすこともできるので。

やってみると意外と簡単です

エディタのインストール

次にエディタのインストールです。

VBAでいうところの、Alt+F11で出てくる、「あれ」、です。
「あれ」をもっと使いやすく機能の充実したものを想像してください。

いろいろと選択肢があると思いますが、
特にこだわりがなければVSコードでいいと思います。

VBAのエディタに慣れていると、結構びっくりすることがいっぱいありますよ。
ざっくりですが、VBA使いからすると以下の点が優れているように思います。

  • インテリセンスがすごい
    関数・メソッドの説明が充実している(どうやって使うんだっけ?がほとんど解消されることも多い)
  • ショートカットキーが充実
    コメント化、タブ、コピー、削除…etc
  • 変数の検索がめちゃくちゃ楽(マウスを置くだけで、同じ変数がどこにあるかわかる)
  • タブ・ネストがわかりやすい(どこまでfor文、if文がかかっている一発でわかる)
  • インタラクティブなコーディングが可能
    短いコードを書いては試して…を繰り返してコーディングできる

インストール方法

VSコードのダウンロード公式サイトから
ダウンロードしてください。

こちらもWindows向けの説明をさせていただきます。

Windowsと大きく表示されたボタンをクリックしてください。
ダウンロードが開始されます。

インストールについては別記事で説明さえてください。
近日書き上げます。。

AIコードアシストをインストールする(任意)

AIを使った方がコーディングは楽になるので、できればやったほうがいいですが、別に必須ではないです。

別にブラウザからChatGPTやgeminiに聞いてコピペしてもいいですしね。
私も結構そうやっています。

geminiのAIアシストをインストールしてためしてみようと思うので、
そこも記事にします。。。

書く記事がいっぱいだな。。

xlwingsのインストール

Pythonをインストールしているとpipもインストールできていると思うので、それを使ってxlwingsのライブラリをインストールします。

私の場合windowsを使っているのwindowsでxlwingsをインストールする方法を記載します。

コマンドプロンプトを開いたら下記のコードを入力してください

pip install xlwings

もし、pipをアップグレードしてください的なコメントが出たら、下記のコマンドを入力してpipを最新のものにしてください。

python -m pip install --upgrade pip

xlwingsを使うにはimportが必要

Python、xlwingsの準備ができたので、実際に使用するための方法ですが、

かならず、コードの最初にxlwingをインポートしてください。

書き方は以下の通りです。

import xlwings as xw

このコードを必ず書き込むようにしてください。

このコードの意味は

「xlwings」というライブラリ(コードの塊、このコードを使ってエクセルを動かす)を取り込みますよという意味です。

「xlwings」だと、長すぎて使いづらいので「xw」という短い文字で対応させています。
これが「as xw」の部分です。

例えば、ブックを開くときは「xw.Book()」というコードでブックを開く動作を行います。

ブックを開く xw.Book(パス名)

VBA

①相対パスで開く

Sub openBook()

    Dim filePath As String
    Dim wb As Workbook
    
    '相対パス
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    
    Set wb = Workbooks.Open(filePath)

End Sub

②絶対パスで開く

Sub openBook()

    Dim filePath As String
    Dim wb As Workbook
    
    '絶対パス
    filePath = "C:\Users\hokky\Documents\マクロ\テスト.xlsx"
    
    Set wb = Workbooks.Open(filePath)

End Sub

Python

xw.Book(パス名)

①相対パスで開く

import xlwings as xw

# 相対パス

# カレントディレクトリ(現在のフォルダ)は
print(os.getcwd())
# c:\Users\hokky\Documents\MyPython\excel操作
 
 
relative_path = "テスト.xlsx"
wb = xw.Book(relative_path)

②絶対パスで開く

import xlwings as xw

# 絶対パス
absolute_path = r"c:\Users\hokky\Documents\MyPython\excel操作\テスト.xlsx"
wb = xw.Book(absolute_path)

私がPythonのプログラミング学習を始めたときに最初に躓いた点のひとつですが、

パス名の前の「r」について解説します。
マジでこれがわからず丸一日時間をかけたことがあります。

Pythonにおける文字列の先頭に付加するrは、その文字列を「raw文字列」として扱うことを意味します。

通常Pythonでの文字列の扱いとして、「バックスラッシュ」(うまく表示されないですが、「/」を反転させた形)として処理されます。

この「バックスラッシュ」はエスケープシーケンスという特別な役割があり、「バックスラッシュ+n」で改行などを表します。

先頭にrをつけていない文字列は「バックスラッシュ」をエスケープシーケンスとして読み、正しく、絶対パスであることを読み込んでくれなくなります。

「バックスラッシュ」が含まれる文字列を扱う場合は先頭に「r」をつけるようにしましょう。

新規ブックを作成 xw.Book()

VBA

Sub CreateNewWorkbook()
    Dim wb As Workbook
    ' 新規ブックを作成
    Set wb = Workbooks.Add
    
End Sub

Python

xw.Book()
※()内は空白

import xlwings as xw

# 新規ブックの作成
wb = xw.Book()

ブックの上書き保存 wb.save()

VBA

Sub SaveBook()
    
    Dim wb As Workbook
    Dim filePath As String
    
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    wb.Worksheets(1).Cells(1, 1).Value = "更新"
    
    wb.Save
    
End Sub

Python

wb.save()

デフォルト(引数で指定しない)
保存先はカレントディレクト(通常はプログラムが保存されているフォルダ)
ブック名は初期設定値(多くの場合Book1)

import xlwings as xw
wb = xw.Book("テスト2.xlsx")

# 上書き保存も可能
wb.sheets[0].range("A1").value = "更新"

# wb.save("テスト2.xlsx")と打っても結果は同じ
wb.save()

名前を付けて保存 wb.save(ファイル名)

VBA

Sub SaveAsBook()

    Dim wb As Workbook
    Dim filePath As String
    
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    wb.Worksheets(1).Cells(1, 1).Value = "更新"
    
    Dim newFilePath As String
    newFilePath = ThisWorkbook.Path & "\テスト2.xlsx"
    wb.SaveAs (newFilePath)

End Sub

Python

wb.save(新規ファイル名)

import xlwings as xw
wb = xw.Book("テスト2.xlsx")


# 上書き保存も可能
wb.sheets[0].range("A1").value = "更新"

# 絶対パスでもOK
wb.save("テスト3.xlsx")

ブックを閉じる wb.close()

VBA

Sub CloseBook()
    
    Dim wb As Workbook
    Dim filePath As String
    
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    wb.Worksheets(1).Cells(1, 1).Value = "更新"
    
    'シートが更新されているのに保存前に閉じようとすると、保存するかどうかを尋ねるダイアログボックスが出ます。
    wb.Close
    
    'SaveChanges引数でTreuに指定すると、保存して閉じます。
    wb.Close SaveChanges:=True
    
    'Falseの場合は保存しないで(「更新」という文字列が入らないで)閉じます。
    wb.Close SaveChanges:=False

End Sub

Python

wb.close()

import xlwings as xw
wb = xw.Book("テスト.xlsx")

wb.sheets[0].range("A1").value = "更新"

# Close()メソッドには引数はありません
# 保存(save)前にCloseメソッドで閉じると内容が保存されないまま閉じることになるので注意が必要です。
wb.close()

# wb.save()を使って保存する癖をつけましょう

注意点です。

  • xlwingsのClose()メソッドは内容を保存してから閉じてくれません!
  • 編集内容を残したい場合は必ず保存(save()メソッド)を使ってから閉じましょう

ブックのプロパティ操作

ブックの名前取得 wb.name

VBA

Sub BookName()

    Dim wb As Workbook
    Dim filePath As String
    
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    'ファイル名を取得
    Debug.Print wb.Name
    '>>>テスト.xlsx    
End Sub

Python

wb.name

import xlwings as xw

wb = xw.Book("テスト.xlsx")

# ブック名を取得
book_name = wb.name
print(book_name)
#>>>テスト.xlsx

ブックの保存されているフォルダパス取得 os.path.dirname(wb.fullname)

ファイルが保存されているフォルダ名までのパスの取得です。

VBA

Sub BookFilePath()

    Dim wb As Workbook
    Dim filePath As String
    
    'C:\Users\hokky\Documents\マクロ\テスト.xlsx
    filePath = "C:\Users\hokky\Documents\マクロ\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    Dim BookPath As String
    BookPath = wb.Path
    Debug.Print BookPath
    '>>>C:\Users\hokky\Documents\マクロ
    
End Sub

Python

import xlwings as xw
import os

file_path = r"C:\Users\hokky\Documents\MyPython\excel操作\テスト.xlsx"
wb = xw.Book(file_path)
dir_path = os.path.dirname(wb.fullname)
print(dir_path)
#>>>C:\Users\hokky\Documents\MyPython\excel操作

ブックのファイル名も含めたフルパス取得 wb.fullname

ブック名を含めたフォルダパス+ファイル名の取得です。

VBA

以下のようにエクセルファイルのある場所が
Users>hokky>Documents>マクロ 

そのフォルダ内にある「テスト.xlsx」というファイルのフルパスを取得するコードです。

Sub BookFullName()
    Dim wb As Workbook
    Dim filePath As String
    
    'C:\Users\hokky\Documents\マクロ\テスト.xlsx
    filePath = "C:\Users\hokky\Documents\マクロ\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    Dim FullName As String
    FullName = wb.FullName
    Debug.Print FullName
    '>>>C:\Users\hokky\Documents\マクロ\テスト.xlsx
End Sub

Python

以下のようにドキュメント>MyPython>excel操作のフォルダ内に
「テスト.xlsx」というエクセルファイルがある場合です。

import xlwings as xw

wb = xw.Book("テスト.xlsx")
full_name = wb.fullname
print(full_name)
#>>>C:\Users\hokky\Documents\MyPython\excel操作\テスト.xlsx

シートを取得 wb.sheets

上記のように一つのブック内にあるシートを全て取得する方法です。

「Sheet1」「Sheet2」「Sheet3」の三つのシートが存在しています。

VBA

Sub BookSheets()
    Dim wb As Workbook
    Dim filePath As String
    
    filePath = "C:\Users\hokky\Documents\マクロ\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    Dim Sheet As Worksheet
    
    'シートを取得し、名前を表示
    For Each Sheet In wb.Worksheets
        Debug.Print Sheet.Name
        '>>>Sheet1
        '>>>Sheet2
        '>>>Sheet3
    Next

End Sub

Python

import xlwings as xw

wb = xw.Book("テスト.xlsx")

# ブック内のシートを取得(Sheet1,Sheet2,Sheet3がある)
sheets = wb.sheets
for sheet in sheets:
    print(sheet.name) #シート名を表示
    # Sheet1
    # Sheet2
    # Sheet3

複数のブックを扱う xw.books

ブックが複数開いている場合、全てのブックを取得する方法です。

以下のように
「テスト.xlsx」
「テスト2.xlsx」
「テスト3.xlsx」
という三つのブックが開いている状態です。

VBA

Sub BookCollection()
    Dim wb As Workbook
    
    'Workbooksで現在開いているブックを取得できる
    For Each wb In Workbooks
        Debug.Print wb.Name
        'テスト.xlsx
        'テスト2.xlsx
        'テスト3.xlsx
        'forXlwings.xlsm ←VBAコードを書いているブック
    Next
        
End Sub

Python

import xlwings as xw

# 現在開いているブックを全取得
books = xw.books

# ブック名を一つ一つ取得
for book in books:
    print(book.name)
    # テスト.xlsx
    # テスト2.xlsx
    # テスト3.xlsx

単独のブックを取得することもできます。

books[ファイル名]

import xlwings as xw

books = xw.books

# 特定のブックを選択
test_book_1 = books["テスト.xlsx"]

# 後は同様にブックを操作できる
print(test_book_1.name)