質問: Status) print("ALLRIGHT") else: print("Error") #保存する Mainwb.save(r"C:\python\tkinter\Main_LogList.xlsx") #処理完了 print("処理が完了しました") ``` ### 試したこと エラーが出ていないので調べようにも調べられずやれたことは少ないですが... ・IDがStr型なのでEmpNumの型を確認 str型でした。 ・実行した結果を確認 入退出記録に入室時のデータは入っているのに退出時のみ記録できません。 ・セルが空白であるとき~の条件付けを削除 問題を切り分けるために削除しましたが駄目でした。 ### 補足情報(FW/ツールのバージョンなど) python 3.8.0
回答: 最初に 今回の問題点は主に二点でした。 1.値が一致したときに入るはずの値が入らない 2.値が一致したときという条件だけではすでに値が入っているセルに入ってしまう →セルが空白であるときのみ値を入れたい つまり条件としては「セルが空白であり、かつ値が一致している」 という条件になれば値が一致した、値がまだ入っていないところに値を入れてくれるはずです。 1の解決法 結論から言えば値を入れるための文法が違いました。 カッコ内で"value=xxx"とする場合はほかのところでxxx=yyyとしておかなければならないようです。 今回は行っていなかったのでカッコの外で行わなければならなったようです。 さらに、値が一致するものを見つけた後もfor文が回っているせいで一致する限り何回も値が入ってしまいました。 なので一致した場合はbreakでfor文を抜けさせるようにしました。 また、TaroToyotomi様がおっしゃる通り、pythonのシェルから range(1,10) と入力してみると、10行目まで探してほしいのに9行目までしか探してくれていませんでした。 なので+1しておくことで解決させました(よい解決方法なのかはわかりません) これらを踏まえた修正後のコードがこちらです ``` for row_num in range(1,Mainws.max_row + 1): ID = Mainws.cell(row = row_num , column = 1).value if str(ID) in EmpNum: Mainws.cell(row = row_num , column = 4 ).value = EmpNum Mainws.cell(row = row_num , column = 5 ).value = d_now Mainws.cell(row = row_num , column = 6 ).value = Status print("ALLRIGHT") break else: print("Error") ``` 元のコードがこちらです。 ``` #メインにデータを入れる for row_num in range(1,Mainws.max_row): ID = Mainws.cell(row = row_num , column = 1).value if str(ID) in EmpNum: Mainws.cell(row = row_num , column = 4 ,value = EmpNum) Mainws.cell(row = row_num , column = 5 ,value = d_now) Mainws.cell(row = row_num , column = 6 ,value = Status) print("ALLRIGHT") else: print("Error") ``` 2の解決法 「セルが空白である」ということを考えたときに真っ先にcell.value==""が浮かびました。 が、どうもうまくいかない... https://stackoverrun.com/ja/q/2033147 では if sheet.cell(row = 1, column=7).value == None: print("Blank") となっているに、cell.value=="" ではなく、cell.value==None とすれば空白セルを認識してくれる?ようです。 結論 結果、このようなコードになりました ``` for row_num in range(1,Mainws.max_row + 1): ID = Mainws.cell(row = row_num , column = 1).value if Mainws.cell(row = row_num , column = 4).value == None and str(ID) in EmpNum: Mainws.cell(row = row_num , column = 4 ).value = EmpNum Mainws.cell(row = row_num , column = 5 ).value = d_now Mainws.cell(row = row_num , column = 6 ).value = Status print("ALLRIGHT") break else: print("Error") ``` これでやりたかったことをやってくれるようになった...と思います。 最後に 最後になりますがTaroToyotomi様、meg_様に感謝申し上げます。ありがとうございました。