【VBAリファレンス】PythonとopenpyxlでExcel作業を自動化!初心者でもわかる操作入門

スポンサーリンク

はじめに:Excel作業の自動化で生産性を劇的に向上させよう

日々の業務でExcelを使っている皆さん、こんなお悩みはありませんか?
「毎日同じような集計作業に時間がかかっている…」
「複数のExcelファイルを一つにまとめるのが面倒…」
「大量のデータをExcelに転記するのに疲れた…」

もし一つでも当てはまるなら、Pythonと「openpyxl」ライブラリがあなたの強力な味方になります。Pythonは近年、ビジネスシーンでも活用が広がっているプログラミング言語であり、openpyxlはそのPythonを使ってExcelファイルを読み書きするための非常に便利なライブラリです。

この記事では、Excel操作の経験はあるけれどプログラミングは初めて、という方でも理解できるように、openpyxlの基本的な使い方から、実践的なExcel操作の自動化までを丁寧に解説します。難しい専門用語は避け、具体的なコード例を豊富に交えながら、PythonでExcelを自在に操るための第一歩をサポートします。

この記事を読めば、

* openpyxlのインストール方法
* Excelファイルの新規作成、読み込み、保存
* セルの値の読み書き、書式設定
* シートの操作(追加、削除、コピー)
* 簡単なデータ集計やレポート作成の自動化

といったことが、誰でもできるようになります。
Excel作業の自動化は、単に手間を省くだけでなく、ヒューマンエラーの削減、データ分析の高速化、そして何より「もっと創造的な仕事に時間を割けるようになる」という大きなメリットをもたらします。

さあ、Pythonとopenpyxlの世界へ飛び込み、あなたのExcel作業を次のレベルへと引き上げましょう!

openpyxlの基本:インストールからファイル操作まで

Pythonでopenpyxlを使うためには、まずライブラリをインストールする必要があります。

1. openpyxlのインストール

Pythonがインストールされていれば、コマンドプロンプト(Windows)やターミナル(macOS/Linux)を開き、以下のコマンドを実行するだけで簡単にインストールできます。

pip install openpyxl

これで、Pythonスクリプトからopenpyxlを使えるようになります。

2. Excelファイルの新規作成と保存

まずは、新しいExcelファイルを作成し、保存する基本的な方法を見てみましょう。

import openpyxl

# 新しいワークブック(Excelファイル)を作成
wb = openpyxl.Workbook()

# アクティブなシートを取得
# デフォルトで「Sheet」という名前のシートが1つ作成されています
ws = wb.active

# シート名を変更
ws.title = “データ集計結果”

# セルに値を書き込む
ws[‘A1’] = “商品名”
ws[‘B1’] = “価格”

# 別の方法でセルに値を書き込む(行番号、列番号を指定)
# 1行目、2列目(B列)に「数量」と書き込む
ws.cell(row=1, column=2).value = “数量”

# ファイルを保存
# ファイル名.xlsx の形式で保存します
wb.save(“sample_report.xlsx”)

print(“sample_report.xlsx が作成されました。”)

このコードを実行すると、「sample_report.xlsx」という名前のExcelファイルが、Pythonスクリプトと同じディレクトリに作成されます。ファイルを開くと、「データ集計結果」という名前のシートがあり、A1セルに「商品名」、B1セルに「価格」、そして同じくB1セルに「数量」と書き込まれているはずです(※実際には、後から書き込んだ「数量」が「価格」を上書きします。この例では、B1セルに「数量」が書き込まれます。)。

3. 既存のExcelファイルの読み込み

次に、既に存在するExcelファイルを読み込む方法です。

import openpyxl

# 既存のExcelファイルを読み込む
try:
wb = openpyxl.load_workbook(“sample_report.xlsx”) # 上で作成したファイルを読み込む
print(“sample_report.xlsx を読み込みました。”)

# 読み込んだワークブックのシート名一覧を表示
print(“シート名:”, wb.sheetnames)

# 特定のシートを指定して取得
# シート名で取得
ws = wb[“データ集計結果”]
print(f”‘{ws.title}’ シートを取得しました。”)

# アクティブなシートを取得(最後にアクティブだったシート)
# ws_active = wb.active
# print(f”アクティブなシート: ‘{ws_active.title}'”)

# セルの値を取得
cell_a1 = ws[‘A1’].value
cell_b1 = ws[‘B1’].value # 上書きされているので「数量」が入っているはず
print(f”A1セルの値: {cell_a1}”)
print(f”B1セルの値: {cell_b1}”)

# 行番号と列番号で値を取得
cell_value = ws.cell(row=1, column=1).value # A1セルと同じ
print(f”1行1列目の値: {cell_value}”)

except FileNotFoundError:
print(“エラー: sample_report.xlsx が見つかりません。先にファイルを作成してください。”)
except KeyError:
print(“エラー: 指定されたシート名が見つかりません。”)

`openpyxl.load_workbook()` 関数でファイルを指定することで、既存のExcelファイルを読み込むことができます。`wb.sheetnames` でシート名のリストを取得したり、`wb[“シート名”]` で特定のシートオブジェクトを取得したりできます。セルの値は、`ws[‘セル番地’].value` や `ws.cell(row=行番号, column=列番号).value` で取得できます。

シート操作:より高度なExcel編集をPythonで

Excelファイルは、複数のシートから構成されています。openpyxlを使えば、これらのシートに対しても様々な操作が可能です。

1. 新しいシートの追加

新しいシートを追加するには `wb.create_sheet()` メソッドを使います。

import openpyxl

wb = openpyxl.load_workbook(“sample_report.xlsx”)
ws_data = wb[“データ集計結果”] # 既存のシート

# 新しいシートを作成(シート名指定)
new_sheet = wb.create_sheet(“詳細データ”)

# 新しいシートを指定した位置に追加(0から始まるインデックス)
# 既存の「データ集計結果」シートの前に挿入
ws_before = wb.create_sheet(“概要”, 0)

# データ集計結果シートにデータを書き込む例
ws_data[‘A2’] = “りんご”
ws_data[‘B2’] = 100
ws_data[‘C2’] = 50 # 数量

ws_data[‘A3’] = “バナナ”
ws_data[‘B3’] = 120
ws_data[‘C3’] = 30

wb.save(“sample_report_with_new_sheets.xlsx”)
print(“新しいシートが追加されたファイル ‘sample_report_with_new_sheets.xlsx’ を保存しました。”)

`create_sheet()` メソッドの第一引数にシート名、第二引数に挿入したい位置のインデックスを指定します。インデックスを指定しない場合は、末尾に追加されます。

2. シート名の変更と削除

シート名は、取得したシートオブジェクトの `title` 属性を変更することで変更できます。シートの削除は `wb.remove()` メソッドを使います。

import openpyxl

wb = openpyxl.load_workbook(“sample_report_with_new_sheets.xlsx”)

# シート名を変更
ws_detail = wb[“詳細データ”]
ws_detail.title = “商品詳細”

# シートを削除 (削除したいシートオブジェクトを渡す)
# 「概要」シートを削除してみます
ws_to_remove = wb[“概要”]
wb.remove(ws_to_remove)

wb.save(“sample_report_modified_sheets.xlsx”)
print(“シート名の変更と削除を行ったファイル ‘sample_report_modified_sheets.xlsx’ を保存しました。”)

3. シートのコピー

既存のシートをコピーして新しいシートを作成することも可能です。`wb.copy_worksheet()` メソッドを使用します。

import openpyxl

wb = openpyxl.load_workbook(“sample_report_modified_sheets.xlsx”)

# 「データ集計結果」シートをコピーし、「集計結果コピー」という名前で追加
# コピー元のシートオブジェクトを指定
ws_original = wb[“データ集計結果”]
new_ws = wb.copy_worksheet(ws_original)
new_ws.title = “集計結果コピー”

wb.save(“sample_report_copied_sheet.xlsx”)
print(“シートをコピーしたファイル ‘sample_report_copied_sheet.xlsx’ を保存しました。”)

これにより、元のシートの内容を保持したまま、新しいシートとして複製できます。

セルの操作:値の書き込みと書式設定

Excelの最も基本的な操作は、セルの値の読み書きと、見た目を整える書式設定です。

1. 値の書き込み(繰り返し処理)

forループなどを使って、複数のセルに一括で値を書き込むことができます。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.title = “売上データ”

# ヘッダー行
ws[‘A1’] = “月”
ws[‘B1’] = “売上”

# データを書き込む
sales_data = [
(“1月”, 150000),
(“2月”, 180000),
(“3月”, 200000),
(“4月”, 170000),
(“5月”, 190000),
]

# 2行目から順に書き込む
for row_index, (month, sales) in enumerate(sales_data, start=2):
ws.cell(row=row_index, column=1, value=month) # A列に月
ws.cell(row=row_index, column=2, value=sales) # B列に売上

wb.save(“sales_data.xlsx”)
print(“売上データを書き込んだファイル ‘sales_data.xlsx’ を保存しました。”)

`enumerate` を使うと、リストの要素と同時にインデックス(行番号)も取得できるため、効率的にデータを書き込めます。

2. セルの値の取得(範囲指定)

特定の範囲のセルからデータを取得する際にも、ループ処理が役立ちます。

import openpyxl

# 既存のExcelファイルを読み込む
try:
wb = openpyxl.load_workbook(“sales_data.xlsx”)
ws = wb[“売上データ”]

print(“— 売上データ —“)
# A列とB列のデータを取得(2行目から最後まで)
# max_row でシートの最大行数を取得
for row_num in range(2, ws.max_row + 1):
month = ws.cell(row=row_num, column=1).value
sales = ws.cell(row=row_num, column=2).value
print(f”{month}: {sales}円”)

print(“\n— 全セルデータ —“)
# シート内の全セルをループで取得
for row in ws.iter_rows():
row_values = [cell.value for cell in row]
print(row_values)

except FileNotFoundError:
print(“エラー: sales_data.xlsx が見つかりません。”)
except KeyError:
print(“エラー: ‘売上データ’ シートが見つかりません。”)

`ws.iter_rows()` を使うと、シート内の行を順番に取得できます。各行はセルのタプルとして返されるため、リスト内包表記などで簡単に値を取り出せます。

3. 書式設定

セルのフォント、色、罫線、数値形式などを変更することで、見やすいレポートを作成できます。

import openpyxl
from openpyxl.styles import Font, PatternFill, Border, Side
from openpyxl.alignment import Alignment
from openpyxl.utils import get_column_letter

# ワークブックとシートを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = “書式設定サンプル”

# ヘッダー行にデータを書き込み
ws[‘A1’] = “商品名”
ws[‘B1’] = “単価”
ws[‘C1’] = “数量”
ws[‘D1’] = “合計金額”

# データ行
ws[‘A2’] = “ノートPC”
ws[‘B2’] = 120000
ws[‘C2’] = 2
ws[‘D2’] = “=B2*C2” # 数式も入力可能

ws[‘A3’] = “マウス”
ws[‘B3’] = 3000
ws[‘C3’] = 5
ws[‘D3′] = “=B3*C3”

# — 書式設定 —

# フォント設定
bold_font = Font(name=’Arial’, size=12, bold=True, color=’FF0000′) # 赤字太字
ws[‘A1’].font = bold_font
ws[‘B1’].font = bold_font
ws[‘C1’].font = bold_font
ws[‘D1′].font = bold_font

# 背景色設定
header_fill = PatternFill(start_color=’FFFF00′, end_color=’FFFF00′, fill_type=’solid’) # 黄色
for cell in ws[“1:1”]: # 1行目全体
cell.fill = header_fill

# 数値形式設定 (通貨)
currency_format = ‘”¥”#,##0’ # 例: ¥120,000
ws[‘B2’].number_format = currency_format
ws[‘B3’].number_format = currency_format
ws[‘D2’].number_format = currency_format
ws[‘D3’].number_format = currency_format

# 列幅の自動調整
for col in ws.columns:
max_length = 0
column = col[0].column_letter # 現在の列の文字 (例: ‘A’)
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2)
ws.column_dimensions[column].width = adjusted_width

# 中央揃え
center_alignment = Alignment(horizontal=’center’, vertical=’center’)
ws[‘C1’].alignment = center_alignment # C1セルを中央揃え
ws[‘C2’].alignment = center_alignment
ws[‘C3′].alignment = center_alignment

# 罫線設定
thin_border = Border(left=Side(style=’thin’),
right=Side(style=’thin’),
top=Side(style=’thin’),
bottom=Side(style=’thin’))

for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=4):
for cell in row:
cell.border = thin_border

wb.save(“formatted_sales_data.xlsx”)
print(“書式設定を適用したファイル ‘formatted_sales_data.xlsx’ を保存しました。”)

`openpyxl.styles` モジュールには、`Font`(フォント)、`PatternFill`(背景色)、`Border`(罫線)など、様々なスタイルを定義するためのクラスが用意されています。また、`Alignment` クラスで配置(左揃え、中央揃え、右揃えなど)を、`number_format` 属性で数値の表示形式を設定できます。`get_column_letter` は列番号をExcelのような文字(A, B, C…)に変換するのに便利です。

実践的な自動化:データ集計レポートの作成

ここまでの知識を組み合わせると、簡単なデータ集計レポートの自動作成が可能になります。例えば、複数の商品IDと売上データから、商品ごとの合計売上を計算し、新しいシートにレポートとして出力するようなケースです。

import openpyxl
from collections import defaultdict # 辞書にキーが存在しない場合にデフォルト値を設定してくれる

# — サンプルデータの準備 —
# 実際には、このデータは別のExcelファイルから読み込むことが多いでしょう
raw_data = [
{“商品ID”: “A001”, “商品名”: “りんご”, “売上”: 1000},
{“商品ID”: “B002”, “商品名”: “バナナ”, “売上”: 500},
{“商品ID”: “A001”, “商品名”: “りんご”, “売上”: 1500},
{“商品ID”: “C003”, “商品名”: “みかん”, “売上”: 800},
{“商品ID”: “B002”, “商品名”: “バナナ”, “売上”: 700},
{“商品ID”: “A001”, “商品名”: “りんご”, “売上”: 1200},
]

# — 集計処理 —
# 商品IDをキーとして、商品名と合計売上を格納する辞書
product_sales = defaultdict(lambda: {“商品名”: “”, “合計売上”: 0})

for item in raw_data:
product_id = item[“商品ID”]
product_sales[product_id][“商品名”] = item[“商品名”] # 商品名は更新されても同じはず
product_sales[product_id][“合計売上”] += item[“売上”]

# 集計結果をリスト形式に変換(レポート作成用)
report_data = []
for product_id, data in product_sales.items():
report_data.append({
“商品ID”: product_id,
“商品名”: data[“商品名”],
“合計売上”: data[“合計売上”]
})

# 商品IDでソート(任意)
report_data.sort(key=lambda x: x[“商品ID”])

# — Excelレポート作成 —
wb = openpyxl.Workbook()
ws = wb.active
ws.title = “商品別売上レポート”

# ヘッダー行
ws[‘A1’] = “商品ID”
ws[‘B1’] = “商品名”
ws[‘C1′] = “合計売上”

# ヘッダーの書式設定 (太字、背景色)
header_font = Font(bold=True)
header_fill = PatternFill(start_color=’D3D3D3′, end_color=’D3D3D3′, fill_type=’solid’) # ライトグレー
for cell in ws[“1:1”]:
cell.font = header_font
cell.fill = header_fill

# 集計データを書き込む
for row_index, data in enumerate(report_data, start=2):
ws.cell(row=row_index, column=1, value=data[“商品ID”])
ws.cell(row=row_index, column=2, value=data[“商品名”])
ws.cell(row=row_index, column=3, value=data[“合計売上”])

# 通貨形式の設定
currency_format = ‘”¥”#,##0’
for row_index in range(2, ws.max_row + 1):
ws.cell(row=row_index, column=3).number_format = currency_format

# 列幅の自動調整
for col in ws.columns:
max_length = 0
column_letter = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2)
ws.column_dimensions[column_letter].width = adjusted_width

# ファイルを保存
output_filename = “product_sales_report.xlsx”
wb.save(output_filename)

print(f”商品別売上レポート ‘{output_filename}’ を作成しました。”)

この例では、Pythonの `defaultdict` を使って効率的に集計を行い、その結果を整形してExcelファイルに出力しています。このように、Pythonでデータを処理し、その結果をExcelで可視化するという一連の流れを自動化できます。

実務アドバイス:より効率的に進めるためのヒント

openpyxlを使ったExcel操作を実務で活用するための、いくつかのヒントを紹介します。

1. エラーハンドリングをしっかりと行う

ファイルが見つからない、シート名が間違っている、セルの値が期待した型ではないなど、予期せぬエラーはつきものです。`try-except` ブロックを適切に使用し、エラー発生時にもプログラムが停止しないように、またはエラー内容を分かりやすく表示するようにしましょう。

2. 処理の可読性を意識する

コードが長くなると、自分でも読みにくくなることがあります。変数名や関数名を分かりやすくしたり、コメントを適切に記述したりすることで、後からコードを修正する際や、他の人と共有する際に役立ちます。

3. 処理速度が遅い場合は工夫する

大量のデータを扱う場合、単純なループ処理では時間がかかることがあります。openpyxlには、 `ws.iter_rows()` や `ws.iter_cols()` のように、イテレータを

タイトルとURLをコピーしました