end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

pyautogui から、ショートカットキーでexcel vbaマクロを実行- RPAもどき

appium + pyautogui + win32gui for python で、excelの保護ビューを解除する - end0tknr's kipple - 新web写経開発

上記エントリの続きとして、excel vbaマクロを実行。

当初、excelシートに配置された実行ボタンをクリックすることで、 マクロを実行しようとしましたが、appium や pywinauto で、ボタンを探索できなかった為、 excelマクロに対し、ショートカット実行(今回の場合、CTRL+I)を設定し、実行。

# -*- coding: utf-8 -*-
from appium import webdriver
from selenium.webdriver.common.keys import Keys
import pyautogui
import win32gui
import time

def main():
    ## appiumで、アプリ起動
    desired_caps = {}
    desired_caps["app"] = r"c:\Users\end0t\Downloads\ないしょ_DEV_MACRO.xlsm"

    driver = webdriver.Remote(
        command_executor='http://127.0.0.1:4723',
        desired_capabilities= desired_caps)

    ## win32guiで、対象のアプリを探索
    time.sleep(2)
    app_handle = win32gui.FindWindow(None, "ないしょ_DEV_MACRO.xlsm  \[保護ビュー\] - Excel")
    print("APP HANDLE 0:",app_handle)
    
    ## pyautoguiで、ショートカット(ALT→F→I→E)を送信し、保護ビューを解除
    if app_handle > 0 :
        pyautogui.press('alt')
        time.sleep(1)
        pyautogui.press('F')
        time.sleep(1)
        pyautogui.press('I')
        time.sleep(1)
        pyautogui.press('E')

    time.sleep(2)

    ## pyautoguiで、ショートカット(CTRL+I)を送信し、マクロ実行
    ## (CTRL+Iのショートカットは、EXCEL上でALT+F8により設定画面表示)
    app_handle = win32gui.FindWindow(None, "最適テリトリー_DEV_MACRO.xlsm - Excel")
    print("APP HANDLE 1:",app_handle)

    if app_handle > 0 :
        pyautogui.hotkey('ctrl','i')


    ## とあるセルに値を入力
    ## (CTRL+Iのショートカットは、EXCEL上でALT+F8により設定画面表示)
    xpath_str = \
        "".join(["/Pane[@Name=\"デスクトップ 1\"][@ClassName=\"#32769\"]",
                 "/Window[@Name=\"ないしょ_DEV_MACRO.xlsm - Excel\"][@ClassName=\"XLMAIN\"]",
                 "/Pane[@ClassName=\"XLDESK\"]",
                 "/Tab[@Name=\"ないしょ_DEV_MACRO.xlsm\"][@ClassName=\"EXCEL7\"]",
                 "/TabItem[@Name=\"シート 数_旬別\"]",
                 "/DataGrid[@Name=\"グリッド\"]/DataItem[@Name=\"B1\"]"])
    try:
        xls_cell = driver.find_element_by_xpath(xpath_str)
        xls_cell.click()
        xls_cell.send_keys("HOGE FOO")
        time.sleep(5)
    except Exception as e:
        pass  ## version check画面が単に見つからない場合、無視して進みます

        
    ## 終了
    driver.quit()


if __name__ == '__main__':
    main()

マクロ設定画面は、ALT + F8 で起動。

参考

f:id:end0tknr:20190503054505p:plain