Pythonを使うとエクセル関数を作成することができます。
ここではPython×Excelの入門事例として、if関数を作っていきます。
・条件に合う場合、文字列を赤くする
それでは以下で詳しく紹介していきます。
目次
PythonでエクセルIf関数を作ってみる
今回は以下の作業をpythonで行います。
セルB2~セルB21の値のなかで、条件に合致したらセルC2~セルC21に出力
上記のように条件に応じて、「該当」と「非該当」が出力されるようにします。
これはExcel関数でいえば、「=if(B2=”愛知販売”, “該当”, “非該当”)」などとすれば、条件分岐を出力することができます。
しかしopenpyxlというpythonライブラリを使ったら、どのようにプログラムを作ればいいのでしょうか。
本記事では、そのプログラム作成について詳しく紹介していきます。
Pythonプログラムの実行前準備|Excelファイル保管とライブラリインストール
1. Excelファイルを準備
2. 必要なライブラリをインストール
準備1|Excelファイルをフォルダに保存(「.py」と同じフォルダ)
対象となるExcelファイルをフォルダに保存します。
Pythonファイル「.py」と同じフォルダにExcelを保存すること
本事例では「Sample.xlsx」というファイル名にしています。
後半で紹介するプログラムをそのまま使用する場合は、「.py」と「.xlsx」が同じフォルダでないとエラーが発生します。
準備2|必要なライブラリをインストール
今回は以下の2つのライブラリをインストールします。
pip install openpyxl
Excelを操作するために使用するライブラリです。
上記をインストールしておかないと動かないので、注意が必要です。
Pythonプログラム解説
この記事で紹介するプログラムを解説しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# プログラム1|ライブラリ設定 import openpyxl as px from openpyxl.styles import Font # プログラム2|文字色の設定 font = Font(name='Calibri', size=11, bold=False, italic=False, vertAlign=None, underline='none', strike=False,color='FF0000') # プログラム3|対象のエクセルシートを読み込む filepath = 'Sample.xlsx' wb = px.load_workbook(filename=filepath) ws2 = wb['Sheet2'] # プログラム4|最終行の取得 cmax2 = ws2.max_row # プログラム5|検索ワードの設定 keyword = '愛知販売' # プログラム6|条件分岐 for i in range(2, cmax2+1): print(i, ws2['B' + str(i)].value) if keyword == ws2['B' + str(i)].value: ws2['C' + str(i)].value = '該当' ws2['C' + str(i)].font = font else: ws2['C' + str(i)].value = '非該当' # プログラム7|ファイル保存 wb.save('Sample2.xlsx') |
以下で詳しく説明しています。
プログラム1|ライブラリ設定
1 2 3 |
# プログラム1|ライブラリ設定 import openpyxl as px from openpyxl.styles import Font |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
import openpyxl as px |
openpyxlはExcel操作で使います。
「openpyxl as px」とすることで、openpyxlをpxという変数で扱うようにしています。
3 |
from openpyxl.styles import Font |
openpyxlの一部であるFontを呼び出します。
Fontはエクセルの文字を赤くするときに使用します。
なお文字を赤くするだけでなく、文字の大きさ、太字、イタリック、下線のような文字列の装飾変更を行うことができます。
プログラム2|文字色の設定
1 2 |
# プログラム2|文字色の設定 font = Font(name='Calibri', size=11, bold=False, italic=False, underline='none', strike=False,color='00FF0000') |
これで文字の色を変更することができます。
ちなみに上記のプログラムについてカンタンに解説を入れておきます。
1 2 3 4 5 6 7 |
font = Font(name='Calibri', #フォント名(フォント名を指定) size=11, #フォントサイズ(数値で指定) bold=False, #太字(True or False) italic=False, #イタリック体(True or False) underline='none', #下線(True or False) strike=False,#取り消し線(True or False) color='00F0000')#文字色(8桁などで色を指定) |
文字の色を赤く変更したいだけであれば、以下のプログラムだけでも十分です。
1 |
font = Font(color='00FF0000') |
なお、openpyxlのフォントカラー(色設定)はこちらのとおりです。
プログラム3|対象のエクセルシートを読み込む
1 2 3 4 |
# プログラム3|対象のエクセルシートを読み込む filepath = 'Sample.xlsx' wb = px.load_workbook(filename=filepath) ws2 = wb['Sheet2'] |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
filepath = 'Sample.xlsx' |
「.py」ファイルと同じフォルダ内の「Sample.xlsx」を変数filepathとします。
3 |
wb = px.load_workbook(filename=filepath) |
filepath(‘Sample.xlsx’)で指定したExcelファイルを読み込みます。
所定フォルダに「Sample.xlsx」が存在しない場合、エラーとなりますので注意が必要です。
4 |
ws2 = wb['Sheet2'] |
読み込んだExcelファイルの「Sheet2」をws2として扱います。
なお読み込んだExcelに「Sheet2」が存在しない場合、エラーとなりますので注意が必要です。
シート名にも気を付けましょう。
プログラム4|最終行の取得
1 2 |
# プログラム4|最終行の取得 cmax2 = ws2.max_row |
「シート.max_row」で最終行を取得することができます。
この事例では、ws2(Sheet2)の最終行は21です。
1 2 |
cmax2 = ws2.max_row print(cmax2) |
実行結果
1 |
>>>21 |
ここで取得した最終行までC列の数値を計算していきます。
プログラム5|検索ワードの設定
1 2 |
# プログラム5|検索ワードの設定 keyword = '愛知販売' |
検索ワードを設定します。
ここではkeywordという変数を「愛知販売」とします。
このkeywordを使って、If文の条件分岐を作成していきます。
プログラム6|条件分岐
1 2 3 4 5 6 7 |
# プログラム6|条件分岐 for i in range(2, cmax2+1): if keyword == ws2['B' + str(i)].value: ws2['C' + str(i)].value = '該当' ws2['C' + str(i)].font = font else: ws2['C' + str(i)].value = '非該当' |
プログラム解説
以下で一行ずつプログラムを解説します
2 |
for i in range(2, cmax2+1): |
「for i in range(2, cmax2+1)」で「i= 2, 3,・・・,cmax2」まで繰り返し処理を行います。
なお「for i in range(cmax2+1)」とすると「i = 0,1,2,・・・,cmax2」と繰り返しを処理を実行させることができます。
3 |
if keyword == ws2['B' + str(i)].value: |
if文で条件に合致するかどうかを調べます。
「愛知販売」という文字列であるkeyword(プログラム5)と、ws2[‘B’ + str(i)].valueを比較します。
「ws2[‘B’ + str(i)].value」は、セルBi(i=2,3,…,cmax1)の値が入っていきます。
1 2 |
for i in range(2, cmax1+1): print(i, ws2['B' + str(i)].value) |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
>>>2 愛知販売 >>>3 愛知販売 >>>4 岐阜商会 >>>5 岐阜商船 >>>6 岐阜商船 >>>7 愛媛不動産 >>>8 横浜航空 >>>9 岡山百貨店 >>>10 宮崎商船 >>>11 愛媛不動産 >>>12 横浜航空 >>>13 岡山研究所 >>>14 岡山研究所 >>>15 沖縄紡績 >>>16 宮崎商船 >>>17 宇部工業 >>>18 岐阜商船 >>>19 横浜航空 >>>20 沖縄紡績 >>>21 愛知販売 |
なお、「ws2[‘B’ + str(i)].value」のように、str(i)にしておかないとエラーとなります。
「ws1[‘C’ + i].value」ではiがint型のため、正しく処理されないからです。ここは注意が必要です。
1 |
if keyword == ws2['B' + str(i)].value: |
このif文がTrueならば(セルBiが「愛知販売」ならば)
1 2 |
ws2['C' + str(i)].value = '該当' ws2['C' + str(i)].font = font |
このif文がTrueではないならば(セルBiが「愛知販売」ではないならば)
1 |
ws2['C' + str(i)].value = '非該当' |
のようにそれぞれ分岐していきます。
以降で条件分岐後のプログラムを説明します。
4 |
ws2['C' + str(i)].value = '該当' |
Sheet2のセルCiに「該当」と出力する
5 |
ws2['C' + str(i)].font = font |
Sheet2のセルCiのフォントをfont(プログラム2)にする
プログラム2で文字を赤くする設定をしておきましたので、これで赤い文字にすることができます。
6 |
else: |
elseは「そうではないならば」を意味します。
「if keyword == ws2[‘B’ + str(i)].value:」がTrueではないときを指します。
本事例でいえば、「セルBiの値が愛知販売ではないならば」です。
愛知販売ではないとき、以下のようにプログラムが進みます。
7 |
ws2['C' + str(i)].value = '非該当' |
Sheet2のセルCiに「非該当」と出力する。
プログラム6を実行すると、以下のようにC列に結果が出力されます。
B列が愛知販売となっている「2行目、3行目、21行目」において、C列が赤字で該当となっていることが分かります。
また、それ以外は非該当と出力されています。
プログラム7|ファイル保存
1 2 |
# プログラム7|ファイル保存 wb.save('Sample2.xlsx') |
「Sample.xlsx」を「Sample2.xlsx」としてエクセルを保存します。
エクセルファイルの保存先は「.py」ファイルと同じフォルダに保存されます。
Pythonプログラム解説(関数式をそのまま入力する方法)
Pythonのopenpyxlを使ったif関数の表現方法は別にもあります。
ここでは「=if()」を直接入力する方法も紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# プログラム1|ライブラリ設定 import openpyxl as px from openpyxl.styles import Font # プログラム2|文字色の設定 font = Font(name='Calibri', size=11, bold=False, italic=False, vertAlign=None, underline='none', strike=False,color='FF0000') # プログラム3|対象のエクセルシートを開く filepath = 'Sample.xlsx' wb = px.load_workbook(filename=filepath) ws2 = wb['Sheet2'] # プログラム4|最終行の取得 cmax2 = ws2.max_row # プログラム5|検索ワード keyword = '愛知販売' # プログラム6|関数式をセルに入力 for i in range(2, cmax2+1): if_kansu = '=if(B' + str(i) + '="' + keyword +'", "該当", "非該当")' ws2['C' + str(i)].value = if_kansu # プログラム7|ファイル保存 wb.save('Sample2.xlsx') |
プログラム1、プログラム2、プログラム3、プログラム4、プログラム5、プログラム7は上記で説明済みなので、省略します。
プログラム6についてのみ詳細を紹介していきます。
なおプログラム2で設定したフォントは反映させません。
プログラム4|関数式をセルに出力
1 2 3 4 |
# プログラム6|関数式をセルに入力 for i in range(2, cmax2+1): if_kansu = '=if(B' + str(i) + '="' + keyword +'", "該当", "非該当")' ws2['C' + str(i)].value = if_kansu |
プログラム解説
以下で一行ずつプログラムを解説します
2 |
for i in range(2, cmax2+1): |
「sum_kansu」という変数に「’=sum(C2:C’ + str(cmax1) + ‘)’」を入れ込みます。
要はセルに関数をそのまま入力するのです。
以下でプログラムを実行してみます。
1 2 3 |
for i in range(2, cmax2+1): if_kansu = '=if(B' + str(i) + '="' + keyword +'", "該当", "非該当")' print(if_kansu) |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
>>>=if(B2="愛知販売", "該当", "非該当") >>>=if(B3="愛知販売", "該当", "非該当") >>>=if(B4="愛知販売", "該当", "非該当") >>>=if(B5="愛知販売", "該当", "非該当") >>>=if(B6="愛知販売", "該当", "非該当") >>>=if(B7="愛知販売", "該当", "非該当") >>>=if(B8="愛知販売", "該当", "非該当") >>>=if(B9="愛知販売", "該当", "非該当") >>>=if(B10="愛知販売", "該当", "非該当") >>>=if(B11="愛知販売", "該当", "非該当") >>>=if(B12="愛知販売", "該当", "非該当") >>>=if(B13="愛知販売", "該当", "非該当") >>>=if(B14="愛知販売", "該当", "非該当") >>>=if(B15="愛知販売", "該当", "非該当") >>>=if(B16="愛知販売", "該当", "非該当") >>>=if(B17="愛知販売", "該当", "非該当") >>>=if(B18="愛知販売", "該当", "非該当") >>>=if(B19="愛知販売", "該当", "非該当") >>>=if(B20="愛知販売", "該当", "非該当") >>>=if(B21="愛知販売", "該当", "非該当") |
以下で、この値をC2~C21まで入力していきます。
3 |
if_kansu = '=if(B' + str(i) + '="' + keyword +'", "該当", "非該当")' |
このように関数をそのままExcelのセルに入れ込む方法もあります。
C2、C3、C21が赤文字になっていません。もし赤くしたい場合は、条件付き書式のプログラムを設定する必要があります。
しかし条件付き書式のプログラムを使うと、プログラムが長くなりますし、少しややこしいので、ここでは説明しません。
関数式を入力するのはオススメしない理由
関数式を入力すれば、上記のようにif関数をエクセルに入力することは可能です。
しかしながら関数式をそのまま入力する方法はオススメしません。
なぜなら関数式をそのまま入力するなら、pythonでやる必要がないからです。
pythonを使うメリットは、他のライブラリと組み合わせて、関数では出来ないようなことを実現することにあります。
たとえばウェブスクレイピングをして、Excelに出力していくといった効率化をすることがpythonを使う魅力です。
しかし関数式を入力することで対応していたら、pythonを使うための基礎的な理解が進みません。
pythonを使うなら、関数式にはとどまらず少し難しいことに挑戦していただければ嬉しいです。
実際に、以下でPythonの自動化プログラムを紹介しています。
どれも魅力的なプログラムなので、ぜひご覧いただきたいです。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Python×効率化のサンプル
Pythonで効率化できる事例をサンプルコード付きで紹介しています。
Python×Excel
PythonとExcelで自動化できることを紹介しています。
事例も数多く紹介しているので、ぜひ参考にしてみてください。
Pythonって難しい?
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。