NameError: name “変数名” is not definedというエラーになることがあります。
「”変数名”が定義されていませんよ」というエラーで、
「え、ちゃんと定義しているのになぜエラーになるの?」というお悩みに答えます。
結論
Name errorになる原因と解決方法
私のエラーの例はこんな感じでした。
このような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つ。
エラーになる原因
- 元の定義(今回の場合でいうと”都市名”部分)が違っている
- 指定した範囲に定義した値が存在しない
定義の元の値が違っている場合
時々、「都市名 」のように元のExcelに全角などのスペースが入っている場合があります。
そのスペースまで指定していないとName errorになってしまうので、元の値の再度ご確認を。
指定した範囲に定義した値が存在しない
定義した値が存在しないのには、次の2つの要因があります。
- 元の値の指定ミス
今回の場合はif ws.cell(i,3).value==”都市名”:の部分で、i行3列目と指定している部分です。
ときどき行や列を間違えて指定していることがあるので、元の値と照らし合わせてご確認ください。 - 「定義されていない」とエラーになった部分がfor文の中に入ってしまっている
今回のエラーの原因はこれでした。
12行目以降のfor文が入れ子構造になっており、8行目で始まるfor文が生きているため、もし「都市名」という値が無い場合は、12行目以降のループが回らず、エラーとなってしまうのです。
for文を入れ子構造にしていたことが原因だったので、12行目以降のfor文を外に書いて解決しました!
このエラーがfor文のインデントの理解を深めるきっかけにもなりました。
参考になれば幸いです!
定義していたfor文の中にfor文を入れていたことが原因で、for文を外に出したら解決した