【30代からのプログラミング】Pythonでツールもどきを作ってみた その2(ボツにしたバージョン)
こちらで記事にした「勤務時間書込みツール」で次の改修課題になっていた「土日のセルを空白にすること」に対応するツールを作りました。
といってもまだ完成ではなく、「勤務時間書込みツール」を利用してすべてのセルに勤務時間を書き込んだ後、このツールを使うと土日のセルが空白になるツールです。名付けて「土日空白ツール」。作っている中で色々課題が見えてきたのでメモ代わりに紹介します。
どんなツール?
「勤務時間書込みツール」を利用すると、こんな感じでD11~E41までのすべてのセルに勤務時間が入ります。
ただこれでは勤務しているはずがない土日にも全て勤務時間が入ってしまうので、いかにも中途半端なアプリです。そこで、次なる「土日空白ツール」を利用すると土日が空白になります。
これならあと問題になるのは祝日と大の月小の月だけですね。ちょっとはツールらしくなってきた気がします。ただし後述しますが今回紹介するコードは欠陥があるのでボツにしました。
コードの紹介
コードはこのようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import openpyxl import datetime #ワークブックを取得 wb = openpyxl.load_workbook('kinmuhyo2019.xlsx',data_only=True) #ワークシートを取得 ws = wb['勤務表'] #セルの情報を取得する for youbi in range(11,41): sheetprint = ws.cell(row=youbi,column=2).value print(sheetprint) week_day = sheetprint.weekday() if week_day >= 5: ws.cell(row=youbi,column=4).value= '' print('書換済み') else: print('書換なし') for youbi in range(11,41): sheetprint = ws.cell(row=youbi,column=2).value print(sheetprint) week_day = sheetprint.weekday() if week_day >= 5: ws.cell(row=youbi,column=5).value= '' print('書換済み') else: print('書換なし') #保存する wb.save('kinmuhyo2019.xlsx') |
勤務表のexcelシートで見た目上曜日が表示されているのはC列ですが、実はB列を参照しているため実質的に日付情報を保持しているのはB列となります。そのため、B列にある日付情報をdatetimeで曜日に変換して、その値が5か6なら空白に書き換えるというロジックにしました。
エラーなどへの対処はやっていませんが、一応書き換えたかどうかのログが出るようにしました。
しかし、、、このツールは重大な欠陥があってボツにしました。原因は不明で解決ができていないのですが、欠陥の内容について書いていきます。
なぜかツールが動かないことがある
B列にあるセルの値を参照してif文に入れるはずなのですが、この参照がうまくいかず以下のようなエラーが出てしまうことがあります。
None
Traceback (most recent call last):
File “(※ファイルの階層とファイル名)”, line 14, in <module>
week_day = sheetprint.weekday()
AttributeError: ‘NoneType’ object has no attribute ‘weekday’
先に「勤務時間書込みツール」を使ったときに参照できなくなるようです。このエラーが出た後、excelファイルを開いて保存しなおすとツールが動きます。色々探ってたところ、そんな感じの制限事項があるというのをどこかで見たような気がするのですが、、、ちょっとよくわかりません。
なぜかツールをかけるとexcelの関数が消える
かなり重大な欠陥なのですが、このツールをかけるとなぜかexcelファイルにあった関数がすべて消えてしまいます。
例えば、B11セルはDATA関数によって日付が表示されているのですが、それが消えて値がただの文字列として表示されるようになってしまいます。それが全てのセルに適用されていて、ぱっと見は良いのですが全然中身が違ってしまっているのです。
関数によって勤務日数など色々管理されているので、さすがに関数がすべて消えてしまうのはまずいです。
「data_only=True」で関数の値を読み込むのが原因だと思い色々調べたのですが解決法は見つからず、このコードはあきらめました。
解決方法を考える
このツールの欠陥を解決するために、抜本的に考え方を変えてExcelの情報を読み込まない方法を考えました。それを次回の記事にします。
ディスカッション
コメント一覧
まだ、コメントがありません