Pythonを使うとエクセルのなかで特定の文字列を含んだセルをカウントできます。
ここではPython×Excelの入門事例として、とある文字列が存在するかどうかチェックして、その件数を算出するプログラムを作っていきます。
・Pythonで特定の文字列を含むセル数をカウント
それでは以下で詳しく紹介していきます。
目次
Pythonで特定の文字列を含むセルをカウントする
今回は以下の作業をpythonで行います。
1. B2~B26の内、F1の文言を含むセルを確認
2. C2~C26にチェックを入れる
3. F2に件数を出力
上記のプログラムを作っていきます。
Pythonプログラムの実行前準備|Excelファイル保管とライブラリインストール
1. Excelファイルを準備
2. 必要なライブラリをインストール
準備1|Excelファイルをフォルダに保存(「.py」と同じフォルダ)
対象となるExcelファイルをフォルダに保存します。
Pythonファイル「.py」と同じフォルダにExcelを保存すること
本事例では「Sample.xlsx」というファイル名にしています。
後半で紹介するプログラムをそのまま使用する場合は、「.py」と「.xlsx」が同じフォルダでないとエラーが発生します。
準備2|必要なライブラリをインストール
今回は以下の2つのライブラリをインストールします。
pip install openpyxl
Excelを操作するために使用するライブラリです。
上記をインストールしておかないと動かないので、注意が必要です。
Pythonプログラム解説
この記事で紹介するプログラムを解説しています。
1 |
# プログラム1|ライブラリ設定 |
以下で詳しく説明しています。
プログラム1|ライブラリ設定
1 2 |
# プログラム1|ライブラリ設定 import openpyxl as px |
openpyxlはExcel操作で使います。
「openpyxl as px」とすることで、openpyxlをpxという変数で扱うようにしています。
プログラム2|対象のエクセルシートを読み込む
1 2 3 4 |
# プログラム2|対象のエクセルシートを読み込む filepath = 'Sample.xlsx' wb = px.load_workbook(filename=filepath) ws7 = wb['Sheet7'] |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
filepath = 'Sample.xlsx' |
「.py」ファイルと同じフォルダ内の「Sample.xlsx」を変数filepathとします。
3 |
wb = px.load_workbook(filename=filepath) |
filepath(‘Sample.xlsx’)で指定したExcelファイルを「wb」として読み込みます。
所定フォルダに「Sample.xlsx」が存在しない場合、エラーとなりますので注意が必要です。
4 |
ws7 = wb['Sheet7'] |
読み込んだExcelファイルの「Sheet7」をws7して扱います。
なお読み込んだExcelに名前が「Sheet7」のシートが存在しない場合、エラーとなりますので注意が必要です。
シート名にも気を付けましょう。
プログラム3|特定の文字列
1 2 |
# プログラム3|特定の文字列 moji = ws7['F1'].value |
この事例では、mojiは「愛」です。Sheet7のセルF1の値を取得しているからです。
1 2 |
moji = ws7['F1'].value print(moji) |
実行結果
1 |
>>>愛 |
ここで取得した「moji」を含むセルの数を調べていきます。
なお読み込んだExcelに名前が「Sheet7」のシートが存在しない場合、エラーとなりますので注意が必要です。
シート名にも気を付けましょう。
プログラム4|変数kensuを設定
1 2 |
# プログラム4|変数kensuを設定 kensu = 0 |
変数kensuを0として設定します。
kensuはセルのカウンター(件数を調べる用)として使用します。
プログラム5|最終行の取得
1 2 |
# プログラム5|最終行の取得 lastrow = ws7.max_row |
「シート.max_row」で最終行を取得することができます。
この事例では、ws7(Sheet7)の最終行は26です。
1 2 |
lastrow = ws7.max_row print(lastrow) |
実行結果
1 |
>>>26 |
ここで取得した最終行を使って処理をしていきます。
プログラム4|F列の値を取得
1 2 |
# プログラム6|セル範囲の指定 myRanges = ws7['B2:B' + str(lastrow7)] |
この事例では「lastrow7 = 26」なので、myRange=ws7[‘B2:B26’]と同じことを意味します。
openpyxlでは上記のようにセル範囲を取得するとき、注意点が2つあります。
注意1.タプル型で値を取得すること
1 2 |
myRanges = ws7['B2:B' + str(lastrow7)] print(myRanges) |
実行結果
1 |
>>>((<Cell 'Sheet7'.B2>,), (<Cell 'Sheet7'.B3>,), (<Cell 'Sheet7'.B4>,), (<Cell 'Sheet7'.B5>,), (<Cell 'Sheet7'.B6>,), (<Cell 'Sheet7'.B7>,), (<Cell 'Sheet7'.B8>,), (<Cell 'Sheet7'.B9>,), (<Cell 'Sheet7'.B10>,), (<Cell 'Sheet7'.B11>,), (<Cell 'Sheet7'.B12>,), (<Cell 'Sheet7'.B13>,), (<Cell 'Sheet7'.B14>,), (<Cell 'Sheet7'.B15>,), (<Cell 'Sheet7'.B16>,), (<Cell 'Sheet7'.B17>,), (<Cell 'Sheet7'.B18>,), (<Cell 'Sheet7'.B19>,), (<Cell 'Sheet7'.B20>,), (<Cell 'Sheet7'.B21>,), (<Cell 'Sheet7'.B22>,), (<Cell 'Sheet7'.B23>,), (<Cell 'Sheet7'.B24>,), (<Cell 'Sheet7'.B25>,), (<Cell 'Sheet7'.B26>,)) |
タプル型で値を取得することは、本事例ではそこまで影響はありませんが、これから他の事例でタプルとリストによってエラーが発生することもあるはずです。
そのため、ここでは注意喚起としてお伝えしておきます。
注意2.2次元配列(タプル)であること
以降のプログラムで、タプルとして取得したセルの値を取り出して扱います。
そのとき、2次元配列であることを理解しておく必要があります。
今回の事例は25行1列です。それでもセル範囲を取得すると、強制的に2次元配列(タプル)となります。
したがって、値を取り出して扱うときはforを二回繰り返す必要があります。詳細は次のプログラムで紹介していきます。
プログラム5|G1,H1,I1の値を取得
1 2 3 |
# プログラム7|範囲内のセルを検証 for rows in myRanges: for cell in rows: |
myRangesは2次元配列なので、forを二回繰り返してセルの値を取り出していく。
「cell.coordinate」でセルのアドレスを取得できるので、以下のとおりチェックしてみます。
1 2 3 |
for rows in myRanges: for cell in rows: print(print(cell.coordinate)) |
実行結果
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 |
>>>B2 >>>B3 >>>B4 >>>B5 >>>B6 >>>B7 >>>B8 >>>B9 >>>B10 >>>B11 >>>B12 >>>B13 >>>B14 >>>B15 >>>B16 >>>B17 >>>B18 >>>B19 >>>B20 >>>B21 >>>B22 >>>B23 >>>B24 >>>B25 >>>B26 |
上記のとおり、目的のセルを取得できているのが分かりました。
続いて、一つ一つのセルに特定の文字列が含まれているかどうかをif文を使い調べていきます。
プログラム8|特定の文字列が入っているかどうか調べる
1 2 3 4 |
# プログラム8|特定の文字列が入っているかどうか調べる if moji in cell.value: cell.offset(0,1).value = 'x' kensu += 1 |
プログラム解説
以下で一行ずつプログラムを解説します
2 |
if moji in cell.value: |
プログラム7で取得した一つ一つのcellのvalue(値)の中に、moji(プログラム3)が含まれているかどうかをチェックします。
「if A(特定文字列) in B(対象セル)」とすることで、「B(対象セル)の中にA(特定文字列)が含まれているならば」となります。
このような「if A in B:」を覚えておくと、役立つことが多いので、ぜひ覚えておくと便利です。
さて、もし含まれていれば次のプログラムを動かします。
3 |
cell.offset(0,1).value = 'x' |
cell.offset(0,1)で対象cellの1つ右の列に「x」を入力します。
ここではcellはB2~B26なので、cell.offset(0,1)はC2~C26となります。
4 |
kensu += 1 |
kensu(プログラム4)に1を加算します。
なお「kensu=kensu+1」と表記しても同じように加算することができます。
kensu(加算結果)はプログラム9で出力します。
プログラム9|G列~I列に件数を出力
1 2 |
# プログラム9|kensuを出力 ws7['F2'].value = kensu |
セルF2にkensuの値を出力します。
今回の事例では「愛」が含まれているセルは5つだったので、5が出力されます。
プログラム10|ファイル保存
1 2 |
# プログラム10|ファイル保存 wb.save('Sample7.xlsx') |
「Sample.xlsx」を「Sample7.xlsx」としてエクセルを保存します。
エクセルファイルの保存先は「.py」ファイルと同じフォルダに保存されます。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Python×効率化のサンプル
Pythonで効率化できる事例をサンプルコード付きで紹介しています。
Python×Excel
PythonとExcelで自動化できることを紹介しています。
事例も数多く紹介しているので、ぜひ参考にしてみてください。
Python×PDF
PythonとPDFで自動化できることを紹介しています。
Pythonって難しい?
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。