openpyxl でセルに値を入れ、
他のセルには、openpyxl で入れるセルを参照して計算した結果が入るようにして、
さらにそのセルの計算結果を openpyxl で読み込んで処理するようにしていた (´・ω・`)
何度見ても何度試しても期待通りに動かない!!
よくよく調べてみると
エクセルの計算式は評価され、計算結果が保存されるタイミングがあるみたいで
openpyxl は保存されている計算結果を参照するから
openpyxl で入れた値を使って再計算されないことがわかった
くそぅ (´;ω;`)
何か方法はないかなと…
調べてみると xlwings, pyxlsb, win32com ではできそうな情報がありました (・・;)
まず、xlwings を試すも再計算されたり、されなかったり、
何がなんやらわからんちーな状態で1時間を浪費 (TдT)
どうしたらいいやら・・・
次に xlwings で解決できないかな、と試してみました (・∀・)ノシ
結論は 「できました!!」 ですが、小手先の対応感があります (・・;)
コードは以下、これを再計算させたいタイミングで実行しました (;´・ω・)
with xw.App(visible=False) as app:
wb = app.books.open(path)
wb.app.calculate()
ws = wb.sheets[toolname]
val = ws.range(1, 1).value
ws.range(1, 1).value = " "
ws.range(1, 1).value = val
wb.save()
wb.close()
見る人が見たらすぐわかると思いますが・・・
xlwings でエクセルをひらいて、計算をするための API をぶったたいた後、
A1 セルの値を一時退避、" " を書き込んだ後、元に戻して、保存・終了するっていう謎処理をしています (;^ω^)
ChatGPT さんも Copilot さんも上記の wb.app.calcutate() とか、なんやらほかにも紹介してくれたけど
動いたり・・・ 動かなかったり・・・ 試すたびに何か動きが違う・・・
バタついていました
結局、前述のような処理にすることで確実に再計算が行われるようになりました ('ω')v
強引だな・・・ と思いますが、Windows ってそういうところあるよね・・・ ということにして、
この件はこれで終了としようかな、と思っています ('ω')ノ
「これが本当に正しい対応の仕方だ!!」 をご存知の方、いらっしゃいましたら、ぜひご教授くださいませ m(_ _)m
0 件のコメント:
コメントを投稿