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()」というコードでブックを開く動作を行います。

【前準備】ブックの取得

シートを取得するためには先ずブックを取得する必要があります。

ブックの取得方法についてはこちらの記事をご確認ください。

https://www.hokkyokun.com/vbapythonxlwings/

簡単にブックを取得するコードを記載しておきます。

import xlwings as xw

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

# 新規作成のブック名
print(book.name)
# >>>Book1

# ブックを閉じる
book.close()

シートの取得(複数)

一つのブックに含まれているシートを全て取得します。

下記のブックの場合、「Sheet1」「Sheet2」「Sheet3」の三つのシートが存在します。
このシートを全て取得します。

VBA

Sub Sheets()
    
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    For Each ws In wb.Worksheets
        Debug.Print ws.Name
        '>>>Sheet1
        '>>>Sheet2
        '>>>Sheet3

    Next
End Sub

Python

book.sheets

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートの取得
sheets = book.sheets

for sheet in sheets:
    print(sheet.name)
    # >>>Sheet1
    # >>>Sheet2
    # >>>Sheet3

特定のシートの取得(単体)

上記のコードはブックに含まれるシートを全て取得しました。

特定のシートを取得するための方法をご紹介します。
同様のブックを使い、「Sheet1」を取得する方法です。

VBA

Sub Sheet()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    '    ---------------------------------
    '
    '            シートの取得
    '
    '    ---------------------------------
    
    'シート名で取得
    Set ws = wb.Worksheets("Sheet1")
    Debug.Print ws.Name
    '>>>Sheet1
    
    '番号で取得
    '※VBAは「1」からスタート
    'Pythonは「0」からスタート
    Set ws = wb.Worksheets(1)
    Debug.Print ws.Name
    '>>>Sheet1
    
End Sub

Python

book.sheets[“シート名”]

book.sheets[※番号]
※数字を入れる(1番目のシートは0から)

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シート名で取得
sheet = book.sheets["Sheet1"]
print(sheet.name)
# >>>Sheet1

# 番号で取得
# Pythonは「0」から
# VBAは「1」から
sheet = book.sheets[0]
print(sheet.name)
# >>>Sheet1

シートの追加

シートの追加です。

仕様がややことなり、シートを追加する方法の違いを理解する必要があります。

  • Python
    • シート名を指定できる
    • シート位置を番号で指定
      0」からスタート
    • VBAは先ず作成してから、シート名を後で指定する
  • VBA
    • シート追加とシート名指定は同時にできない
      追加してからシート名を後で変更する
    • シート位置を番号で指定するには
      VBAは「1」からスタート

共通点として

  • デフォルト(シート位置を指定しない)では、アクティブシートの前に作る
  • シート位置は”シート名”、シート番号で指定可能
    「前」「後ろ」両方可能

例として以下のようなシートを作ってみましょう。

  1. シートを 最後尾 に作る。
  2. シート名は「newSheet」とする。

上記のシート構成で

このようなシートを追加します。

VBA

Sub SheetAdd()
    Dim wb As Workbook
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    '最後尾にシートを追加
    Dim newSheet As Worksheet
    Set newSheet = wb.Worksheets.Add(after:=wb.Worksheets(wb.Worksheets.Count))
    
    'シート名を指定
    newSheet.Name = "newSheet"
    
End Sub

Python

book.sheets.add(“シート名” , after = “シート名” or 番号 )

※今回は最後尾(最も後ろ)に作るので「after」引数
前に作りたい場合は「before」引数

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートを最後尾に追加し、名前を「newSheet」にする
new_sheet = book.sheets.add("newSheet",after=book.sheets.count)

シート位置を指定しないとどうなるか

シート位置を指定しない場合、アクティブシートの前に、新たなシートを作ります。

下記のように「Sheet2」がアクティブな状態では
「Sheet2」の前にシートを作成することになります。

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# 指定しないと、アクティブシートの前にシートを作成する
# 今回の場合、「Sheet2」がアクティブなので、「Sheet2」の前に新しいシートが作成される
new_sheet = book.sheets.add("newSheet")

シートの削除

シートの削除方法です。
「Sheet2」を削除してみます。

上記のように「Sheet2」がある状態から

このようにシートを消します。

VBA

Sub DeleteSheet()
    Dim wb As Workbook
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    '「Sheet2」を削除
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet2")
    
    'Application.DisplayAlertsを False にしておかないとダイアログボックスが出てプログラムが一時停止される
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
    
    
End Sub

Python

Sheet.delete()

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートを取得
sheet = book.sheets["Sheet2"]

# シートを削除
sheet.delete()

VBAの場合は、Application.DisplayAlertsを False にしておかないとダイアログボックスが出てプログラムが一時停止されます。

Pythonの場合は、ダイアログボックスが出ずにシートが削除されます。
逆に言えば、セーフティネットがないので、十分に注意してコーディングしてください(試す前にファイル保存推奨!)。

シートの名前変更

特定のシートのシート名を変更します。

「Sheet1」というシート名を「シート」に変更します。

VBA

Sub ChangeSheetName()
    Dim wb As Workbook
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    '「Sheet1」を「シート」に変更
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet1")
    
    ws.Name = "シート"

End Sub

Python

sheet.name = “変更したいシート名”

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートを取得
sheet = book.sheets["Sheet1"]

sheet.name = "シート"

シートのコピー

シートのコピーをします。
ここでは同じブック内にあらたにシートをコピーする方法を紹介します。

「Sheet1」をコピーし、最後尾に新たなシートを作成します。

このように同じシートがコピーされてできます。

VBA

Sub SheetCopyToSameBook()
    Dim wb As Workbook
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet1")
    ws.Copy After:=wb.Worksheets(wb.Worksheets.Count)
    
End Sub

Python

sheet.copy(after=after_sheet)

※after_sheetはコピーする位置の手間にあるシートです。
「after」引数の場合、after_sheetの後ろにシートが追加されます。

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートを取得
sheet = book.sheets["Sheet1"]

# 末尾にシートを追加する。追加する位置にあるシートを取得する
# 末尾のシートはシートの数の数え方が「0」からなので、カウントを1減らす必要がある
after_sheet = book.sheets[book.sheets.count-1]

# ===============================================
#           シートコピー
# ===============================================
new_sheet = sheet.copy(after=after_sheet) 

# コピーしたシートを取得しておけば名前変更も容易
new_sheet.name = "コピーシート"

どちらもコピーと同時に名前変更はできません。

コピーしたシートを取得しておき、そのシートのシート名を後で変更すると良いでしょう。

シートの移動

特定のシートのシート名を変更します。

前:
Sheet1 >> Sheet2 >> Sheet3

後:
Sheet2 >> Sheet1 >> Sheet3

上記の並びを
下のように変えます。

VBA

Sub SheetMove()
    Dim wb As Workbook
    Dim filePath As String
    
    ' ブックを開く
    filePath = ThisWorkbook.Path & "\テスト.xlsx"
    Set wb = Workbooks.Open(filePath)
    
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet1")
    ws.Move After:=wb.Worksheets("Sheet2")
    
    '特定のシートの前に移動させたい場合は、「Before」引数を使う
    '今回の場合だとSheet3の前(= Sheet2の後ろ)となる。
    'ws.Move Befoer:=wb.Worksheets("Sheet3")
    
    
End Sub

Python

直接xlwingsでシートを移動させるメソッドはありません
ただし、xlwingsではできないというわけではありません

api属性を使って処理することで可能となります。

イメージとしては
xlwingsを使ってVBAを間接的に動かす感じです。

特定のシートの

sheet.api.Move(After=after_sheet.api)

after_sheetは移動させる位置にあるシートです
after_sheetの後ろに移動させることになります。

特定のシートの後に移動させるコードです。

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートを取得
sheet = book.sheets["Sheet1"]

# シートを移動させる位置(このシートの後ろに移動させる)
after_sheet = book.sheets["Sheet2"]

sheet.api.Move(After=after_sheet.api)

特定のシートの前に移動させることも可能です。
その場合は、

特定のシートの

sheet.api.Move(Before=before_sheet.api)

before_sheetも移動させる位置にあるシートで、
before_sheetの前に移動させます。

特定のシートの前に移動させるコードです。

import xlwings as xw

# ブックを開く
book = xw.Book("テスト.xlsx")

# シートを取得
sheet = book.sheets["Sheet1"]

# シートを移動させる位置(このシートの前に移動させる)
before_sheet = book.sheets["Sheet3"]

sheet.api.Move(Before=before_sheet.api)

シートの並べ替えはできるのか?

シートの並び替えをするメソッドはありません。

これはVBAでもxlwingsでもです。

なので、並び替えをするためには自分で関数を作る必要があります。
参考までに私が作成した並び替え関数をご紹介します。

def sort_sheets(book,sheet_names):
    """
    指定された順番にシートを並び替える

    Args:
        book (xw.Book): Excelブックオブジェクト
        sheet_names (list): 並び替え後のシート名のリスト
    """

    for i,name in enumerate(sheet_names):
        sheet = book.sheets[name]
        sheet.api.Move(Before=book.sheets[i].api)

適当に試してみます。

こういったランダムな順番のシートがあったとします。

これをまた、ランダムな順番にシートを並べ替えてみます。
(Pythonにはリストの要素をシャッフルしてくれる便利なライブラリがあります)

import xlwings as xw
import random

# ブックを開く
book = xw.Book("テスト.xlsx")

sheet_names = ["Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6"]

# Sheet_namesの要素をランダムにシャッフルして、その順番にシートを並び替えてみます。
random.shuffle(sheet_names)
print(sheet_names)
#>> 今回だと['Sheet6', 'Sheet3', 'Sheet1', 'Sheet5', 'Sheet4', 'Sheet2']という順番にしてみます。

sort_sheets(book,sheet_names)

Pythonってめっちゃ便利なんです。

関数を作るのもすごく簡単だし、作った関数がうまくいくかを簡単に検証もできます。(今回だとランダムにシャッフルして試す)

VBAだけでなく、ぜひPythonを使ってエクセル操作に挑戦してみてください。

シートからブックを取得する方法

VBA

Sub GetParentWorkbook()
    Dim filePath As String
    filePath = "C:\Users\hokky\Documents\マクロ\テスト.xlsx"
    
    'テスト.xlsxを取得
    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath)
    
    ' Sheet1を取得
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet1")
    
    'シートからブックを取得
    Dim wbParent As Workbook
    Set wbParent = ws.Parent
    
    Debug.Print wbParent.Name
    'テスト.xlsx
End Sub

Python

sheet.book

import xlwings as xw

# 相対パスでブックを開く
wb = xw.Book("テスト.xlsx")

# wb内のSheet1を取得
sheet = wb.sheets["Sheet1"]

# シートからブックを取得
parent_book = sheet.book

print(parent_book.name)
# テスト.xlsx