openpyxlで作ったシステムを動かしたら、
「KeyError: ‘Worksheet xxx does not exist.’」というエラーが出た…。
これはいったいどうしたらいいの?
ワークシートに関するエラーですね!
原因と対処法を解説いたします!
今回は、「KeyError: ‘Worksheet xxx does not exist.’」の原因と対処法を
Python歴3年の私が、できるだけわかりやすく解説し、解決に導きます。
「Worksheet xxx does not exist」エラーの原因
代表的な原因は以下の3つです。
- 指定したシート名が間違っている
- 削除したシートを指定している
- 変更前のシート名を指定している
まず、この「Worksheet xxx does not exist」はどのようなエラーなのでしょうか。
「Worksheet xxx does not exist」はどんなエラー?
「Worksheet xxx does not exist」は、
直訳すると、「ワークシート xxx は存在しません」となります。
要は、「指定したワークシートが見つかりませんでした」ということですね。
では、ワークシートが見つからない原因を見ていきましょう。
「Worksheet xxx does not exist」の原因と対処法
冒頭でも触れましたが、代表的な原因は以下の3つです。
- 指定したシート名が間違っている
- 削除したシートを指定している
- 変更前のシート名を指定している
1つ1つ解説いたします。
指定したシート名が間違っている
一番多い原因はコレです。
以下の構文を見てください。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet2']
wb.save('input.xlsx')
▼input.xlsx
実行結果:「KeyError: ‘Worksheet Sheet2 does not exist.’」
実際のワークシートは「Sheet1」しか無いにもかかわらず、構文では「Sheet2」を指定してしまっています。
「Sheet2」は存在しないため、今回のようなエラーとなります。
よくある指定間違いの例
- 小文字・大文字の違い(Sheet1 / sheet1 / SHEET1)
- スペースやアンダーバーあるなし(Sheet1 / Sheet 1 / Sheet_1)
指定したシート名が間違っている場合の対処法
指定のシート名が間違っている場合の対処法は下記の3つです。
- 指定のシート名(構文)を変更する
- 実際のシート名を変更する
- シート番号で指定する
1と2は、「実際のシート名」と「構文指定のシート名」を一致させるということです。
3はシート名ではなく、「シート番号」で指定することで、エラーを回避することができます。
#シート名で指定
ws = wb['Sheet2']
#シート番号で指定
ws = wb.worksheets[0]
上記構文では、「0番目」つまり、一番左端のシートを指定したことになります。
ただし、複数のシートの順番が入れ替わっていた場合、意図しないシートを操作してしまう場合がありますのでご注意ください。
シート指定の方法は、下記記事で解説しております。
削除したシートを指定している
次は、削除したシートを指定しているパターンです。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb.remove(wb['Sheet1'])
ws = wb['Sheet1']
wb.save('input.xlsx')
実行結果:KeyError: 'Worksheet Sheet1 does not exist.'
5行目で「Sheet1」を削除したにもかかわらず、7行目で「Sheet1」を指定しているため、エラーが起こります。
シートを削除する方法は、下記記事で解説しております。
削除したシートを指定している場合の対処法
削除したシートを指定している場合の対処法は以下の2つです。
- 削除をやめる
- シート名での指定をやめる
【削除をやめる】
軽量化や秘密保持などの理由で、シートを削除するのはよくあることです。
削除をやめることで、これらの問題が再発する可能性があるため、自己責任で行ってください。
【シート名での指定をやめる】
シート名ではなく、シート番号で指定をすることができます。
前項で解説済ですので、詳細は割愛させていただきます。
変更前のシート名を指定している
次は、名前を変更した後のシートを、変更前のシート名で指定しているパターンです。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
ws.title = '変更後シート'
ws = wb['Sheet1']
wb.save('input.xlsx')
実行結果:KeyError: 'Worksheet Sheet1 does not exist.'
7行目で「Sheet1」の名前を「変更後シート」に変更したにもかかわらず、9行目で「Sheet1」を指定しているため、エラーが起こります。
シート名を変更する方法は、下記記事にて解説しております。
変更前のシート名を指定している場合の対処法
変更前のシート名を指定している場合の対処法は以下の2つです。
- 変更後のシート名で指定する
- シート番号で指定する
【変更後のシート名で指定する】
変更後のシート名は、構文を読み返して探す他ありません。
構文作成時に、できるだけ「#シート名変更」などのコメントを入れるようにしましょう。
【シート名での指定をやめる】
シート名ではなく、シート番号で指定をすることができます。
前項で解説済ですので、詳細は割愛させていただきます。
最後に
「KeyError: ‘Worksheet xxx does not exist.’」の原因と対処法を解説いたしました。
このエラーが出たら、まずワークシートの名前をチェックしてみてください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、ぜひ他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!