はじめに
PythonでExcelにデータを書き込んでいるときに、ユーザーがExcelを操作すると固まってしまうことがありました。
なぜこのような現象が起きるのか気になり、仕組みを調べてみました。
特に、Python + Excel(VBA/COM)連携ではこの問題が発生しやすいです。
この記事ではこの現象を、
- ユーザー入力
- 画面描画
- Python(COM経由の書き込み)
という観点から、「なぜ固まるのか」を整理します。
よくある誤解
まず私はこう考えてました。
ユーザー操作はイベントの後ろに追加されるだけだから
Pythonの処理が終わってから処理されるはず
👉 これは半分正しくて、半分間違いです
基本構造(ここがすべて)
Microsoft Excel のようなWindowsアプリは、基本的にこう動いています。
イベントループ
+
状態(state)
+
単一スレッド(UIスレッド)
イベントループとは
イベント(入力・描画など)を1つずつ処理する仕組み
対象になるもの:
- マウス操作
- キーボード入力
- 画面再描画
- VBAイベント
状態(state)とは
アプリの「現在の状況」です。
- どのセルが選択されているか
- 編集中かどうか
- 計算中か
- 描画が必要か
何が起きているのか
PythonからExcelにデータを書き込んでいるとき:
状態:セル更新中(忙しい)
ここでユーザーがクリックすると:
イベント:キューに追加される
状態:「選択を変えたい」
問題の本質
・まだ書き込み中
・でも選択を変えたい
・でも処理できない
👉 状態が衝突する
なぜフリーズするのか
Excelはシングルスレッドなので:
- Pythonの書き込み(COM経由)
- UI処理(入力・描画)
👉 全部同じスレッドで処理される
結果:
- 処理が詰まる
- 応答できなくなる
- Pythonも待たされる
👉 これが「フリーズ」
重要なポイント
- イベントは後ろに並ぶ ✔
- でも状態の変化要求はすぐ発生 ✔
- すべて1スレッドで処理 ✔
👉 これが詰まりの原因
まとめ
👉 イベントは後ろに並ぶが、状態は今変わろうとする