VBA⇒Python書き換え

【VBA⇒Python移行】VBA使いが使用したいエクセル関連ライブラリの紹介と使い分け方

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

こんにちは、hokkyokunです。

今回の記事はVBAを普段使っているユーザーさん向けに書いています。

VBAを使えるようになったら次はPythonに挑戦していただきたいです。

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

理由は上記の記事で詳しく書いていますので、ご参考にしてください。

簡単に説明すると、

今回はPythonを使ってエクセルを操作するために便利なライブラリを紹介していきます(ライブラリが何かは下記をご参照ください)

Pythonを使うためには環境構築という準備が必要になりますが、ここでは環境構築ができていると仮定します。

まだやっていなくて自力で難しい方は以下の本で一番簡単に紹介されているので参考にしてみてください。

ライブラリに関する知識をまとめ、何を使えばどういったことができるのかを紹介したいと思います。

Pythonライブラリとは?

まずライブラリとは何か説明したいと思います。

ライブラリとは、特定の目的を達成するために再利用可能なプログラムコードの集合のことを指します。Pythonのライブラリは、プログラムを効率的に開発するための便利な関数やクラスがパッケージ化されており、必要に応じてインポートして使います。

例えば、数学的、統計的な処理が必要になった場合、一からプログラムを作っていたら大変ですよね。

そういった場合は、「math」というライブラリを使って処理(例えば平方根の計算とか)をすることができます。

# 例: mathライブラリを使って平方根を計算
import math

result = math.sqrt(16)
print(result)  # 出力: 4.0

ライブラリを使うことで、時間短縮エラー・バグの軽減メンテナンスの容易化高度な機能の利用(機械学習をするライブラリもあります。これを自力で作るのはかなり困難)などのメリットがあります。

おすすめのライブラリ比較表

VBAのようにエクセルを自動化させるのに必要なライブラリとして、おすすめなのは以下の三種類です。

ライブラリ特徴得意分野短所
pandas– データフレームを使用して、Excelデータを効率的に処理できるライブラリ。
– 読み書きに対応(Excelファイルの作成も可能)。
– データ分析や大量のデータを扱う場合に最適。
– データのフィルタリング、集計、変換が容易。
– Excelの書式(セルの色、フォント設定など)を維持・変更するのは苦手。
– 見た目のレイアウト調整はサポートされていない。
openpyxl– Excelの読み書きと編集が可能なライブラリ。
– グラフ、セルのスタイル、数式、条件付き書式なども操作可能。
– Excelの細かな操作が必要な場合(セルの色付け、フォント調整など)。
– Excelファイルの加工や保存が得意。
– 一部のエクセル機能が操作できない(autofit、マクロ実行等)
– 実行速度がやや遅いことがある。
xlwings– Excelを直接操作(Microsoft Excelアプリを使用)できるライブラリ。
– VBAの代替として利用可能。
– Excelファイルのリアルタイム編集(ユーザー操作と連携)。
– VBAに似た使い方で、複雑なマクロ処理やカスタム関数を実現。
– Microsoft Excelがインストールされている環境でしか使えない。
– Excelの起動が必要で、大量データを扱うと動作が遅い。

それぞれについてさらに詳しい説明と簡単な実行コードを紹介しますので、雰囲気を感じ取っていただけると幸いです。

Pandas

特徴

Pandasはエクセル操作というよりもデータ処理をするためのライブラリです。

データをデータフレーム(2次元の表形式)で取り扱い、列毎の処理、欠損値の処理、統計的な複雑な計算処理、特定の条件でのグループ化(月毎・担当者ごとの売上集計など)など

データを取り扱うならPandas一択です。

Excelのデータももちろん読み込めますし、書き込みも可能ですが、複雑なエクセル操作はやや苦手としています。

データ処理に特化し、処理したデータを単に書き込むだけならそのままpandasを使い、複雑なエクセル操作が必要になったら、openpyxlかxlwingsを使うという使い分けがよいと思われます。

  • データ処理に特化したライブラリ
  • 複雑な計算を高速で、かつ、簡単なコードで取り扱える
  • Excelの読み込み、書き込みは可能だが、複雑な処理は苦手
  • 個人的にはPandasを使いたいからVBAからPythonへの移行をおすすめしている

使用例

ライブラリのインポート

Pandasに限ったことではありませんが、コードを書く際に、importをすることでライブラリを使うことができるようになります。

最初は面倒に感じますが、すぐになれると思います。

import pandas as pd

上記の意味は「pandasライブラリをインポートし、呼び出すときはpdとする」です。
pandasはpdと略すのが一般的です。

通常であればpandas.read_excel()のように書くことでライブラリのメソッドを使うことができます。

pandasと書くのは面倒ですので、pdと略すことで簡便なコードで処理することができます。
どちらでもいいのですが、一般的には略すことが多いです。

Excelの読み込み

# ファイルパスを設定、sheet_nameでシート名を指定。省略可(省略すれば先頭のシートを読む)
df = pd.read_excel("pandas.xlsx",sheet_name="Sheet1")

エクセルはこんな感じで作っています。

読み込んだデータです。

データ編集(グループ化)

データ集計してみます。
商品ごとの売り上げを集計してみます。

df.groupby("商品")["売上"].sum()

これだけだと簡単なので、少し複雑にしてみます。
商品・担当者ごとに集計してみます。

df.groupby(["商品","担当者"])["売上"].sum()

データの書き込み

編集したデータを書き込んでみます。

同じExcelに「集計」というシートを作って書き込んでみます。
一連の流れを全て記載し、コードを作り直しました。

以下のコードでデータを読み込み、編集したデータを同じExcelの別シートに保存することができました。

import pandas as pd

# ファイルパスを設定、sheet_nameでシート名を指定。省略可(省略すれば先頭のシートを読む)
file_path = "pandas.xlsx"
df = pd.read_excel(file_path,sheet_name="Sheet1")

grouped_df = df.groupby(["商品","担当者"])["売上"].sum()

# 既存のファイルを読み込み
with pd.ExcelWriter(file_path, engine='openpyxl', mode='a') as writer:
    grouped_df.to_excel(writer, sheet_name='集計', index=True)

xlwings

特徴

VBAユーザーにはもしかしたら、最もなじみやすく、理解しやすいライブラリかもしれません。

なぜなら、このライブラリはVBAのように実際にエクセルを画面上で自動操作することができ、確認をしながらコーディングすることが可能だからです。

また、マクロを動かすことも可能です。

ある程度なれるまで、もしくは今まで作っていたマクロを引き続き使いたいならPythonからマクロ操作を行うことで、スムーズにPythonを導入することが可能です。

VBAライクの使い方ができるので、VBAでやっていたことは、ほとんどそのまま使うことができます。

  • VBAのように実際にエクセルを起動させて、画面上で動かす
  • コードをステップインで一行ずつ実行させると、実際のエクセルの挙動を確認しながらコーディングできる
    →VBA操作に非常に近い
  • マクロ実行も可能
  • Excelを実際に動かすので、負担が大きい。大量のデータ処理、複雑で長い処理は実行時間が長くなり、不適

使用例

ライブラリのインポート

import xlwings as xw

Excelの読み込み

# 既存のエクセルファイルを開く
wb = xw.Book("xlwings.xlsx")

シートの選択

# シートの選択
sh = wb.sheets["Sheet1"]

セルに値を入力

以下のようなエクセルを開きました。
A1セルに本年(2024年)を入力してみたいと思います。

せっかくなので、「2024」と打つのではなく、プログラムから本年を取得して実行してみたいと思います。参考までにご覧ください。

# セルに値を入力(本年を自動取得し、入力)
import datetime as dt
thisyear = dt.datetime.today().year
sh.range("A1").value = thisyear

保存と閉じる

wb.save()
wb.close()

応用(pandasで作ったデータをxlwingでエクセル操作して報告書を作成)

少し応用的な処理をやってみます。

上記のPandas操作の例で紹介した、Pandasを使って編集したデータ(商品・担当者ごとの売上集計)をxlwingsを使って報告書にコピーしてみます。

import xlwings as xw

# 報告書ファイルを開く
wb_report = xw.Book("xlwings.xlsx")

# 報告書シートの選択
sh_report = wb_report.sheets["Sheet1"]

# セルに値を入力(本年を自動取得し、入力)
import datetime as dt
thisyear = dt.datetime.today().year
sh_report.range("A1").value = thisyear


# データ編集したファイルを開く
wb_pandas = xw.Book("pandas.xlsx")
sh_pandas = wb_pandas.sheets["集計"]

# データの貼り付け
data = sh_pandas.range("A1:C7").value
sh_report.range("A4").value = data

# 保存と閉じる
wb_report.save()
wb_report.close()

wb_pandas.save()
wb_pandas.close()

セルの結合や罫線を整える必要性、データのコピー範囲がベタ打ちなので可変性がないなどまだまだ改善の余地はありますが、雰囲気はつかめたかなと思います。

openpyxl

特徴

openpyxlの大きな特徴として、実際の画面でエクセルを動かさないことにあります。

openpyxlはエクセルをインストールしていなくても、エクセルファイルを動かすことができ、中身の確認や編集が可能です。

また、実際にエクセルを動かしていないので、xlwingsと比較して、動作が早く、大量のデータを動かすにはopenpyxlの方が優れています。

一方で、openpyxlはプロ向き仕様という側面もあります。

例えば、プロのエンジニアがサーバー上でプログラムを動かしたいとき、xlwingsは実際にエクセルが動かせる環境でないと使えないため、必然的に、openpyxlを使うことになります。

また、普通の事務職が数百万桁のデータを取り扱うなんてまれですので、数千桁程度であれば速度も気にしなくていいと思います(もちろん環境によります)。

使用例

ライブラリのインポート

import openpyxl

エクセルの取得

wb = openpyxl.load_workbook("pandas.xlsx")

シートの選択

ws = wb["Sheet1"]

データの読み取り

for row in ws.iter_rows(values_only=True):
    print(row)

Pythonのfor文は
for ○○ in △
と書きます。

今回で言うと、ws.iter_rowsで値が入力されている行を一つ一つ見ていっています。
values_only = Trueで値だけを表示させています。

応用例

Pandasを用いてデータ処理をし、エクセルへの転記をopenpyxlを使って処理してみます。

処理内容は以下の通りです。

  • データの入ったエクセル(pandas.xlsx)の呼び出し
  • データ編集
    担当者ごとにフィルタリング
  • 予め作っておいたテンプレートを呼び出す
  • 担当者ごとにフィルタリングしたデータをシート毎に入りつけ

テンプレートシートは以下のようにつくりました。

このシートをテンプレートに担当者ごとにシートを新たに作成し、売上表を作るというプログラムです。

A1に今年(2024)を入力、
B3に担当者名
A7以下に売上表を入力します。

想定したよりもちょっと複雑なプログラムになってしまいました。
ちょっと長くなりますが、雰囲気を感じていただければ幸いです。

import openpyxl
import pandas as pd
import datetime as dt

df = pd.read_excel("pandas.xlsx",sheet_name="Sheet1")

# 表にある担当者列の一意のリストを作成
sales_persons = df["担当者"].unique()

# 予めテンプレートを作っておいたエクセルファイルを呼び出す
wb = openpyxl.load_workbook("template.xlsx")

# テンプレートのコピー元のシート
source_sheet = wb["template"]


save_path = "sales_by_persons.xlsx" #作成したデータを保存するファイル名

for sales_person in sales_persons:
    # 担当者ごとの売り上げ表を作成
    df_filtered = df[df["担当者"]==sales_person]

    # シートをコピー
    new_sheet = wb.copy_worksheet(wb["template"])
    
    # シート名を変更
    new_sheet.title = sales_person

    ### 以下は転記
    thisyear = dt.datetime.today().year #今年
    new_sheet.cell(row=1,column=1,value=thisyear) #今年の年を入力

    new_sheet.cell(row=3,column=2,value=sales_person) #担当者入力

    # 売上表を転記
    start_row = 7 #表を転記開始する行
    for col_idx,col_name in enumerate(df_filtered.columns,start=1):
        new_sheet.cell(row=start_row,column=col_idx,value=col_name)
    
    for row_idx,row in enumerate(df_filtered.itertuples(index=False),start=start_row + 1):
        for col_idx,value in enumerate(row,start=1):
            new_sheet.cell(row=row_idx,column=col_idx,value=value)
    
    wb.save(save_path)

作成されたシートは以下のような感じです。

正直な感想としてはopenpyxlは今までVBAをしっかり学んできた人は、あまり使わないでいいかなと思います。

上記で書いたようにエクセルを立ち上げずに読み書きができるのが最大の長所ですが、こういった使い方は応用的な使い方です。

そこまで重い処理でなくて、きちんとエクセルがPCに入っているならxlwingを使う方がVBAを扱っていた人にとっては学習コストが低くてよいかなと思います。

VBA未学習で、これからエクセルの自動処理をしたいというかたはopenpyxlから入っても大丈夫だと思います。

むしろ、xlwingよりもPCへの負担が少ないので、効率的な処理が可能です。

ライブラリの使い分けとお勧め度

【☆5】データ解析はpandas一択

pandasはぜひ使ってみてください。

私もVBAは長らく使ってきましたが、pandasのデータ処理を覚えたら、VBAのデータ処理の煩雑さにイライラすることが多くあります。

こちらの記事で書いていますが、コードの量がめちゃくちゃ少なくなり、エラーや想定外の動きをする機会が激減します。

個人的にVBAではなく、Pythonを使った方がいいと思う理由の一位は「pandasが使えるから」です。

ちなみに余談ですが、

2位はWeb操作(スクレイピング)が可能になる(簡単になる)です。

【☆4】エクセルライクの操作がしたいならxlwings

エクセルをしっかり自動化したい、VBAの基礎があるという方はxlwingsを覚えるのが良いでしょう。

多少VBAとの違いはありますが、考え方は非常に似ていますし、実際にエクセルが動いている様子が確認できるので、VBAを開発している気分でPythonコーディングが可能です。

また、VBAを勉強していない人にとってもxlwingsは学習しやすい題材です。

プログラミングをするときはデバッグをうまく使いながら、思っている通りにコンピュータが動いているかを確認する必要があるのですが、

xlwingsは実際にエクセルが動いているのでそれが確認しやすいです。

VBAが学習しやすいのは実際に自動化している様子が確認できるからなので、初学者こそxlwingsでコンピュータを動かす感覚を身に着けると良いでしょう。

【☆3】openpyxlは玄人向き

openpyxlはややプロ向き志向だと考えられます。

上記でも述べましたが、最大の特徴はエクセルを実際には起動させていないことです。

その分処理速度もxlwingsより早く、また、コンピュータにエクセルが入っていない状況でもプログラムが動かせるという利点があります。

ただ、こういった使い方をするのは、かなりプログラミング経験が長く、様々なシチュエーションを経験した人向けと考えられます。

例えばサーバー上で何らかの記録をエクセルでとる必要がある場合はxlwingsは動かないのでopenpyxlの方が都合が良いです。

処理速度もよほど重く複雑な処理でなければ数分以内で終わるはずなので、そこまで気にしなくてもとは思います。

個人的には好きですけどね、openpyxl。
一秒以内に終わる感覚は気持ちがいい(笑)

本格的にPythonを学ぶには

書籍

まずは書籍を試してみることをお勧めします。

今回紹介したpandasやxlwingに関する解説も載っています。

Pythonの基本的構文をVBAとの違いを参照しながら解説してくれているのでVBAユーザーにとっては、他のPython初心者本よりも吸収が早いかもしれません。

Python1年生

私が良かったなと思う、Python教科書です。

Pythonを始めたときくらいに買った記憶がありますが、絵も多く、非常にわかりやすい良本です。

環境構築のやりかたもしっかり書いてあり、エンジニアの第一歩としてはかなりいいんじゃないかと思います(コーディングだけじゃなく、コンピュータのことも学習すると後々プログラミングの幅が広がります!!)

スッキリわかるPython入門

ちゃんとPythonというプログラミング言語を学びたいなら持っておきたい一冊です。

基本的な構文やライブラリの使い方まで網羅しています。
私もあいまいにしていた知識を体系的に学べました。

アプリケーションの開発も経験できます。

VTuberサプーが教える! Python 初心者のコード/プロのコード

脱初心者を目指す書籍です。

私もやりがちな非エンジニアあるあるのコードを修正してくれます。

ネスト(for文の中にfor文)が深くなったりしていませんか?
私は油断するとすぐそうなってしまいます(笑)

コードがきれいになると後から修正するのも楽になるので、ある程度プログラムが動かせるのであれば、一冊読んでおくことをお勧めします。

動画

動画の良さは以下の通りです。

  • 実際にプロがコーディングする様子が見れる
  • 実際にプロが環境構築する様子が見れる
  • ショートカットキーなどキーボード操作の効率化が確認できる
  • 学習のペースが保たれる
  • 音声による補足がある

一言でいうなら情報量が多いです。

コーディングの行間も見れます。エラーが起きたときどうやって解決するか、音声も当然入るので、大事な部分や難しい部分の補足もできます。

この点に関しては書籍では得られません。

一方で、動画のデメリットもあります。

  • 一般的に動画の方が書籍よりも高い
  • ピンポイントで見返すなら書籍の方が早い
  • 外出先での学習が制限される

書籍は数千円ですが、動画コンテンツの場合、1万円を超える場合もちらほらあります。

また、何度も内容を学習するなら書籍の方が知りたい部分に素早くアクセスできます。

どちらがいいかはケースバイケースですので、ご自身の学習深度や性格に合わせて賢く選ぶべきかと思います。

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル icon

大手動画学習サイトUdemyでのPython学習動画で圧倒的人気を誇る動画です。

レビュー数23644件(2024/12/09時点)
評価4.4
動画時間29時間

圧倒的評価とボリュームを誇ります。

定価であれば2万円越えなので、安くはないですが、
かなりのボリュームですので、スクールに通うよりははるかに安いです。

また、Udemyは頻繁にセールをやっているので、セール時に買っておくのも手ですね!

独学で身につけるPython〜基礎編〜【業務効率化・自動化で残業を無くそう!】

独学で身につけるPython〜基礎編〜【業務効率化・自動化で残業を無くそう!】 icon

Python初心者向けの動画です。

業務効率化を謳っているだけあり、エクセル操作も内容に含まれています。

Python動画は結構上級者向きのものが多い中、初学者向け、非エンジニア向けかつ、とても評価の高い動画です。

まずはこの辺りの書籍や動画から学習をスタートしてみてはいかがでしょうか。

最後までお読みくださりありがとうございました。