Pythonでエクセルの関数を置き換えるプログラムを作って毎月、使っていたのですが今回、なぜか「AttributeError: ‘NoneType’ object has no attribute ‘replace’」エラーとなってしまいました。いろいろやって、なぜか今回その不具合が解消したようなので備忘録として書いておきたいと思います。
そもそも作ったプログラムの内容はエクセルの特定の列にある「=INDIRECT(C2&”!A82″)」という「A」という文字を例えばBに一括で置き換えるものです。月が替わるたびにこのアルファベットを次のアルファベットへ置き換えてましたが、なぜが今月は上記のエラーが発生しました。過去にも一度このエラーが発生してプログラム修正してそのあとは安定していたのですが、今回プログラムを実行させたらエラーとなりました。
for row in ws.iter_rows():
for cell in row:
if cell.col_idx == 4 and cell.value is not None:
new_text = cell.value.replace(“F81”, “G81”)
cell.value = new_text
if cell.col_idx == 5:
new_text1 = cell.value.replace(“F82”, “G82”)
cell.value = new_text1
if cell.col_idx == 7:
new_text2 = cell.value.replace(“F3”, “G3”)
cell.value = new_text2
if cell.col_idx == 8:
new_text3 = cell.value.replace(“F4”, “G4”)
cell.value = new_text3
if cell.col_idx == 10:
new_text4 = cell.value.replace(“F113”, “G113”)
cell.value = new_text4
if cell.col_idx == 11:
new_text5 = cell.value.replace(“F114”, “G114”)
cell.value = new_text5
下記の部分でエラーが発生しました。
if cell.col_idx == 5:
new_text1 = cell.value.replace("F82", "G82")
cell.value = new_text1
いろいろと試した結果、「and cell.value is not None:」を「if cell.col_idx == 5」の後ろに追記しました。下記が修正後のプログラムです。
for row in ws.iter_rows():
for cell in row:
if cell.col_idx == 4 and cell.value is not None:
new_text = cell.value.replace("F81", "G81")
cell.value = new_text
if cell.col_idx == 5 and cell.value is not None:
new_text1 = cell.value.replace("F82", "G82")
cell.value = new_text1
if cell.col_idx == 7 and cell.value is not None:
new_text2 = cell.value.replace("F3", "G3")
cell.value = new_text2
if cell.col_idx == 8 and cell.value is not None:
new_text3 = cell.value.replace("F4", "G4")
cell.value = new_text3
if cell.col_idx == 10 and cell.value is not None:
new_text4 = cell.value.replace("F113", "G113")
cell.value = new_text4
if cell.col_idx == 11 and cell.value is not None:
new_text5 = cell.value.replace("F114", "G114")
cell.value = new_text5
エクセルの他のシートではこのようなことをしなくてもできたのですがあるシートではこのコードではないと動かなかったです。
「if cell.col_idx == 4 and cell.value is not None:」でもしエクセルが4列目で値が入っていれば次のコマンドを実行
「 new_text = cell.value.replace(“F81”, “G81”)
cell.value = new_text」
こちらは4列の目の上から順番にF81の文字をG81に置換せよ!ということです。
まとめ
要因はまったく掴めないのですが、office365なのでエクセルが自動でバージョンアップしたためか不明ですが、上記のコード追加でエラー解消しました。いろいろと試してどこが怪しいか若しくはこうしたらどうかというアイデアをひらめくことが重要かと思います。