質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1139閲覧

python+openpyxl if文以下が実行されない?

suger365

総合スコア7

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/07 04:17

編集2019/12/07 14:40

<追記情報>
https://teratail.com/questions/228031
に全文表記がありますので確認いただければ幸いです。

初心者ですので不足なコード、記載ミスなどありましたらお教えください。

前提・実現したいこと

・入退出管理システムを作っています
・入室のみのログ、退出のみのログはとれるようになりました
・このままだと二つのログを合わせて計算しないといけません

なのでpython+openpyxlで次のようなことを行いたいです

・入室ログと退出ログを合わせたものを作りたいです。具体的には以下の通り
*入室時に入室時間と社員番号を入れる
*退出時に社員番号が一致し、かつセルが空白であるとき退出時間と社員番号を入れる(セルが空白でない=ほかの人が入れているため)
(一致しない場合やほかの人が入れてしまっていてかぶっている場合はエラーリストに入れておく)

発生している問題・エラーメッセージ

・一致していない扱いなのか退出記録が記録されません。
if と and であっていると思うのですが…

エラーメッセージが出ないので見当のつけようもありません。

該当のソースコード

呼び出される側のコード

python

1def Out_Excelwrite(Status,EmpNum): 2 #Excelファイルを開く 3 Outwb = openpyxl.load_workbook(r"C:\python\tkinter\Out_LogList.xlsx") 4 Outws = Outwb["OUT_LIST"] 5 6 #最終行取得など 7 MaxLow = Outwb["OUT_LIST"].max_row 8 #各種データ 9 d_now = str(format(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))) 10 print(EmpNum,d_now,Status) 11 12 ##ここからメインファイル用 13 #メインのExcelファイルを開く 14 Mainwb = openpyxl.load_workbook(r"C:\python\tkinter\Main_LogList.xlsx") 15 Mainws = Mainwb["MAIN_LIST"] 16 17 MainMaxLow = Mainwb["MAIN_LIST"].max_row 18 #メインにデータを入れる ここ違う 19 for row_num in range(2,Mainws.max_row): 20 ID = Mainws.cell(row = row_num , column = 1).value 21 if str(ID) in EmpNum and Mainws.cell(row = row_num , column = 4).value == "": 22 Mainws.cell(row = row_num , column = 4 ,value = EmpNum) 23 Mainws.cell(row = row_num , column = 5 ,value = d_now) 24 Mainws.cell(row = row_num , column = 6 ,value = Status) 25 print("ALLRIGHT") 26 27 #保存する 28 Mainwb.save(r"C:\python\tkinter\Main_LogList.xlsx") 29 30 #処理完了 31 print("処理が完了しました")

呼び出す側のコード

python

1OutEnter = tk.Label(root,text = "退勤",font=("25","40"),bg="green") 2OutEnter.place(x=400,y=175) 3OutEnter.bind("<Button-1>", OutWork) 4 5def OutWork(event): 6 Status = "退勤" 7 EmpNum = Number.get() 8 EmpNum_Count = len(EmpNum) 9 if EmpNum_Count == 4: 10 d_now = str(format(datetime.now().strftime("%Y/%m/%d"))) 11 t_now = str(format(datetime.now().strftime("%H:%M:%S"))) 12 print(EmpNum,d_now,t_now,Status) 13 tkinter_Sub_Excel.Out_Excelwrite(Status,EmpNum) 14 Number.delete(0,tk.END) 15 res1 = str(format(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))) 16 res2 = "社員番号"+str(EmpNum)+"の"+Status+"を確認しました" 17 Check["text"] = res1 +"\n"+res2 18 def clear(): 19 Check["text"] = "" 20 root.after(2000,clear)

試したこと

処理終了時にALLRIGHTをprintさせるようにしたのですがprintされませんでした。
実行時は以下のように出ます

1101 2019/12/07 13:01:46 退勤
1101 2019/12/07 13:01:46 退勤
処理が完了しました

なのでここからメインファイル用以下が無視されている?状態です。

if str(ID)いかにこのelseを入れると

else:
print("Error")

結果は次の通りです。
Errorが複数回出ているのはfor文を抜けさせていないからだと思うのですが…
なぜif以下の処理をしてくれないのでしょうか…

1101 2019/12/07 13:12:05 退勤
1101 2019/12/07 13:12:06 退勤
Error
Error
Error
Error
処理が完了しました

補足情報(FW/ツールのバージョンなど)

python 3.8.0です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/12/07 06:38

「if str(ID) in EmpNum and Mainws.cell(row = row_num , column = 4).value == "":」のandを分けてどこで上手くいっていないのか確かめてはどうでしょうか?
suger365

2019/12/07 06:57 編集

if str(ID) in EmpNum で実行したところ、退勤側の記録がされていませんでした。 =if文以下は丸々無視されている?ことになるのでしょうか…? 質問文が分かりにくかったと思うので注記させていただきます。 入室リストと退出リスト、入退出リストがあり、 入室リストと退出リストは正しく記録されているが、 入退出リストは入室のみが記録され、退出が記録されていない状況です。
meg_

2019/12/07 09:07

EmpNumの型は何ですか?(文字列かリストでしょうか?)
suger365

2019/12/07 11:19

print(type(EmpNUm))で確認したところ<class 'str'>でしたので文字列です。 EmpNumは社員番号です。 IDはすでに入力済みの社員番号の読み取りのつもりです。
meg_

2019/12/07 13:37

「range(2,Mainws.max_row)」このコードですと、Mainws.max_row-1までしか対象にならないかと思います。「if str(ID) in EmpNum」これがTrueにならないということは、IDが一致するものがないということかと。
suger365

2019/12/07 14:14

for row_num in range(1,Mainws.max_row): に修正しましたが、退勤は記録されませんでした。 IDはどちらも1101を入力しています。 長いうえに汚いですが別でコード公開させてもらいますのでそちらを見ていただければと思います。
meg_

2019/12/08 12:26

range(2,Mainws.max_row+1)にするべきかと思います。これだと最終セルのIDも取得できるはずです。
suger365

2019/12/08 12:43 編集

meg_様 ありがとうございます!無事に最終セルのIDまで取得できるようになりました! もしよろしければ回答に記載していただければベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問