当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますので、予めご了承ください。
Pythonのxlwingsでエクセルを直接操作する方法【VBAと比較】
Windows11環境のインストール版エクセルにライブラリ「xlwings」を使用してPythonから直接操作する方法について解説します。
本記事では、VBAと比較しながら同じ操作をPythonで実現する方法を解説します。
この記事で使用するPythonライブラリ
この記事では以下のPythonライブラリを使用します。
ライブラリ | 用途 | ライセンス |
---|---|---|
xlwings | Excelファイルの直接操作 | 修正BSD |
tkinter | GUI作成 | Python標準モジュール |
xlwingsの基本
xlwingsとは?
- Excelのリアルタイム操作: Excelアプリケーションを直接操作できるため、Excel上でPythonコードを実行してリアルタイムでデータを更新可能。
- VBAの代替: ExcelでVBAマクロのような操作ができ、PythonからExcelのVBAマクロを呼び出すことも可能。ExcelのスクリプトをPythonに置き換えたい場合に便利。
- データの双方向通信: ExcelのワークシートとPythonのデータフレームや配列を簡単にやり取りでき、Excelシートをデータベースのように扱うことが可能。
- WindowsとMacOSで利用可能: WindowsだけでなくMac環境でも動作可能(ただし、Windowsの方が機能が豊富)。
- Excelベースのアプリ開発: Excelをフロントエンドとして使用するアプリケーションを作成しやすく、ユーザーが馴染みのあるExcelインターフェースでPythonの処理を実行できる。
修正BSDライセンスのオープンソースであり、商用利用を含む自由な使用、修正、再配布が許可されています。
xlwingsのインストール
pip install xlwings
PythonからExcelを直接操作するためには、まず必要なライブラリをインストールする必要があります。
コードの入力と実行
以下のコードでは新規エクセルを開き、A1セルにHello, World!と出力し、"example.xlsx"として保存しています。
import xlwings as xw
# Excelアプリケーションを起動し、新しいワークブックを開く
wb = xw.Book()
# アクティブなシートを取得
sheet = wb.sheets.active
# セルA1にデータを書き込む
sheet.range("A1").value = "Hello, World!"
# ファイル名を指定して保存
wb.save("example.xlsx")
# Excelアプリケーションを閉じる
wb.close()
既存のファイルを指定するためには、Book()クラスの引数にファイル名を指定します。保存も同様です。
import xlwings as xw
# Excelアプリケーションを起動し、ファイル名を指定してを開く
wb = xw.Book("example.xlsx")
# アクティブなシートを取得
sheet = wb.sheets.active
# セルA2にデータを書き込む
sheet.range("A2").value = "Hello, World!"
# ファイル名を指定して保存
wb.save("example.xlsx")
Pythonファイルとエクセルファイルが異なるフォルダにある場合は、Book()の引数にファイルパスを指定します。保存も同様です。Pythonではファイルパスを指定するさいraw文字列リテラルという表記法を使用します。
ファイルパスが
C:\py\Excel\test\example.xlsx
の場合、Pythonでは以下のように表記します。
r"C:\py\Excel\test\example.xlsx"
全体のコードは以下のようになります。
import as xw
# Excelアプリケーションを起動し、ファイル名を指定してを開く
wb = xw.Book(r"C:\py\Excel\test\example.xlsx")
# アクティブなシートを取得
sheet = wb.sheets.active
# セルA3にデータを書き込む
sheet.range("A3").value = "Hello, World!"
# ファイル名を指定して保存
wb.save(r"C:\py\Excel\test\example.xlsx")
エクセルのファイル名を指定せず、現在開いているアクティブなブックを指定するにはxlwings.books.active
を使用します。
import xlwings as xw
# アクティブなブックを取得
wb = xw.books.active
# アクティブなシートを取得
sheet = wb.sheets.active
# セルA4にデータを書き込む
sheet.range("A4").value = "Hello, World!"
# 保存
wb.save()
標準メソッドと.api属性
PythonのxlwingsにはVBAと似たような操作を行うための標準メソッドが用意されていますが、標準メソッドで対応できない操作は、.api
属性を使用してVBAオブジェクトのメソッドにアクセスすることで実行できます。
もちろん、標準メソッドで用意されている操作も.api
属性を使用してVBAオブジェクトのメソッドにアクセスしても問題ありません。下記例では、.api
属性を使用し、VBAのRangeオブジェクトにアクセスしています。
import xlwings as xw
# アクティブなブックを取得
wb = xw.books.active
# アクティブなシートを取得
sheet = wb.sheets.active
# セルA5にデータを書き込む
sheet.api.Range("A5").Value = "Hello, World!" # VBAオブジェクトで値を設定
# 保存
wb.save()
xlwingsからVBAを呼び出す
xlwingsからVBAコードを呼び出すには、macro
メソッドを使います。これにより、Excelブック内のVBAマクロを実行できます。
- xlwingsからVBAを呼び出すには、Excelファイルがxlsm形式で保存されている必要がある(マクロ有効ブック)。
- Excelが信頼されている場所に保存されているか、マクロのセキュリティ設定が許可されている必要がある。
' VBAのマクロ(例)
Sub VBAmacro()
MsgBox "This is a VBA macro called from Python!"
End Sub
import xlwings as xw
# Excelブックを開く
wb = xw.Book("example.xlsm") # マクロが含まれたExcelファイル (.xlsm)
# VBAマクロの呼び出し
my_macro = wb.macro("VBAmacro")
my_macro() # マクロを実行
セルの操作
セルに値を入力
Pythonのxlwingsライブラリでは、
- range()プロパティやcell()プロパティを利用して値を入力できる。
VBAでは、
セルの指定方法にはRangeプロパティを使用する方法とCellsプロパティを使用する方法とがあります。
Excel VBA 入門講座
Sub HelloWorld()
' アクティブなブックを取得
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
' アクティブなシートを取得
Dim sheet As Worksheet
Set sheet = wb.ActiveSheet
' A1セルに "Hello, World!" と入力
sheet.Range("A1").Value = "Hello, World!"
' 2行1列(A2セル)に "Hello, World!" と入力
sheet.Cells(2, 1).Value = "Hello, World!"
End Sub
xlwingsでは、range
プロパティやcells
プロパティを利用して、以下のようにコーディングします。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets.active
# A1セルに "Hello, World!" と入力
sheet.range("A1").value = "Hello, World!"
# 2行1列(A2セル)に "Hello, World!" と入力
sheet.cells(2, 1).value = "Hello, World!"
シート名を指定してセルに値を入力
Pythonのxlwingsライブラリでは、
- VBAの"シート名を指定"または"インデックス番号で指定"に相当する方法でシート名を指定する。"オブジェクト名で指定"に相当する方法はない。
- インデックス番号で指定する場合、0から始まるので注意。
上記のコードではアクティブなシートを指定していました。次はシート名を指定し、セルに値を入力する方法を解説します。
VBAではシート名で指定、インデックス番号で指定、オブジェクト名で指定の3種類の指定法があります。
Sub HelloWorld()
' アクティブなブックを取得
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
'シート名で指定
Dim sheet_1 As Worksheet
Set sheet_1 = wb.Sheets("Sheet1")
' インデックス番号で指定
Dim sheet_2 As Worksheet
Set sheet_2 = Worksheets(2)
' オブジェクト名で指定
Dim sheet_3 As Worksheet
Set sheet_3 = Sheet3
sheet_1.Cells(1, 1).Value = "Hello, World!"
sheet_2.Cells(1, 1).Value = "Hello, World!"
sheet_3.Cells(1, 1).Value = "Hello, World!"
End Sub
xlwingsでは、シート名またはインデックス番号で指定することができます。オブジェクト名では指定できません。また、インデックス番号は0から始まることに注意してください。
import xlwings as xw
wb = xw.books.active
sheet_1 = wb.sheets["Sheet1"]
# インデックス番号で指定(2番目のシート)
sheet_2 = wb.sheets[1] # 0から始まるため、2番目はインデックス1
sheet_1.range("A1").value = "Hello, World!"
sheet_2.range("A1").value = "Hello, World!"
Valueプロパティ以外のプロパティ
Pythonのxlwingsライブラリでは、
- valueプロパティ以外のプロパティも操作できる。
VBAでは、
セルには、Valueプロパティの他にもさまざまなプロパティが用意されています。 以下の例では、セルにデータをセット後、セルの高さ(RowHeightプロパティ)と 幅(ColumnWidthプロパティに)に値をセットすることにより変えています。
Excel VBA 入門講座
Sub HelloWorld()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
sheet.Cells(1, 1).Value = "Hello, World!"
sheet.Cells(1, 1).RowHeight = 40
sheet.Cells(1, 1).ColumnWidth = 20
End Sub
xlwingsでは、以下のようにコーディングします。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# A1セルに "Hello, World!" と入力
sheet.cells(1, 1).value = "Hello, World!"
# A1セルの行の高さを40に設定
sheet.cells(1, 1).row_height = 40
# A1セルの列の幅を20に設定
sheet.cells(1, 1).column_width = 20
セル範囲指定
Pythonのxlwingsライブラリでは、
- range()メソッドを利用して範囲を指定して値を入力できる。
VBAでは、
セル範囲を指定する方法にはRangeプロパティを使用する方法とCellsプロパティを使用する方法とがあります。
Excel VBA 入門講座
Sub HelloWorld()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
sheet.Range("A1", "E7").Value = "Hello, World!"
sheet.Range("A1:E7").Value = "Hello, World!"
sheet.Range(Cells(1, 1), Cells(7, 5)).Value = "Hello, World!"
End Sub
xlwingsではrange
メソッドを使用して以下のようにコーディングします。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# A1:E7セル範囲に "Hello, World!" を設定
sheet.range("A1:E7").value = "Hello, World!"
# 1行目1列目から7行目5列目までのセル範囲に "Hello, World!" を設定
sheet.range((1, 1), (7, 5)).value = "Hello, World!"
最終行と最終列でセル範囲指定
Pythonのxlwingsライブラリでは、
- last_cell.rowプロパティとlast_cell.columnプロパティで総行数・総列数を取得できる。
- .end('up')メソッドと.end('left')メソッドを利用してデータが入っている最終行・最終列を取得できる。
VBAでセル範囲を指定する際にEnd
メソッドを使用して、最終行及び最終列を取得することもよくあります。
Sub HelloNewWorld()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
With sheet
' 最終行と最終列の取得
Dim lastRow As Long
Dim lastCol As Long
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
' 指定範囲を最終行と最終列に設定
.Range(sheet_1.Cells(1, 1), .Cells(lastRow, lastCol)).Value = "Hello, New World!"
End With
End Sub
xlwingsライブラリでもend
メソッドを使用して、データが存在する最終行および最終列を取得できます。
ここで、VBAのRows.Count
やColumns.Count
のように、xlwingsではlast_cell.row
とlast_cell.column
を使ってシートの総行数や総列数を取得できます
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# 総行数や総列数の取得
last_row = sheet.cells.last_cell.row
last_col = sheet.cells.last_cell.column
# データが入っている最終行と最終列を見つける
last_row = sheet.range(last_row, 1).end('up').row
last_col = sheet.range(1, last_col).end('left').column
# 指定範囲を最終行と最終列に設定
sheet.range((1, 1), (last_row, last_col)).value = "Hello, New World!"
行全体の指定と列全体の指定
Pythonのxlwingsライブラリでは、
- range()メソッドで行や列全体を指定できる。
- VBAのEntireRowプロパティやEntireColumnプロパティに相当するプロパティ等は無いが、.api.EntireRow.Valueや.api.EntireColumn.Valueを使用しVBAのオブジェクトにアクセスできる。
VBAではセル範囲の行や列の指定には、それぞれRowsプロパティやColumnsプロパティを使用します。また、Range
オブジェクトのEntireRow
プロパティやEntireColumn
プロパティを使用することもできます。
VBAでは、
Sub HelloWorld()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
' 2~5行に "Hello, World!" を入力
sheet.Rows("2:5").Value = "Hello, World!"
' B~E列に "Hello, World!" を入力
sheet.Columns("B:E").Value = "Hello, World!"
' 2~5行に "Hello, World!" を入力
sheet.Range(Cells(2, 2), Cells(5, 5)).EntireRow.Value = "Hello, World!"
' B~E列に "Hello, World!" を入力
sheet.Range(Cells(2, 2), Cells(5, 5)).EntireColumn.Value = "Hello, World!"
End Sub
xlwingsライブラリではrange
メソッドを使用します。また、VBAのEntireRow
プロパティやEntireColumn
プロパティに相当するプロパティはありませんが、.api
属性を使用することでVBAのオブジェクトにアクセスできます。
import xlwings as xw
wb = xw.books.active
sheet= wb.sheets["Sheet1"]
# 2~5行全体に "Hello, World!" を入力
sheet.range("2:5").value = "Hello, World!"
# B~E列全体に "Hello, World!" を入力
sheet.range("B:E").value = "Hello, World!"
# 2~5行に "Hello, World!" を入力
sheet.range((2, 2), (5, 5)).api.EntireRow.Value = "Hello, World!"
# B~E列に "Hello, World!" を入力
sheet.range((2, 2), (5, 5)).api.EntireColumn.Value = "Hello, World!"
または、for文でループ処理することもできます。Pythonのfor文では終了値を含まない仕様なので、5行目(ないし5列目)までを含めるには6までを指定します。
import xlwings
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# セル範囲 (B2:E5) の行全体に "Hello, World!" を入力
for row in range(2, 6): # 行2から行5まで
sheet.range((row, 1), (row, sheet_1.cells.last_cell.column)).value = "Hello, World!"
# セル範囲 (B2:E5) の列全体に "Hello, World!" を入力
for col in range(2, 6): # 列Bから列Eまで
sheet.range((1, col), (sheet_1.cells.last_cell.row, col)).value = "Hello, World!"
セルの削除(範囲・行・列)
Pythonのxlwingsライブラリでは、
- delete()メソッドを使用する。
- 引数shift="up"やshift="left"によりシフト方向を指定できる。引数を省略した際のシフト方向はVBAのDeleteメソッドと同じである。
VBAでは、
セルの削除にはDeleteメソッドを使用します。引数により削除後のセルのシフト方向を指定することができます。
Excel VBA 入門講座
引数を指定しない場合、【行数 = 列数】の場合は削除後、上方向にシフトします。 【行数 < 列数】の場合は左方向にシフトし、【行数 > 列数】の場合は削除後、上方向にシフトします。
セルの行または列を選択範囲とする場合、行の場合は削除後、上方向にシフトし、 列の場合は削除後、左方向にシフトします。
Sub DeleteCells()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
' セル範囲 (B1:E4) を削除(行数<列数なので左方向にシフト)
sheet.Range(Cells(1, 2), Cells(4, 4)).Delete
' セル範囲 (B1:D3) を削除(行数=列数なので上方向にシフト)
sheet.Range(Cells(1, 2), Cells(3, 4)).Delete
' セル範囲 (B1:E3) を削除(行数>列数なので上方向にシフト)
sheet.Range(Cells(1, 2), Cells(3, 5)).Delete
' セル範囲 (B1:E4) を削除(引数指定により上方向にシフト)
sheet.Range(Cells(1, 2), Cells(4, 4)).Delete Shift:=xlShiftUp
' セル範囲 (B1:E3) を削除(引数指定により左方向にシフト)
sheet.Range(Cells(1, 2), Cells(3, 5)).Delete Shift:=xlShiftToLeft
' 2~5行を削除 (上方向シフト)
sheet.Rows("2:5").Delete
' B~E列を削除 (左方向シフト)
sheet.Columns("B:E").Delete
End Sub
xlwingsでもdelete
メソッドを使用します。引数shift="up"
やshift="left"
によりとシフト方向を指定できます。引数を省略した際のシフト方向は、VBAのDeleteメソッドと同様です。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# セル範囲 (B1:E4) を削除(行数<列数なので左方向にシフト)
sheet.range((1, 2), (4, 4)).delete()
# セル範囲 (B1:D3) を削除(行数=列数なので上方向にシフト)
sheet.range((1, 2), (3, 4)).delete()
# セル範囲 (B1:E3) を削除(行数>列数なので上方向にシフト)
sheet.range((1, 2), (3, 5)).delete()
# セル範囲 (B1:E4) を削除(引数指定により上方向にシフト)
sheet_1.range((1, 2), (4, 4)).delete(shift="up")
# セル範囲 (B1:E3) を削除(引数指定により左方向にシフト)
sheet.range((1, 2), (3, 5)).delete(shift="left")
# 2~5行を削除(上方向シフト)
sheet.range("2:5").delete()
# B~E列を削除(左方向シフト)
sheet.range("B:E").delete()
セルのクリア(範囲・行・列)
Pythonのxlwingsライブラリでは、
- clear()メソッドなどを使用する。
VBAでは、
セルをクリアするメソッドには目的に合わせて色々あります。
Excel VBA 入門講座
Sub ClearCells()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
'セル範囲 (B1:D3) をクリア
sheet.Range(Cells(1, 2), Cells(3, 4)).Clear
' セル全範囲をクリア
sheet.Cells.Clear
' セル範囲 (B1:D3) の内容のみをクリア
sheet.Range(Cells(1, 2), Cells(3, 4)).ClearContents
' セル範囲 (B1:D3) の書式のみをクリア
sheet.Range(Cells(1, 2), Cells(3, 4)).ClearFormats
' 2~5行をクリア
sheet.Rows("2:5").Clear
' B~E列をクリア
sheet.Columns("B:E").Clear
End Sub
xlwingsでもclear()
メソッドなどを目的に応じて使用します。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# セル範囲 (A1:E7) に "Hello, World!" を設定
sheet.range((1, 1), (7, 5)).value = "Hello, World!"
# セル範囲 (B1:D3) をクリア
sheet.range((1, 2), (3, 4)).clear()
# シート全体をクリア
sheet.clear()
# セル範囲 (B1:D3) の内容のみをクリア
sheet.range((1, 2), (3, 4)).clear_contents()
# セル範囲 (B1:D3) の書式のみをクリア
sheet.range((1, 2), (3, 4)).clear_formats()
# 2~5行をクリア
sheet.range("2:5").clear()
# B~E列をクリア
sheet.range("B:E").clear()
セルの挿入(範囲・行・列)
Pythonのxlwingsライブラリでは、
- VBAのInsertメソッドに相当するメソッドは無いが、.api.Insert()を使用しVBAのオブジェクトにアクセスできる。
VBAでは、
セルの挿入にはInsertメソッドを使用します。引数により挿入後のセルのシフト方向を指定することができます。
Excel VBA 入門講座
引数を指定しない場合【行数 = 列数】の場合は挿入後、下方向にシフトします。 【行数 < 列数】の場合は挿入後、右方向にシフトし、【行数 > 列数】の場合は挿入後、下方向にシフトします。
セルの行または列を選択範囲とする場合、行の場合は挿入後、下方向にシフトし、列の場合は挿入後、右方向にシフトします。
Sub InsertCells()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
' セル範囲 (B1:E4) を挿入(行数<列数なので右方向にシフト)
sheet.Range(Cells(1, 2), Cells(4, 4)).Insert
' セル範囲 (B1:D3) を挿入(行数=列数なので下方向にシフト)
sheet.Range(Cells(1, 2), Cells(3, 4)).Insert
' セル範囲 (B1:E3) を挿入(行数>列数なので下方向にシフト)
sheet.Range(Cells(1, 2), Cells(3, 5)).Insert
' セル範囲 (B1:E4) を挿入(引数指定により下方向にシフト)
sheet.Range(Cells(1, 2), Cells(4, 4)).Insert Shift:=xlShiftDown
' セル範囲 (B1:E3) を挿入(引数指定により右方向にシフト)
sheet.Range(Cells(1, 2), Cells(3, 5)).Insert Shift:=xlShiftToRight
' 2~5行を挿入 (下方向シフト)
sheet.Rows("2:5").Insert
' B~E列を挿入 (右方向シフト)
sheet.Columns("B:E").Insert
End Sub
VBAのInsertメソッドに相当するメソッドはPythonのxlwingsにはありませんが、.api.Insert()
を使用することでVBAのオブジェクトにアクセスできます。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# セル範囲 (B1:E4) を挿入(行数<列数なので右方向にシフト)
sheet.range((1, 2), (4, 4)).api.Insert()
# セル範囲 (B1:D3) を挿入(行数=列数なので下方向にシフト)
sheet.range((1, 2), (3, 4)).api.Insert()
# セル範囲 (B1:E3) を挿入(行数>列数なので下方向にシフト)
sheet.range((1, 2), (3, 5)).api.Insert()
# セル範囲 (B1:E4) を挿入(引数指定により下方向にシフト)
sheet.range((1, 2), (4, 4)).api.Insert(Shift=xw.constants.InsertShiftDirection.xlShiftDown)
# セル範囲 (B1:E3) を挿入(引数指定により右方向にシフト)
sheet.range((1, 2), (3, 5)).api.Insert(Shift=xw.constants.InsertShiftDirection.xlShiftToRight)
# 2~5行を挿入(下方向シフト)
sheet.api.Rows("2:5").Insert()
# B~E列を挿入(右方向シフト)
sheet.api.Columns("B:E").Insert()
セルのコピー貼り付け
Pythonのxlwingsライブラリでは、
- valueプロパティを使って、セル範囲の値をコピー・貼り付けすることが可能(書式はコピーされない)。
- .api.Copy()を使ってVBAのCopyメソッドにアクセス可能(書式もコピーされる)。
VBAでは、
セルの範囲のコピー貼り付けにはCopyメソッドを使用します。貼り付け先を引数により指定します。
Excel VBA 入門講座
Sub CopyCells()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
'セルB1~C3の範囲をコピー貼り付け
Range(Cells(1, 2), Cells(3, 4)).Copy Destination:=Cells(5, 6)
End Sub
xlwingsには直接的なcopy
メソッドはありませんが、代わりにvalue
プロパティを使って、セル範囲の値をコピー・貼り付けすることが可能です。また、.api.Copy
を使ってVBAのCopy
メソッドにアクセスすることもできます。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# セル範囲 (B1:D3) をコピーし、セル (F5) に貼り付け
sheet.range(5, 6).value = sheet.range((1, 2), (3, 3)).value
# セル範囲 (B1:D3) をコピーし、セル (F5) に貼り付け
sheet.range((1, 2), (3, 4)).api.Copy(Destination=sheet.range(5, 6).api)
セルの切り取り貼り付け
Pythonのxlwingsライブラリでは、
- .api.Cut()を使ってVBAのCutメソッドにアクセス可能(書式もコピーされる)。
VBAでは、
セルの範囲の切り取り貼り付けにはCutメソッドを使用します。貼り付け先を引数により指定します。
Excel VBA 入門講座
Sub CutCells()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
'セルB1~D3の範囲を切り取り貼り付け
Range(Cells(1, 2), Cells(3, 4)).Cut Destination:=Cells(5, 6)
End Sub
xlwingsには直接的なcut
メソッドは無いので、.api.Cut
を使ってVBAのCut
メソッドにアクセスします。
import xlwings as xw
wb = xw.books.active
# "Sheet1" シートを取得
sheet = wb.sheets["Sheet1"]
# セル範囲 (B1:C3) を切り取り、セル (F5) に貼り付け
sheet.range((1, 2), (3, 4)).api.Cut(Destination=sheet.range(5, 6).api)
ワークシートの操作
ワークシートの追加
Pythonのxlwingsライブラリでは、
- .api.add()を使ってシートを追加できる。引数に追加する場所を指定可能。
- 追加するシート数は指定できないので、for文などを使うか、.apiを使う。
VBAでは、
ワークシートの追加にはAddメソッドを使用します。追加するシートの場所、数を引数で指定することができます。
Excel VBA 入門講座
Sub AddWorksheets()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
' ワークシートを追加
Worksheets.Add
' "Sheet1"の前にワークシートを追加
Worksheets.Add Before:=sheet
' "Sheet1"の後にワークシートを追加
Worksheets.Add After:=sheet
' ワークシートを3枚追加
Worksheets.Add Count:=3
' "Sheet1"の後にワークシートを3枚追加
Worksheets.Add After:=sheet, Count:=3
End Sub
xlwingsではadd()
メソッドを使いワークシートを追加します。引数に追加するシートの場所を指定できます。一方で追加するシート数を指定することはできないので、for
文で必要数追加します。もちろん、.api
を使用することもできます。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# ワークシートを追加
wb.sheets.add()
# "Sheet1"の前にワークシートを追加
wb.sheets.add(before=sheet)
# "Sheet1"の後にワークシートを追加
wb.sheets.add(after=sheet)
# ワークシートを3枚追加
for _ in range(3):
wb.sheets.add()
# "Sheet1"の後にワークシートを3枚追加
for _ in range(3):
wb.sheets.add(after=sheet)
# ワークシートを3枚追加(.api使用)
wb.api.Worksheets.Add(Count=3)
# "Sheet1"の後にワークシートを3枚追加(.api使用)
wb.api.Worksheets.Add(After=sheet.api, Count=3)
ワークシートの名前変更
Pythonのxlwingsライブラリでは、
- nameプロパティを使う。
VBAでは、
ワークシートの名前の変更にはNameプロパティを使用します。
Excel VBA 入門講座
Sub RenameWorksheets()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
' アクティブなワークシートの名前を"NewSheetName"変更
ActiveSheet.Name = "NewSheetName"
' シート"Sheet1"の名前を"NewSheetName"に変更
sheet.Name = "NewSheetName"
End Sub
xlwingsでもname
プロパティを使用します。
import xlwings as xw
wb = xw.books.active
sheet = wb.sheets["Sheet1"]
# アクティブなワークシートの名前を"NewSheetName"に変更
wb.sheets.active.name = "NewSheetName"
# シート"Sheet1"の名前を"NewSheetName"に変更
sheet.name = "NewSheetName"
ワークシートの移動
Pythonのxlwingsライブラリでは、
- .api.Move()を使ってVBAのMoveメソッドにアクセス可能。
VBAでは、
ワークシートの移動にはMoveメソッドを使用し移動先を引数で指定します。
Excel VBA 入門講座
Sub MoveWorksheets()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet_1 = wb.Sheets("Sheet1")
Set sheet_2 = wb.Sheets("Sheet2")
' 現在アクティブなシートを"Sheet2"の後ろに移動する
ActiveSheet.Move After:=sheet_2
' 現在アクティブなシートを"Sheet2"の前に移動する
ActiveSheet.Move Before:=sheet_2
'"Sheet1"を"Sheet2"の後ろに移動する
sheet_1.Move After:=sheet_2
'"Sheet1"を"Sheet2"の後ろに移動する
sheet_1.Move Before:=sheet_2
End Sub
xlwingsにはmove
メソッドはないので、.api.Move()
メソッドを使用します。
import xlwings as xw
# アクティブなブックを取得
wb = xw.books.active
# "Sheet1" と "Sheet2" シートを取得
sheet_1 = wb.sheets["Sheet1"]
sheet_2 = wb.sheets["Sheet2"]
# 現在アクティブなシートを "Sheet2" の後ろに移動
wb.sheets.active.api.Move(After=sheet_2.api)
# 現在アクティブなシートを "Sheet2" の前に移動
wb.sheets.active.api.Move(Before=sheet_2.api)
# "Sheet1" を "Sheet2" の後ろに移動
sheet_1.api.Move(After=sheet_2.api)
# "Sheet1" を "Sheet2" の前に移動
sheet_1.api.Move(Before=sheet_2.api)
ワークシートのコピー
Pythonのxlwingsライブラリでは、
- .api.Copy()を使ってVBAのCopyメソッドにアクセス可能。
VBAでは、
ワークシートのコピーにはCopyメソッドを使用しCopy先を引数で指定します。
Excel VBA 入門講座
Sub CopyWorksheets()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet_1= wb.Sheets("Sheet1")
Set sheet_2 = wb.Sheets("Sheet2")
' 現在アクティブなシートを"Sheet1"の後ろにコピーする
ActiveSheet.Copy After:=sheet_1
' 現在アクティブなシートを"Sheet1"の前にコピーする
ActiveSheet.Copy Before:=sheet_1
' "Sheet1"を"Sheet2"の後ろにコピーする
sheet_1.Copy After:=sheet_2
' "Sheet1"を"Sheet2"の前にコピーする
sheet_1.Copy Before:=sheet_2
End Sub
xlwingsにはcopy
メソッドはないので、.api.Copy()
メソッドを使用します。
import xlwings as xw
# アクティブなブックを取得
wb = xw.books.active
# "Sheet1" と "Sheet2" シートを取得
sheet_1 = wb.sheets["Sheet1"]
sheet_2 = wb.sheets["Sheet2"]
# 現在アクティブなシートを "Sheet1" の後ろにコピー
wb.sheets.active.api.Copy(After=sheet_1.api)
# 現在アクティブなシートを "Sheet1" の前にコピー
wb.sheets.active.api.Copy(Before=sheet_1.api)
# "Sheet1" を "Sheet2" の後ろにコピー
sheet_1.api.Copy(After=sheet_2.api)
# "Sheet1" を "Sheet2" の前にコピー
sheet_1.api.Copy(Before=sheet_2.api)
ワークシートの削除
Pythonのxlwingsライブラリでは、
- delete()メソッドを使う。
- Application.DisplayAlertsはapp.display_alertsプロパティを使う。
VBAでは、
ワークシートの削除にはDeleteメソッドを使用します。
Excel VBA 入門講座
削除時のアラートメッセージを回避する為にApplicationオブジェクトのDisplayAlertsプロパティにFalseを設定し削除後Trueを設定します。
Sub DeleteWorksheets()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
Dim sheet As Worksheet
Set sheet = wb.Sheets("Sheet1")
' 現在アクティブなシートを削除する
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
' "Sheet1"を削除する
Application.DisplayAlerts = False
sheet.Delete
Application.DisplayAlerts = True
End Sub
xlwingsでもdelete
メソッドを使用してシートを削除します。また、削除時の警告メッセージを無効化するために、app.display_alerts
プロパティを使用します。
import xlwings as xw
# アクティブなブックとアプリケーションを取得
wb = xw.books.active
app = xw.apps.active
sheet = wb.sheets["Sheet1"]
# 現在アクティブなシートを削除する(警告メッセージを一時的に無効化)
app.display_alerts = False
wb.sheets.active.delete()
app.display_alerts = True
# "Sheet1" を削除する(警告メッセージを一時的に無効化)
app.display_alerts = False
sheet.delete()
app.display_alerts = True
ワークシートのイベントプロシージャ
Pythonのxlwingsライブラリでは、
- ワークシートのイベントプロシージャはサポートされていない。
VBAでは、
Worksheetのイベントプロシージャとは、"マウスでセルを選択した"、"シートを選択した"といった具合にシートに対して操作(イベント)を行った際に実行されるプロシージャです。
Excel VBA 入門講座
VBAでは以下のようなイベントプロシージャが用意されています。
' ワークシートがアクティブになった時に発生
Private Sub Worksheet_Activate()
MsgBox "シートがアクティブになりました。"
End Sub
' ワークシートのセルを選択したときに発生
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "シートのセルが選択されました。"
End Sub
' ワークシートの内容が変更となった時に発生
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "シートの内容が変更されました"
End Sub
' ワークシートで計算処理後に発生
Private Sub Worksheet_Calculate()
MsgBox "シートで計算処理されました"
End Sub
' ワークシートでセルをダブルクリックする前に発生
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
MsgBox "シートがダブルクリックされました"
End Sub
' ワークシートでセルを右クリックする前に発生
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
MsgBox "シートが右クリックされました"
End Sub
' ワークシートがアクティブでなくなった時に発生
Private Sub Worksheet_Deactivate()
MsgBox "シートが非アクティブになりました。"
End Sub
xlwingsでは、これらのイベントはサポートされていません。
ワークブックの操作
ワークブックの作成
Pythonのxlwingsライブラリでは、
- Book()クラスのインスタンスを生成することで、新しいワークブックを作成できる。
VBAでは、
ワークブックの作成にはAddメソッドを使用します。
Excel VBA 入門講座
'ワークブックを新規に作成する
Sub AddWorkbook()
Workbooks.Add
End Sub
xlwingsではBook()
クラスのインスタンスを生成することで、新しいワークブックを作成できます。
import xlwings as xw
# 新しいワークブックを作成
new_workbook = xw.Book()
ワークブックを開く
Pythonのxlwingsライブラリでは、
- Book()クラスの引数にファイルパスを指定することで、既存のワークブックを開くことができる。
VBAでは、
ワークブックを開くにはOpenメソッドを使用します。
Excel VBA 入門講座
Sub OpenWorkbooks()
'"C:\py\"に保存されている"example.xlsx"ワークブックを開く
Workbooks.Open Filename:="C:\py\example1.xlsx"
'パスワード保護されたブックを開く
Workbooks.Open Filename:="C:\py\example2.xlsx", Password:="password"
'書き込み保護されたブックを開く
Workbooks.Open Filename:="C:\py\example3.xlsx", WriteResPassword:="password"
'ブックを読み取り専用モードで開く
Workbooks.Open Filename:="C:\py\example4.xlsx", ReadOnly:=True
End Sub
xlwingsではBook()
クラスの引数にファイルパスを指定することで、既存のワークブックを開くことができます。
import xlwings as xw
# 通常のワークブックを開く
workbook1 = xw.Book(r"C:\py\example1.xlsx")
# パスワード保護されたブックを開く
workbook2 = xw.Book(r"C:\py\example2.xlsx", password="password")
# 書き込み保護されたブックを開く
workbook3 = xw.Book(r"C:\py\example3.xlsx", write_res_password="password")
# 読み取り専用モードでブックを開く
workbook4 = xw.Book(r"C:\py\example4.xlsx", read_only=True)
組み込みダイアログ ボックスによりブックを開く
Pythonのxlwingsライブラリでは、
- ファイル選択ダイアログなどが必要な場合はGUIライブラリを使用する。
VBAでは、
組み込みダイアログ ボックスによりブックを開くにはDialogsオブジェクトを使用します。
Excel VBA 入門講座
Sub OpenWorkbook()
'組み込みダイアログ ボックスによりブックを開く
Application.Dialogs(xlDialogOpen).Show
End Sub
xlwingsでは、ExcelのDialogsオブジェクトに相当するオブジェクトは提供されていないため、ファイル選択ダイアログなどが必要な場合はGUIライブラリを使用します。ここでは、標準モジュールのtkinterを使用します。
import xlwings as xw
from tkinter import Tk, filedialog
def open_workbook():
# Tkinterのルートウィンドウを作成して隠す
root = Tk()
root.withdraw()
# ファイル選択ダイアログを開き、Excelファイルのパスを取得
file_path = filedialog.askopenfilename(
title="ブックを開く",
filetypes=[("Excel files", "*.xlsx;*.xlsm;*.xlsb;*.xls")]
)
# ファイルが選択された場合、そのファイルを開く
if file_path:
workbook = xw.Book(file_path)
print(f"{file_path} を開きました。")
# 関数を呼び出してブックを開く
open_workbook()
ワークブックを閉じる
Pythonのxlwingsライブラリでは、
- ワークブックを閉じるにはclose()メソッドを使用する
- 閉じる前に変更を保存したい場合は、save()メソッドを別途呼び出す必要がある。
VBAでは、
ワークブックを閉じるにはCloseメソッドを使用します。引数により保存して閉じる、保存しないで閉じるを指定できます。
Excel VBA 入門講座
Sub CloseWorkbooks()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
' アクティブなワークブックを保存して閉じる
wb.Close SaveChanges:=True
' アクティブなワークブックを保存しないで閉じる
wb.Close SaveChanges:=False
'アクティブなワークブックを別名で保存して閉じる
wb.SaveAs Filename:="example.xlsx"
wb.Close SaveChanges:=False
End Sub
xlwingsでは、ワークブックを閉じるにはclose()
メソッドを使用します。ただし、閉じる前に変更を保存したい場合は、save()
メソッドを別途呼び出す必要があります。
import xlwings as xw
# アクティブなワークブックを取得
wb = xw.books.active
# アクティブなワークブックを保存して閉じる
wb.save()
wb.close()
# アクティブなワークブックを保存せずに閉じる
wb.close(save_changes=False)
# アクティブなワークブックを別名で保存して閉じる
wb.save("example.xlsx")
wb.close(save_changes=False)
ワークブックを閉じると共にExcelを終了する場合
Pythonのxlwingsライブラリでは、
- Excelを終了するにはquit()メソッドを使用。
VBAでは、
ワークブックを閉じると共にExcelを終了する場合はApplicationオブジェクトとQuitメソッドを使用します。
Excel VBA 入門講座
Sub CloseWorkbooks()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
' Excelを終了する。
Application.Quit
' アクティブなワークブックを保存して閉じる
wb.Close SaveChanges:=True
End Sub
xlwingsでは、Excelを終了するにはquit()
メソッドを使用します。
import xlwings as xw
# Excelアプリケーションを取得
app = xw.apps.active
# アクティブなワークブックを取得
wb = app.books.active
# アクティブなワークブックを保存して閉じる
wb.save()
wb.close()
# Excelアプリケーションを終了する
app.quit()
ワークブックを保存する
Pythonのxlwingsライブラリでは、
- .api.SaveAs()を使用。
- Excelのファイル形式定数は自動的に提供されないため、必要な定数を自分で定義する必要がある。
VBAでは、
ワークブックの保存にはSaveAsメソッドを使用します。引数によりファイル名、ファイル形式、パスワードを設定することができます。
Excel VBA 入門講座
なお、ファイル名のみを指定した場合、Windowsの「ドキュメント」フォルダに保存されます。
Sub SaveWorkbooks()
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
' アクティブなワークブックを名前を付けて保存する
wb.SaveAs Filename:="example6.xlsx"
' アクティブなワークブックをCSVファイルとして名前を付けて保存する
wb.SaveAs Filename:="example7.csv", FileFormat:=xlCSV
' アクティブなワークブックを読み取りパスワードを設定して名前をつけて保存する
wb.SaveAs Filename:="example8.xlsx", Password:="password", FileFormat:=xlOpenXMLWorkbook
' アクティブなワークブックを書き込みパスワードを設定して名前をつけて保存する
wb.SaveAs Filename:="example9.xlsx", WriteResPassword:="password", FileFormat:=xlOpenXMLWorkbook
End Sub
xlwingsでVBAと同じ動作にするには、.api.SaveAs()
を使用します。Excelのファイル形式定数は自動的に提供されないため、必要な定数を自分で定義する必要があります。
import xlwings as xw
# アクティブなワークブックを取得
wb = xw.books.active
# アクティブなワークブックを名前を付けて保存する(Pythonファイルと同じ場所)
wb.save("example6.xlsx")
# アクティブなワークブックを名前を付けて保存する
wb.api.SaveAs(Filename="example6.xlsx")
# アクティブなワークブックをCSVファイルとして名前を付けて保存する
xlCSV = 6 # Excelのファイル形式定数 xlCSV の値
wb.api.SaveAs(Filename="example7.csv", FileFormat=xlCSV)
# アクティブなワークブックを読み取りパスワードを設定して名前を付けて保存する
xlOpenXMLWorkbook = 51 # Excelのファイル形式定数 xlOpenXMLWorkbook の値
wb.api.SaveAs(Filename="example8.xlsx", FileFormat=xlOpenXMLWorkbook, Password="password")
# アクティブなワークブックを書き込みパスワードを設定して名前を付けて保存する
xlOpenXMLWorkbook = 51 # Excelのファイル形式定数 xlOpenXMLWorkbook の値
wb.api.SaveAs(Filename="example9.xlsx", FileFormat=xlOpenXMLWorkbook, WriteResPassword="password")
まとめ
本記事では、PythonからWindows11環境のExcelを直接操作する方法について、必要なライブラリや基礎的なコード例を解説しました。
Pythonの「xlwings」ライブラリを使用することで、Excelファイルのリアルタイム編集やVBAの代替としての活用が可能になり、データの双方向通信やExcelベースのアプリ開発にも対応できます。
これにより、業務効率を高めるExcel操作がプログラミングの力で実現できるようになります。ぜひ試してみてください。