🤖

レガシーな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. 実行方法

  1. 対象アプリの一覧画面を開く
  2. スクリプトを実行(またはexe化してバッチから起動)
  3. 「3秒後に対象ウィンドウを前面に表示してください」と出たら放置
  4. 上から順にクリックが始まり、全行チェック完了

ログは以下に出力される:

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