openpyxlでエクセルファイルを編集しているんだけど、
特定の値がシート内にあるかを確認したい…。
なるほど…。
では今回は、「openpyxlでエクセル内の値を検索する方法」を
できるだけわかりやすく解説いたします。
「完全一致」だけではなく、「部分一致」で検索する方法も
紹介いたしますので、ぜひ最後まで読んでいってください。
openpyxlでエクセル内の値を検索する方法【完全一致】
「for文」と「if文」で検索します。
まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
少し長いですが、後ほどブロックごとに解説いたします。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
target_value = 'Utatane'
found_cells = []
for row in ws.iter_rows():
for cell in row:
if cell.value == target_value:
found_cells.append(cell.coordinate)
if found_cells:
print(f"'{target_value}'が見つかりました: {found_cells}")
else:
print(f"'{target_value}'は見つかりませんでした。")
for row in ws.iter_rows():
for cell in row:
if cell.value == target_value:
found_cells.append(cell.coordinate)
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
検索する値を設定
まずは検索する値を変数に格納します。
target_value = 'Utatane'
【コードの解説】
新しい名前の変数を書いたら、「=(イコール)」を書きます。
今回はわかりやすく「target_value」という名前にしましたが、何でも構いません。
しかしながら、つけられない名前があったりしますので、下記記事をご参考ください。
イコールの後ろには、検索したい値を書いてください。
検索結果を格納する配列を作成
次に、検索結果を格納する配列を作ります。
found_cells = []
要するに、空の配列を作成しています。
作り方の詳細は、下記記事をご参考ください。
シート内を検索
ここからが本番です。
for row in ws.iter_rows():
for cell in row:
if cell.value == target_value:
found_cells.append(cell.coordinate)
上記コードにて、シート内を検索しています。
まずは「for文」と「iter_rows」を使用して、シート内のセルを1つずつ取得していきます。
(コードの10・11行目)
「for文」「iter_rows」の使い方については、下記記事をご参考ください。
次に「if文」を使って、取得したセルの値を判定していきます。
「if文」の使い方については下記記事をご参考ください。
取得したセルの値が「target_value(Utatane)」と等しい場合は、「found_cells(検索結果を格納するために作成した配列)」にセル名が追加されます。
(for文によって、シート内の全セルを判定)
今回は、「A2」と「C2」のセルが「Utatane」と完全一致したため、「found_cells」には「A2」「C2」が格納されます。
大文字と小文字が区別されるため、今回の「B2」セルは完全一致とはなりません。
検索結果を表示
最後に、検索結果を表示します。
if found_cells:
print(f"'{target_value}'が見つかりました: {found_cells}")
else:
print(f"'{target_value}'は見つかりませんでした。")
検索がHITした場合(「found_cells」に値(セル名)が格納されている場合)は、16行目が表示されます。
検索がHITしなかった場合(値が格納されておらず、空の配列のままの場合)、18行目が表示されるというわけです。
今回は「A2」と「C2」が格納されているため、16行目が表示されます。
if~elseについての解説は、下記記事をご参考ください。
openpyxlでエクセル内の値を検索する方法【部分一致(含む)】
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
target_value = 'Utatane'
found_cells = []
for row in ws.iter_rows():
for cell in row:
if isinstance(cell.value, str) and target_value in cell.value:
found_cells.append(cell.coordinate)
if found_cells:
print(f"'{target_value}'を含むセルが見つかりました: {found_cells}")
else:
print(f"'{target_value}'を含むセルは見つかりませんでした。")
12行目以外は前項とほぼ同じですので、12行目のみ解説いたします。
for row in ws.iter_rows():
for cell in row:
if isinstance(cell.value, str) and target_value in cell.value:
found_cells.append(cell.coordinate)
前項同様for文でセルを1つずつ判定するのですが、判定のしかたが違います。
「isinstance(cell.value, str)」は「セルの値がstr型のとき」、
「target_value in cell.value」は、「セルの値にtarget_valueが含まれているとき」という意味だと思ってください。
あいだに「and」が入っているため、上記のどちらも当てはまるとき、「found_cells」にセル名が格納されます。
「in」を使用するため、「isinstance()」を使ってセルの値がstr型のときのみに限定しています。
数値を検索する場合は、うまくHITしない場合がありますので、コードの12行目を下記のように変更してください。
if cell.value is not None and target_value in str(cell.value):
部分一致検索をする際の注意点
まず、下図をご覧ください。
シート内のセルは全て空白ですが、A1セルに関数が入っています。
この状態で、部分一致検索を実行してみましょう。
セルが空白なのにもかかわらず、A1セルがHITしました。
このように、部分一致検索では、関数や数式に含まれる値にも反応してしまうため注意が必要です。
関数や数式が含まれている可能性がある場合は、「data_only = True」でシート内を値貼り付けすることをおすすめします。
値貼り付け後に検索した結果が下図です。
正しい検索結果が表示されました。
値貼り付けの詳細解説は下記記事をご参考ください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでエクセル内の値を検索する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!