0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsアプリケーションが固まる理由 Python × Excel × VBA × ユーザー入力 × 画面描画から理解する

0
Last updated at Posted at 2026-04-09

はじめに

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スレッドで処理 ✔

👉 これが詰まりの原因


まとめ

👉 イベントは後ろに並ぶが、状態は今変わろうとする

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?