レガシーなWindowsアプリをPythonでちょっとRPA化
🕰 背景
業務で使っている 古い .NET 製のデスクトップアプリ に、
「一覧上のチェックボックスを一括でONにする」機能がなかった。
1画面に40行ほどチェックボックスが並んでおり、
毎回それをマウスで1つずつクリックしていくという、
たいしたことないけどストレスがあった。
パッケージのアプリ側を改修するのは無理なので、
「そこだけRPAできないか?」と思い立って
Pythonで軽いスクリプトを書いてみた。
⚙️ 使用環境
| 項目 | 内容 |
|---|---|
| OS | Windows 10 / 11 |
| アプリ | .NET Framework製(WinForms系) |
| Python | 3.11 |
| ライブラリ | PyAutoGUI |
| 実行形態 | スクリプト or exe(PyInstallerで変換) |
わざわざRPAツールを使わなくても
“ちょっとした自動化”にPythonは本当に便利。
🧰 1. 座標の取得
まず、クリック位置(X, Y)を調べる必要がある。
PyAutoGUIを使うなら、以下のワンライナーでマウス位置を確認できる:
import pyautogui, time
time.sleep(3)
print(pyautogui.position())
私は今回は 「MPos」(フリーのマウス座標表示ツール)を使った。
画面上でマウスを動かすだけで現在の座標が常に表示されるので、
各行のY座標を素早く測るのに便利。

🧩 2. 行ごとの座標を調べた結果
単純に「行ごとに +23px」ではズレが生じるタイプのUIだった。
実際に計測した結果がこちら👇
| 行番号 | Y座標 |
|---|---|
| 0 | 102 |
| 5 | 208 |
| 10 | 313 |
| 15 | 417 |
| 20 | 522 |
| 25 | 627 |
| 30 | 732 |
| 35 | 838 |
| 40 | 943 |
このように、5行ごとに増分が小数点単位で少しずつ違うため、
単純なループではクリック位置がズレていく問題が発生。
そこで、5行単位で座標補間する方式にした。
pythonのコードはchat GPTで生成。
💻 3. Pythonスクリプト本体
ファイル名:checkbox_auto_click.py
import pyautogui
import time
import os
from datetime import datetime
# ======== 設定 ========
LOG_FILE = r"C:\checkbox_auto_click\checkbox_click.log"
CHECKBOX_X = 553 # チェックボックス列のX座標
CLICK_DELAY = 0.2 # 各クリックの間隔
# =====================
# Y座標補正テーブル(5行単位)
Y_MAP = {
0: 102,
5: 208,
10: 313,
15: 417,
20: 522,
25: 627,
30: 732,
35: 838,
40: 943,
42: 985
}
# 区間ごとの1行あたりの増分を自動計算
SEGMENTS = []
keys = sorted(Y_MAP.keys())
for i in range(len(keys) - 1):
start_line = keys[i]
end_line = keys[i + 1]
start_y = Y_MAP[start_line]
end_y = Y_MAP[end_line]
gap = (end_y - start_y) / (end_line - start_line)
SEGMENTS.append((start_line, end_line, start_y, gap))
def calc_y(line):
"""指定行番号のY座標を補間で算出"""
for start, end, base_y, gap in SEGMENTS:
if start <= line <= end:
return int(base_y + (line - start) * gap)
return Y_MAP[max(Y_MAP.keys())]
def log(message):
os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
timestamp = datetime.now().strftime("[%Y-%m-%d %H:%M:%S]")
text = f"{timestamp} {message}"
print(text)
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(text + "\n")
def main():
log("=== チェックボックス自動クリック(5行補正)開始 ===")
log("3秒後に対象ウィンドウを前面に表示してください...")
time.sleep(3)
for i in range(43): # 0〜42行目までクリック
x = CHECKBOX_X
y = calc_y(i)
pyautogui.click(x, y)
log(f"クリック: 行{i} (x={x}, y={y})")
time.sleep(CLICK_DELAY)
log("✅ 全クリック完了")
log("=== 終了 ===\n")
if __name__ == "__main__":
main()
⚙️ 4. 実行方法
- 対象アプリの一覧画面を開く
- スクリプトを実行(またはexe化してバッチから起動)
- 「3秒後に対象ウィンドウを前面に表示してください」と出たら放置
- 上から順にクリックが始まり、全行チェック完了
ログは以下に出力される:
C:\checkbox_auto_click\checkbox_click.log
📘 実行ログ例
[2025-10-08 16:45:33] === チェックボックス自動クリック(5行補正)開始 ===
[2025-10-08 16:45:36] クリック: 行0 (x=553, y=102)
[2025-10-08 16:45:36] クリック: 行1 (x=553, y=122)
[2025-10-08 16:45:37] クリック: 行2 (x=553, y=143)
...
[2025-10-08 16:45:42] ✅ 全クリック完了
[2025-10-08 16:45:42] === 終了 ===
🧩 5. exe化(オプション)
Pythonを入れていないサーバーでも動かしたかったので、
PyInstaller で exe 化。
pip install pyinstaller
pyinstaller --onefile checkbox_auto_click.py
出力された checkbox_auto_click.exe を
C:\checkbox_auto_click\ に置くだけでOK。
💬 所感
- レガシーな業務アプリにはちょっとした便利機能がないことがある。
- ちょっとした補助ツールを自作するだけで、
手作業のストレスを大きく減らせる - RPAツールでなくとも、Pythonだけで十分対応可能
実際このスクリプトで、
約40クリック分の操作が 10秒未満 で完了。時間よりもストレスがかからないのが◎。
思った以上に安定して動作した。
✅ まとめ
| 項目 | 内容 |
|---|---|
| 背景 | 古いデスクトップアプリに一括操作機能がない |
| アプローチ | Python + PyAutoGUIでクリックを自動化 |
| ポイント | 座標補間で誤差を吸収(5行単位) |
| 効果 | 約40行の手動クリックが数秒で完了 |
| 追加ツール | MPosで座標測定、PyInstallerでexe化 |
🚀 おわりに
Pythonは「システム連携」や「データ処理」だけでなく、
Windows操作のちょっとした自動化 にも使える。
Discussion