業務効率化したいPython初心者の方におすすめの講座はこちら

[Pythonエラー解決]NameError の原因と対策(openpyxl)

PythonのName errorを解決する記事のアイキャッチ画像

NameError: name “変数名” is not definedというエラーになることがあります。

「”変数名”が定義されていませんよ」というエラーで、

え、ちゃんと定義しているのになぜエラーになるの?」というお悩みに答えます。

結論

定義していたfor文の中にfor文を入れていたことが原因で、for文を外に出したら解決した

Name errorになる原因と解決方法

Name Errorが発生したExcelを扱ったコードの例

私のエラーの例はこんな感じでした。

このようなExcelで「都市名」と書かれている行をfor文で見つけて、すべての都市を別のExcelシートに転記しようとして、

i行、3列目の値が「都市名」だったらcity_row=i+1と定義しているのに、エラーが発生。

import openpyxl

wb=openpyxl.load_workbook("旅行日程.xlsx")
wb1=openpyxl.load_workbook("旅行日程_完成版.xlsx")
ws=wb.worksheets[0]
ws1=wb1.worksheets[0]

for i in range(1,30):
    if ws.cell(i,3).value=="都市名":
        city_row=i+1
        
    for j in range(city_row,city_row+10):
        if ws.cell(j,3).value is None:
            break
        
        input_row=ws1.max_row+1
        ws1.cell(input_row,1).value=ws.cell(j,3).value
          
            
wb1.save("旅行日程_完成版.xlsx")

メッセージでは、12行目で”city_row”が定義されていません、と出ています。

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[1], line 12
      9 if ws.cell(i,3).value=="都市名":
     10     city_row=i+1
---> 12 for j in range(city_row,city_row+10):
     13     if ws.cell(j,3).value is None:
     14         break

NameError: name 'city_row' is not defined

なぜ?

それはPython側から見て定義した値が見当たらない」からでした。

“変数名”に入る値が取得できていない(範囲に指定した値がない)と、このエラーになってしまいます。

考えられる原因は大きく分けて2つ。

エラーになる原因
  1. 元の定義(今回の場合でいうと”都市名”部分)が違っている
  2. 指定した範囲に定義した値が存在しない

定義の元の値が違っている場合

時々、「都市名 」のように元のExcelに全角などのスペースが入っている場合があります。

そのスペースまで指定していないとName errorになってしまうので、元の値の再度ご確認を。

指定した範囲に定義した値が存在しない

定義した値が存在しないのには、次の2つの要因があります。

  1. 元の値の指定ミス
    今回の場合はif ws.cell(i,3).value==”都市名”:の部分で、i行3列目と指定している部分です。
    ときどき行や列を間違えて指定していることがあるので、元の値と照らし合わせてご確認ください。
  2. 「定義されていない」とエラーになった部分がfor文の中に入ってしまっている
    今回のエラーの原因はこれでした
    12行目以降のfor文が入れ子構造になっており、8行目で始まるfor文が生きているため、もし「都市名」という値が無い場合は、12行目以降のループが回らず、エラーとなってしまうのです。

for文を入れ子構造にしていたことが原因だったので、12行目以降のfor文を外に書いて解決しました!

このエラーがfor文のインデントの理解を深めるきっかけにもなりました。

参考になれば幸いです!

ABOUT US
なかのゆり
書類作成、確認作業などに追われる日々の仕事。
一生懸命やっているつもりだった。
計算ミス、手配ミスにヒヤヒヤする日々。
仕事の効率をなんとかしなけらばいけないと思っていたけど、 どうしたらよいのか分からなかった。
Pythonの世界なんて、全く知らなかった。
そんな私がPythonで仕事が効率化されることによって、公私ともに大きく 変わるとは、夢にも思っていなかった..。

業務効率化のためにPythonを始めたことがきっかけで、Pythonにはまりました。(個人利用レベル)
詳細はこちら

労働時間が大きく削減され、仕事が大改善されて自由な時間も生まれました。
私のした素晴らしい経験を共有したい、仕事の効率が悪いけど、どうにかしたいという悩みを持った人々に向けて、 Pythonがいいよ、と教えてあげたい。
このブログでは、私が経験したエラー解決や迷い所、Pythonの活用方法をお伝えします。