初心者ですので不足なコード、記載ミスなどありましたらお教えください。
コードがきれいとはいいがたいのですがどこが悪さしているかわからないのですべて公開します。
コードは長いですが本題は退出記録を記載したいだけなのでそれ以外は飛ばしていただいて構いません。
https://teratail.com/questions/227911
が必要そうな内容を切り抜いて質問させていただいていると思うのですが
不足していそうなので別で質問させていただきます。
不足していませんでした。むしろ単純ミスで、これだけ長いコードを公開したせいで分かりにくくなっていました。
解決した内容を記入しておきましたので許して…
前提・実現したいこと
・セルの値が空白かつIDが一致したときに値をセルに入れたい
・入退出管理システムを作っています
・入室のみのログ、退出のみのログはとれるようになりました
・このままだと二つのログを合わせて計算しないといけません
・システム自体はこのようになっています
ウィンドウに出勤ボタンと退勤ボタンを設定
ボタンが押されたときに4桁の数字かチェックし、OKならSub_Excelを呼び出し
Sub_Excelでは入室記録と退出記録、入退出記録を別で管理。
(入室記録:In_LogLIst.xlsx)
(退出記録:Out_LogList.xlsx)
(入退出記録:Main_LogList.xlsx)←これがうまくいっていない
なのでpython+openpyxlで次のようなことを行いたいです
・入室ログと退出ログを合わせたものを作りたいです。具体的には以下の通り
*入室時に入室時間と社員番号を入れる
*退出時に社員番号が一致し、(かつセルが空白であるとき(この部分は一致したときに入らないので未実装です))退出時間と社員番号を入れる(セルが空白でない=ほかの人が入れているため)
(一致しない場合やほかの人が入れてしまっていてかぶっている場合はエラーリストに入れておく(未実装))
発生している問題・エラーメッセージ
・一致していない扱いなのか退出記録が記録されません。
if ID == EmpNum でID(Excelに記載の社員番号)とEmpNum(GUI側からとってきた社員番号)
が一致した場合はExcelの入室記録のわきに退出記録を入れたいです。
python
1import openpyxl 2from datetime import datetime 3 4def In_Excelwrite(Status,EmpNum): 5 #Excelファイルを開く 6 Inwb = openpyxl.load_workbook(r"C:\python\tkinter\In_LogLIst.xlsx") 7 Inws = Inwb["IN_LIST"] 8 9 #最終行取得など 10 MaxLow = Inwb["IN_LIST"].max_row 11 12 #各種データ 13 d_now = str(format(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))) 14 print(EmpNum,d_now,Status) 15 #出勤にデータを入れる 16 Inws.cell(row = MaxLow + 1 , column = 1 ,value = EmpNum) 17 Inws.cell(row = MaxLow + 1 , column = 2 ,value = d_now) 18 Inws.cell(row = MaxLow + 1 , column = 3 ,value = Status) 19 20 #保存する 21 Inwb.save(r"C:\python\tkinter\In_LogLIst.xlsx") 22 23 ##ここからメインファイル用 24 #メインのExcelファイルを開く 25 Mainwb = openpyxl.load_workbook(r"C:\python\tkinter\Main_LogList.xlsx") 26 Mainws = Mainwb["MAIN_LIST"] 27 28 MainMaxLow = Mainwb["MAIN_LIST"].max_row 29 #メインにデータを入れる**(データが入りません)** 30 Mainws.cell(row = MainMaxLow + 1 , column = 1 ,value = EmpNum) 31 Mainws.cell(row = MainMaxLow + 1 , column = 2 ,value = d_now) 32 Mainws.cell(row = MainMaxLow + 1 , column = 3 ,value = Status) 33 #保存する 34 Mainwb.save(r"C:\python\tkinter\Main_LogList.xlsx") 35 36 #処理完了 37 print("処理が完了しました") 38 39def Out_Excelwrite(Status,EmpNum): 40 #Excelファイルを開く 41 Outwb = openpyxl.load_workbook(r"C:\python\tkinter\Out_LogList.xlsx") 42 Outws = Outwb["OUT_LIST"] 43 44 #最終行取得など 45 MaxLow = Outwb["OUT_LIST"].max_row 46 #各種データ 47 d_now = str(format(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))) 48 print(EmpNum,d_now,Status) 49 #退勤にデータを入れる 50 Outws.cell(row = MaxLow + 1 , column = 1 ,value = EmpNum) 51 Outws.cell(row = MaxLow + 1 , column = 2 ,value = d_now) 52 Outws.cell(row = MaxLow + 1 , column = 3 ,value = Status) 53 54 #保存する 55 Outwb.save(r"C:\python\tkinter\Out_LogList.xlsx") 56 57 ##ここからメインファイル用 58 #メインのExcelファイルを開く 59 Mainwb = openpyxl.load_workbook(r"C:\python\tkinter\Main_LogList.xlsx") 60 Mainws = Mainwb["MAIN_LIST"] 61 62 MainMaxLow = Mainwb["MAIN_LIST"].max_row 63 #メインにデータを入れる ここ違う 64 for row_num in range(1,Mainws.max_row): 65 ID = Mainws.cell(row = row_num , column = 1).value 66 if str(ID) in EmpNum: 67 Mainws.cell(row = row_num , column = 4 ,value = EmpNum)#ここでvalueを入れている位置が違ったようです 68 Mainws.cell(row = row_num , column = 5 ,value = d_now) 69 Mainws.cell(row = row_num , column = 6 ,value = Status) 70 print("ALLRIGHT") 71 else: 72 print("Error") 73 74 #保存する 75 Mainwb.save(r"C:\python\tkinter\Main_LogList.xlsx") 76 77 #処理完了 78 print("処理が完了しました")
試したこと
エラーが出ていないので調べようにも調べられずやれたことは少ないですが…
・IDがStr型なのでEmpNumの型を確認
str型でした。
・実行した結果を確認
入退出記録に入室時のデータは入っているのに退出時のみ記録できません。
・セルが空白であるとき~の条件付けを削除
問題を切り分けるために削除しましたが駄目でした。
補足情報(FW/ツールのバージョンなど)
python 3.8.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。