Pythonのwin32com.clientでエクセルを直接操作する方法【VBAと比較】

Pythonのxlwingsでエクセルを直接操作する方法
  • URLをコピーしました!

当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますので、予めご了承ください。

Windows11環境のインストール版エクセルにライブラリ「win32com.client」を使用してPythonから直接操作する方法について解説します。

本記事では、VBAと比較しながら同じ操作をPythonで実現する方法を解説します。

目次

この記事で使用するPythonライブラリ

この記事では以下のPythonライブラリを使用します。

ライブラリ用途ライセンス
win32com.clientWindows環境限定でExcelを直接操作できるCOMライブラリPSF
osファイルやフォルダの操作Python標準モジュール

win32com.clientの基本

win32com.clientとは?

  • COMオブジェクトの操作: WindowsのCOMオブジェクトをPythonから制御できるため、ExcelやWord、PowerPointなどのアプリケーションと連携が可能。
  • Excelのリアルタイム操作: Excelアプリケーションを直接操作でき、Excel上でPythonコードを実行してリアルタイムでデータを更新可能。
  • ファイルアクセスと管理: Windowsのファイルやディレクトリ構造を操作する機能も提供されており、システムタスクの自動化に活用可能。
  • 簡単なAPI呼び出し: Pythonコードから直接APIを呼び出せるため、スクリプトの記述が容易で、簡潔なコードで操作可能。
  • イベント処理: アプリケーションからのイベントに対応するハンドラーを作成し、Excelのセル変更やWordのドキュメント保存時などのイベントを検知して処理可能。

PSFライセンスのオープンソースであり、商用利用を含む自由な使用、修正、再配布が許可されています。

win32com.clientのインストール

PythonからExcelを直接操作するためには、まず必要なライブラリをインストールします。

pip install pywin32

コードの入力と実行

以下のコードでは新規エクセルを開き、A1セルにHello, World!と出力し、"example.xlsx"として保存しています。

import win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True # Excelを表示にする(Falseにすると非表示)

# 新しいワークブックを作成
wb = excel.Workbooks.Add()

# アクティブなシートを取得
sheet = wb.ActiveSheet

# セルA1にデータを書き込む
sheet.Range("A1").Value = "Hello, World!"

# ファイル名を指定して保存
file_path = r"C:\py\win32com\example.xlsx"  # 保存するファイルパスを指定
wb.SaveAs(file_path)

# Excelアプリケーションを閉じる
wb.Close(SaveChanges=False)
excel.Quit()

既存のファイルを指定するためには、Workbooks.Open()メソッドの引数にファイルパスを指定します。ファイルを保存する際は、上書き保存する場合はSave()メソッドを使用します。

import win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# ファイルを開く
file_path = r"C:\py\win32com\example.xlsx"
wb = excel.Workbooks.Open(file_path)

# アクティブなシートを取得
sheet = wb.ActiveSheet

# セルA2にデータを書き込む
sheet.Range("A2").Value = "Hello, World!"

# ファイルを保存
wb.Save()

# Excelアプリケーションを閉じる
wb.Close(SaveChanges=True)
excel.Quit()

Pythonではファイルパスを指定するさいraw文字列リテラルという表記法を使用します。

ファイルパスが

C:\py\win32com\example.xlsx

の場合、Pythonでは以下のように表記します。

r"C:\py\win32com\example.xlsx"

相対パスで指定も可能です。

ただし、相対パスは現在の作業ディレクトリに依存するため、スクリプトの実行環境が異なるとファイルが見つからない可能性があります。相対パスを確実に使用したい場合は、Pythonのosモジュールを使ってスクリプトの場所に基づいた絶対パスに変換するのがおすすめです。

import win32com.client as win32
import os

# スクリプトのディレクトリを基準に相対パスを絶対パスに変換
file_path = os.path.join(os.path.dirname(__file__), 'example.xlsx')
print(file_path)

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True

# 相対パスで指定されたファイルを開く
wb = excel.Workbooks.Open(file_path)

# アクティブなシートを取得
sheet = wb.ActiveSheet

# セルA3にデータを書き込む
sheet.Range("A3").Value = "Hello, World!"

# 保存
wb.Save()
wb.Close(SaveChanges=True)
excel.Quit()

win32com.clientで現在開いているアクティブなブックを取得するには、ActiveWorkbookプロパティを使用します。また、アクティブなシートの取得にはActiveSheetを使用します。

import win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# アクティブなブックを取得
wb = excel.ActiveWorkbook

# アクティブなシートを取得
sheet = wb.ActiveSheet

# セルA4にデータを書き込む
sheet.Range("A4").Value = "Hello, World!"

# 保存
wb.Save()

win32com.clientからVBAを呼び出す

win32com.clientを使用してVBAコードを呼び出すには、Application.Runメソッドを使用します。これにより、Excelブック内に含まれているVBAマクロを実行できます。

win32com.clientからVBAを呼び出すには、

  • Excelファイルがxlsm形式で保存されている必要がある(マクロ有効ブック)。
  • Excelが信頼されている場所に保存されているか、マクロのセキュリティ設定が許可されている必要がある。
' VBAのマクロ(例)
Sub VBAmacro()
    MsgBox "This is a VBA macro called from Python!"
End Sub
import win32com.client as win32
import os

# ファイルを開く
file_path = r"C:\py\win32com\example.xlsm"

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# Excelブックを開く
wb = excel.Workbooks.Open(file_path)

# VBAマクロの呼び出し
excel.Application.Run(f"{wb.Name}!VBAmacro")  # マクロ名を指定して実行

セルの操作

セルに値を入力

Pythonのwin32com.clientライブラリでは、

  • VBAと同様にRangeプロパティCellsプロパティを使用してセルを指定できる。

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

win32com.clientでは、RangeプロパティやCellsプロパティを使用してセルに値を入力します。

import win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# アクティブなブックを取得
wb = excel.ActiveWorkbook

# アクティブなシートを取得
sheet = wb.ActiveSheet

# A1セルに "Hello, World!" と入力
sheet.Range("A1").Value = "Hello, World!"

# 2行1列(A2セル)に "Hello, World!" と入力
sheet.Cells(2, 1).Value = "Hello, World!"

シート名を指定してセルに値を入力

Pythonのwin32com.clientライブラリでは、

  • VBAの"シート名を指定"または"インデックス番号で指定"に相当する方法でシート名を指定する。"オブジェクト名で指定"に相当する方法はない。
  • インデックス番号で指定する場合、VBA同様1から始まる。

上記のコードではアクティブなシートを指定していました。次はシート名を指定し、セルに値を入力する方法を解説します。

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 win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# アクティブなブックを取得
wb = excel.ActiveWorkbook

# シート名で指定
sheet_1 = wb.Sheets("Sheet1")

# インデックス番号で指定
sheet_2 = wb.Sheets(2)

# 各シートに "Hello, World!" を入力
sheet_1.Cells(1, 1).Value = "Hello, World!"
sheet_2.Cells(1, 1).Value = "Hello, World!"

Valueプロパティ以外のプロパティ

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientでは、以下のようにコーディングします。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

wb = excel.ActiveWorkbook

sheet = wb.Sheets("Sheet1")

# セルに値を入力し、行高さと列幅を設定
sheet.Cells(1, 1).Value = "Hello, World!"
sheet.Cells(1, 1).RowHeight = 40
sheet.Cells(1, 1).ColumnWidth = 20

セル範囲指定

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientではRange()メソッドを使用して以下のようにコーディングします。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# 各範囲に "Hello, World!" を設定
sheet.Range("A1", "E7").Value = "Hello, World!"
sheet.Range("A1:E7").Value = "Hello, World!"
sheet.Range(sheet.Cells(1, 1), sheet.Cells(7, 5)).Value = "Hello, World!"

最終行と最終列でセル範囲指定

Pythonのwin32com.clientライブラリでは、

  • End()メソッドを使用する。
  • xlUpとxlToLeftといったキーワード定数はそのまま使えないため、win32com.client.constantsをインポートして定数を参照する。

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

win32com.clientライブラリでもEnd()メソッドを使用して、データが存在する最終行および最終列を取得できます。win32comではVBAのようにxlUpxlToLeftといったキーワード定数を直接使えないため、win32com.client.constantsをインポートして定数を参照します。

import win32com.client as win32
from win32com.client import constants  # 定数をインポート

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# アクティブなブックを取得
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# 最終行と最終列の取得
last_row = sheet.Cells(sheet.Rows.Count, 1).End(constants.xlUp).Row  # xlUpを使用
last_col = sheet.Cells(1, sheet.Columns.Count).End(constants.xlToLeft).Column  # xlToLeftを使用

# 指定範囲を最終行と最終列に設定
sheet.Range(sheet.Cells(1, 1), sheet.Cells(last_row, last_col)).Value = "Hello, New World!"

行全体の指定と列全体の指定

Pythonのwin32com.clientライブラリでは、

  • Rows()メソッドColumnsメソッドで行や列全体を指定できる。
  • VBAのEntireRowプロパティやEntireColumnプロパティに相当するプロパティも用意されている。

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

win32com.clientライブラリでもRows()メソッドやColumns()メソッドを使用します。また、VBAのEntireRowプロパティやEntireColumnプロパティに相当するプロパティも用意されています。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示
wb = excel.ActiveWorkbook
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(sheet.Cells(2, 2), sheet.Cells(5, 5)).EntireRow.Value = "Hello, World!"

# B~E列に "Hello, World!" を入力
sheet.Range(sheet.Cells(2, 2), sheet.Cells(5, 5)).EntireColumn.Value = "Hello, World!"

または、for文でループ処理することもできます。Pythonのfor文では終了値を含まない仕様なので、5行目(ないし5列目)までを含めるには6までを指定します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# セル範囲 (B2:E5) の行全体に "Hello, World!" を入力
for row in range(2, 6):  # 行2から行5まで
    sheet.Rows(row).Value = "Hello, World!"

# セル範囲 (B2:E5) の列全体に "Hello, World!" を入力
for col in range(2, 6):  # 列Bから列Eまで
    sheet.Columns(col).Value = "Hello, World!"

セルの削除(範囲・行・列)

Pythonのwin32com.clientライブラリでは、

  • Delete()メソッドを使用する。
  • 引数Shift=constants.xlShiftUpShift=constants.xlShiftToLeftによりシフト方向を指定できる。引数を省略した際のシフト方向は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

win32com.clientでもDelete()メソッドを使用します。Shift=constants.xlShiftUpShift=constants.xlShiftToLeftによりシフト方向を指定できます。引数を省略した際のシフト方向はVBAのDeleteメソッドと同じです。

import win32com.client as win32
from win32com.client import constants  # 定数をインポート

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# セル範囲 (B1:E4) を削除(行数 < 列数なので左方向にシフト)
sheet.Range(sheet.Cells(1, 2), sheet.Cells(4, 4)).Delete()

# セル範囲 (B1:D3) を削除(行数 = 列数なので上方向にシフト)
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).Delete()

# セル範囲 (B1:E3) を削除(行数 > 列数なので上方向にシフト)
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 5)).Delete()

# セル範囲 (B1:E4) を削除(引数指定により上方向にシフト)
sheet.Range(sheet.Cells(1, 2), sheet.Cells(4, 4)).Delete(Shift=constants.xlShiftUp)

# セル範囲 (B1:E3) を削除(引数指定により左方向にシフト)
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 5)).Delete(Shift=constants.xlShiftToLeft)

# 2~5行を削除(上方向シフト)
sheet.Rows("2:5").Delete()

# B~E列を削除(左方向シフト)
sheet.Columns("B:E").Delete()

セルのクリア(範囲・行・列)

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientでもClear()メソッドなどを目的に応じて使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True 
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# セル範囲 (B1:D3) をクリア
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).Clear()

# シート全体のセルをクリア
sheet.Cells.Clear()

# セル範囲 (B1:D3) の内容のみをクリア
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).ClearContents()

# セル範囲 (B1:D3) の書式のみをクリア
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).ClearFormats()

# 2~5行をクリア
sheet.Rows("2:5").Clear()

# B~E列をクリア
sheet.Columns("B:E").Clear()

セルの挿入(範囲・行・列)

Pythonのwin32com.clientライブラリでは、

  • Insert()メソッドを使用する。
  • 引数Shift=constants.xlShiftUpShift=constants.xlShiftToLeftによりシフト方向を指定できる。引数を省略した際のシフト方向はVBAのInsertメソッドと同じである。

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

win32com.clientでもInsert()メソッドを使用します。Shift:=xlShiftDownShift:=xlShiftToRightによりシフト方向を指定できます。引数を省略した際のシフト方向はVBAのInsertメソッドと同じです。

import win32com.client as win32
from win32com.client import constants  # 定数をインポート

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# セル範囲を挿入
sheet.Range(sheet.Cells(1, 2), sheet.Cells(4, 4)).Insert()  # 行数<列数なので右方向にシフト
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).Insert()  # 行数=列数なので下方向にシフト
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 5)).Insert()  # 行数>列数なので下方向にシフト

# 明示的なシフト方向を指定
sheet.Range(sheet.Cells(1, 2), sheet.Cells(4, 4)).Insert(Shift=constants.xlShiftDown)  # 下方向にシフト
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 5)).Insert(Shift=constants.xlShiftToRight)  # 右方向にシフト

# 行の挿入 (下方向シフト)
sheet.Rows("2:5").Insert(Shift=constants.xlShiftDown)

# 列の挿入 (右方向シフト)
sheet.Columns("B:E").Insert(Shift=constants.xlShiftToRight)

セルのコピー貼り付け

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientでもCopy()メソッドを使用します。

import win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# セルB1~C3の範囲をコピーし、セルF5に貼り付け
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).Copy(Destination=sheet.Cells(5, 6))

セルの切り取り貼り付け

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientでもCut()メソッドを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# セル B1~D3 の範囲を切り取り、セル F5 に貼り付け
sheet.Range(sheet.Cells(1, 2), sheet.Cells(3, 4)).Cut(Destination=sheet.Cells(5, 6))

ワークシートの操作

ワークシートの追加

Pythonのwin32com.clientライブラリでは、

  • Add()メソッドを使用する。

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

win32com.clientでもAdd()メソッドを使用します。BeforeAfter パラメータで特定のシートの前後にワークシートを追加します。Count パラメータで複数のワークシートを追加します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# ワークシートを追加
wb.Sheets.Add()

# "Sheet1"の前にワークシートを追加
wb.Sheets.Add(Before=sheet)

# "Sheet1"の後にワークシートを追加
wb.Sheets.Add(After=sheet)

# ワークシートを3枚追加
wb.Sheets.Add(Count=3)

# "Sheet1"の後にワークシートを3枚追加
wb.Sheets.Add(After=sheet, Count=3)

ワークシートの名前変更

Pythonのwin32com.clientライブラリでは、

  • Nameプロパティを使用する。

VBAでは、

ワークシートの名前の変更にはNameプロパティを使用します。

Excel VBA 入門講座
Sub RenameWorksheets()

    Dim wb As Workbook
    Set wb = Application.ActiveWorkbook
    
    Dim sheet As Worksheet
    Set sheet = wb.Sheets("Sheet1")
    
    ' アクティブなワークシートの名前を"NewSheetName1"変更
    ActiveSheet.Name = "NewSheetName1"
    
    ' シート"Sheet1"の名前を"NewSheetName2"に変更
    sheet.Name = "NewSheetName2"

End Sub

win32com.clientでもNameプロパティを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook
sheet = wb.Sheets("Sheet1")

# アクティブシートの名前を "NewSheetName1" に変更
excel.ActiveSheet.Name = "NewSheetName1"

# シート "Sheet1" の名前を "NewSheetName2" に変更
sheet.Name = "NewSheetName2"

ワークシートの移動

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientでもMove()メソッドを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook

# シート名で指定
sheet_1 = wb.Sheets("Sheet1")
sheet_2 = wb.Sheets("Sheet2")

# 現在アクティブなシートを "Sheet2" の後ろに移動する
excel.ActiveSheet.Move(After=sheet_2)

# 現在アクティブなシートを "Sheet2" の前に移動する
excel.ActiveSheet.Move(Before=sheet_2)

# "Sheet1" を "Sheet2" の後ろに移動する
sheet_1.Move(After=sheet_2)

# "Sheet1" を "Sheet2" の前に移動する
sheet_1.Move(Before=sheet_2)

ワークシートのコピー

Pythonのwin32com.clientライブラリでは、

  • 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

win32com.clientでもCopy()メソッドを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True 
wb = excel.ActiveWorkbook

# シートを取得
sheet_1 = wb.Sheets("Sheet1")
sheet_2 = wb.Sheets("Sheet2")

# 現在アクティブなシートを"Sheet1"の後ろにコピーする
excel.ActiveSheet.Copy(After=sheet_1)

# 現在アクティブなシートを"Sheet1"の前にコピーする
excel.ActiveSheet.Copy(Before=sheet_1)

# "Sheet1"を"Sheet2"の後ろにコピーする
sheet_1.Copy(After=sheet_2)

# "Sheet1"を"Sheet2"の前にコピーする
sheet_1.Copy(Before=sheet_2)

ワークシートの削除

Pythonのwin32com.clientライブラリでは、

  • Delete()メソッドを使用する。
  • アラートメッセージの回避のためにはexcel.DisplayAlertsプロパティをFalseに設定する。

VBAでは、

ワークシートの削除にはDeleteメソッドを使用します。
削除時のアラートメッセージを回避する為にApplicationオブジェクトのDisplayAlertsプロパティにFalseを設定し削除後Trueを設定します。

Excel VBA 入門講座
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

win32com.clientでもDelete()メソッドを使用します。また、削除時の警告メッセージを無効化するために、excel.DisplayAlertsプロパティを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True

# アクティブなブックを取得
wb = excel.ActiveWorkbook

# "Sheet1" シートを取得
sheet = wb.Sheets("Sheet1")

# 現在アクティブなシートを削除
excel.DisplayAlerts = False
wb.ActiveSheet.Delete()
excel.DisplayAlerts = True

# "Sheet1" を削除
excel.DisplayAlerts = False
sheet.Delete()
excel.DisplayAlerts = True

ワークシートのイベントプロシージャ

Pythonのwin32com.clientライブラリでは、

  • ワークシートのイベントプロシージャはサポートされていない。

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

Pythonのwin32com.clientでは、これらのイベントはサポートされていません。

ワークブックの操作

ワークブックの作成

Pythonのwin32com.clientライブラリでは、

  • Add()メソッドを使用する。

VBAでは、

ワークブックの作成にはAddメソッドを使用します。

Excel VBA 入門講座
'ワークブックを新規に作成する
Sub AddWorkbook()
     Workbooks.Add
End Sub

win32com.clientでもAdd()メソッドを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True

# 新しいワークブックを作成
new_wb = excel.Workbooks.Add()

ワークブックを開く

Pythonのwin32com.clientライブラリでは、

  • Open()メソッドを使用する。

VBAでは、

ワークブックを開くにはOpenメソッドを使用します。

Excel VBA 入門講座
Sub OpenWorkbooks()
    
    '"C:\py\win32com\"に保存されている"example.xlsx"ワークブックを開く
    Workbooks.Open Filename:="C:\py\win32com\example1.xlsx"

    'パスワード保護されたブックを開く
    Workbooks.Open Filename:="C:\py\win32com\example2.xlsx", Password:="password"

    '書き込み保護されたブックを開く
    Workbooks.Open Filename:="C:\py\win32com\example3.xlsx", WriteResPassword:="password"
    
    'ブックを読み取り専用モードで開く
    Workbooks.Open Filename:="C:\py\win32com\example4.xlsx", ReadOnly:=True

End Sub

win32com.clientでもOpen()メソッドを使用します。

import win32com.client as win32

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# "C:\py\win32com\example1.xlsx" ワークブックを開く
excel.Workbooks.Open(Filename=r"C:\py\win32com\example1.xlsx")

# パスワード保護されたブックを開く
excel.Workbooks.Open(Filename=r"C:\py\win32com\example2.xlsx", Password="password")

# 書き込み保護されたブックを開く
excel.Workbooks.Open(Filename=r"C:\py\win32com\example3.xlsx", WriteResPassword="password")

# ブックを読み取り専用モードで開く
excel.Workbooks.Open(Filename=r"C:\py\win32com\example4.xlsx", ReadOnly=True)

組み込みダイアログ ボックスによりブックを開く

Pythonのwin32com.clientライブラリでは、

  • Dialogs()オブジェクトShow()メソッドを使用する。

VBAでは、

組み込みダイアログ ボックスによりブックを開くにはDialogsオブジェクトを使用します。

Excel VBA 入門講座
Sub OpenWorkbook()

    '組み込みダイアログ ボックスによりブックを開く
    Application.Dialogs(xlDialogOpen).Show

End Sub

win32com.clientでもDialogs()オブジェクトのShow()メソッドを使用します。

import win32com.client as win32
from win32com.client import constants

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# 組み込みダイアログ ボックスでブックを開く
excel.Dialogs(constants.xlDialogOpen).Show()

ワークブックを閉じる

Pythonのwin32com.clientライブラリでは、

  • ワークブックを閉じるにはClose()メソッドを使用する
  • 閉じる前に変更を保存したい場合は、SaveAs()メソッドを別途呼び出す必要がある。

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

win32com.clientでもClose()メソッドを使用します。ただし、閉じる前に変更を保存したい場合は、SaveAs()メソッドを別途呼び出す必要があります。

import win32com.client as win32
import os

# Excelアプリケーションを起動
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  # Excelを表示

# アクティブなワークブックを取得
wb = excel.ActiveWorkbook

# アクティブなワークブックを保存して閉じる
wb.Close(SaveChanges=True)

# アクティブなワークブックを保存しないで閉じる
wb.Close(SaveChanges=False)

# アクティブなワークブックを別名で保存して閉じる
wb.SaveAs(Filename=os.path.join(os.getcwd(), "example2.xlsx"))
wb.Close(SaveChanges=False)

ワークブックを閉じると共にExcelを終了する場合

Pythonのwin32com.clientライブラリでは、

  • Quit()メソッドを使用する。

VBAでは、

ワークブックを閉じると共にExcelを終了する場合はApplicationオブジェクトとQuitメソッドを使用します。

Excel VBA 入門講座
Sub QuitExcel()

    Dim wb As Workbook
    Set wb = Application.ActiveWorkbook

    ' Excelを終了する。
    Application.Quit

    ' アクティブなワークブックを保存して閉じる
    wb.Close SaveChanges:=True
   
End Sub

win32com.clientでもQuit()メソッドを使用します。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True 
wb = excel.ActiveWorkbook

# アクティブなワークブックを保存して閉じる
wb.Close(SaveChanges=True)

# Excelを終了する
excel.Quit()

ワークブックを保存する

Pythonのwin32com.clientライブラリでは、

  • SaveAs()メソッドを使用する。

VBAでは、

ワークブックの保存にはSaveAsメソッドを使用します。引数によりファイル名、ファイル形式、パスワードを設定することができます。

Excel VBA 入門講座
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

win32com.clientでもSaveAs()メソッドを使用します。

import win32com.client as win32
from win32com.client import constants
import os

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
wb = excel.ActiveWorkbook

# 現在のディレクトリを取得
current_dir = os.getcwd()

# アクティブなワークブックを名前を付けて保存する
wb.SaveAs(Filename=os.path.join(current_dir, "example6.xlsx"))

# アクティブなワークブックをCSVファイルとして名前を付けて保存する
wb.SaveAs(Filename=os.path.join(current_dir, "example7.csv"), FileFormat=constants.xlCSV)

# アクティブなワークブックを読み取りパスワードを設定して名前をつけて保存する
wb.SaveAs(Filename=os.path.join(current_dir, "example8.xlsx"), Password="password", FileFormat=constants.xlOpenXMLWorkbook)

# アクティブなワークブックを書き込みパスワードを設定して名前をつけて保存する
wb.SaveAs(Filename=os.path.join(current_dir, "example9.xlsx"), WriteResPassword="password", FileFormat=constants.xlOpenXMLWorkbook)

まとめ

本記事では、PythonからWindows11環境のExcelを直接操作する方法について、必要なライブラリや基礎的なコード例を解説しました。

Pythonの「win32com.client」ライブラリを使用することで、Excelファイルのリアルタイム編集やVBAの代替としての活用が可能になり、データの双方向通信やExcelベースのアプリ開発にも対応できます。

これにより、業務効率を高めるExcel操作がプログラミングの力で実現できるようになります。ぜひ試してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
目次