RPAツールを買ってくれない・・・なら自作するか(泣)

最近、AIと並んで注目されているRPA(Robotic Process Automation)-
日本の働き方改革の切り札ともされ、導入企業が増加しています。

恐らくIT業界にいる人ならご存知でしょうが、念のためRPAについて簡単に説明すると。。。

RPAとは、現行業務をロボによって自動処理してくれる技術・製品のことです。
ロボと言っても、実際に物理的にASIMOみたいなロボットが業務を代行してくれるわけではなく、PC上で行っている基幹システムなどへのデータ入力作業などを自動化してくれるものを指します。

RPAを導入すれば、定型的なPC上の操作を記録して繰り返し自動実行できたり、EXCELの一覧に入力されている値を基幹システムへ自動登録したり、といったブラウザ操作やVBフォーム操作を含めた作業も自動化でき、作業工数を大幅に削減できます。

さらに、システム改修を伴わない上に現行業務の見直しも不要なため、ほぼ確実に改善が見込める優れモノと言えます。
RPA製品の使い方をある程度習得すれば、社内で新しく自動化定義を行うことも可能なため、ベンダーにその都度お金を取られる心配もありません。

あえて欠点を挙げるとすれば、、、
価格帯が50万円ぐらいとあまり高くない上に導入後はユーザー企業で内製できてしまうため、ベンダーからするとあまり儲からない分野らしいです。(汗)

大注目の分野な割に参入しているベンダーが少なめなのも、うなずけます。



スポンサーリンク


さて、当社業務においても、RPAによって確実にコスト削減が見込める業務は沢山あります。
なので、できれば下期の取り組みとしてRPAの導入を推進したいところなんですが―

糞ドケチなうちの経営者が、50万円もするものを買ってくれるわけがねぇ。(汗)
(相場的には安くても、うちの経営者からするとかなりの高額らしい)

なんたって、将来のコスト削減効果よりも、目の前の現金支出の方を重要視するお人柄ですから。
せっかく大幅な利益率アップがちょっと向こうに転がってるのに、目の前にぶら下がってるあんパンの方が大事らしい。

※詳しくはコチラ。
  「つるセコなコスト削減策① ~ 裏紙の使用 ~」
  「つるセコなコスト削減策② ~ 待機電力の節約 ~」
  「つるセコなコスト削減策③ ~ 備品購入に対する締め付け強化 ~」

かと言って、RPAのコスト削減効果をみすみす手放すというのも、これはこれで愚かな行為です。

というわけで、買ってくれないなら自作してみるか、という結論に達しました。

色々調べてみると、どうやらVBAからIEを直接操作できることが分かりました。
いや、もちろんこんなもん10年以上も前からあった技術なんですが、何せ私がまともにVBAを作り始めたのはうちの会社に入社してからの話なので。。。
先週までVBAでこんなこともできるなんて、露ほどにも存じ上げませんでした。(汗)
が、文法的にはdocument.getElementByID("xxxxx")のようにほぼJavaScriptライクなので、あまり抵抗もなく覚えることも少なくて済んだのは幸いでした。
後は、IEで基幹システムの各画面のオブジェクトを操作するために、IEで「ソースを表示」して画面ソースを解析すればOK。
(基幹システムを開発したベンダーには内緒です。。。)

で、先週1週間かけて、基幹システムへのあるデータ入力業務を実験的にVBAで自動化してみることにしました。

流れとしては、「IE起動」⇒「ログイン」⇒「ポータル画面からメインメニューに移動」の後・・・
「××修正画面を起動」⇒「番号検索サブ画面を起動」⇒「サブ画面で番号を入力して検索ボタン押下」⇒「表示された明細から1行目の選択ボタンを押下」⇒「親画面項目にEXCEL入力表の値を転記して更新ボタン押下」⇒「更新確認ポップアップでOKボタン押下」
をEXCEL入力表の行数分繰り返す感じです。

ここでハマったのは、
①サブ画面起動時に、サブ画面に制御をどうやって移すか
  (= サブ画面のオブジェクトをどうやって取得するのか)
②更新確認ポップアップの「OK」ボタンをどうやって押せばいいのか

の2点です。

特に②は解決に丸一日費やしました。。。(泣)

まぁ、分かってみれば大した話ではないんですが。。。
①サブ画面のウィンドウをFor~Eachで探索すればOK
②更新ボタンを押すときに、「更新ボタン.click」ではなく、setTimeoutで更新ボタンを押せばOK

そんなこんなで、自動化が実現できたときの感激と言ったらもう・・・(号泣)

うちの経営者がケチじゃなければこんな技術を身に付ける機会も無かったと思うと、ドケチも案外捨てたもんじゃないですね。(笑)
来週あたりに業務担当者にお披露目してみて、感想を聞いてみようと思います。



還元率の高いポイントサイトで、ハイペースでポイントが貯まります ポイントサイトのポイントインカム

獲得ポイントの高いアンケートサイトで、効率的にポイントが貯められます infoQ新規会員登録

自作RPAで丸二日ハマった(汗)

先日、RPAをExcelマクロで自作しようと思い立ってから、プロトタイプらしいものが出来上がりました。

で、そのプロトタイプを業務担当者に説明するためにデモしてみたところ、、、
「何だコレ!画面が勝手に動いてるじゃないですか!」
「すごい画期的ですね!」
「これ取り入れだしたら、今までの業務の在り方が崩壊するレベルですよ!根本的にやり方が変わりますね!」

という、プロトタイプの時点で大賛辞の雨あられ状態。

いやー、そんなに喜んでもらえると、こっちもやりがいがあるというもんです。

RPAツールに比べて開発に時間がかかるというデメリットはありますが、一方で、自作する方が自社の業務への適合率がより高まるというメリットがあります。
また、一連の操作を記録してそれをなぞるように実行することが基本のRPAツールに比べて、自作RPAの方が高速に画面操作が行えます。

さて、そんなイベントを経て実用化に向けて実装を進めているところですが、思わぬところで行き詰りました。

それはズバリ、「ファイル選択ボタンの操作」です。
具体的には、HTMLの「input type=file」ですね。

操作の流れとしては、こうです。

①A画面のファイル選択ボタンを押す
②ファイル選択ダイアログでファイルパスを入力
③A画面にファイルパスが貼りついた状態で、更新ボタンを押す


という、手動なら何の変哲もない操作なんですが。。。

ここで2つの問題にぶち当たりました。

1.ファイル選択ダイアログにどうやってファイルパスを入力するか

ファイル選択ダイアログは当然IEのオブジェクトではないので、ファイルパス入力用のテキストボックスにどうやってパスをセットするかで、ハマりました。

2.更新ボタンを押してもSubmitされない

上記のファイル選択問題が解決した後、いざ更新ボタンを押してみると、何も反応が無い・・・(汗)
(当然、手動で操作すれば普通にSubmitされます。)

スポンサーリンク


では、私が丸一日かけて編み出した解決策をご紹介します。
ま、編み出したとは言っても、ググった結果をかなり参考にしましたが。(笑)

1.ファイル選択ダイアログにどうやってファイルパスを入力するか

ファイル選択ダイアログを直接操作する方法は、残念ながら存在しません。
また、ファイル選択ダイアログを使わずに、テキストボックス部にファイルパスを直接セットすることもできません。
なので、ちょっと作りはいびつになりますが、下記の方法で対処。

①DataObjectを使って、予めファイルパスをクリップボードに入れておく
②参照ボタンを押して、ファイル選択ダイアログを起動
③ファイルパスの部分にフォーカスが当たっているので、SendKeys「Ctrl+V」で①のパスを貼り付ける
④SendKeys「ENTER」でファイル選択ダイアログの「開く」ボタンを押す

これで、テキストボックス部に無事ファイルパスを貼り付けることができます。


2.更新ボタンを押してもSubmitされない

原因は、ファイル選択ダイアログの「input type=file」のタグにて、onfocusとonblurでスクリプトが呼ばれていたためです。
なんせ基幹システムのパッケージの作りまでは詳細は分からないため、この原因を特定するだけで半日ほど費やしました。

当初、ファイル選択ダイアログの参照ボタンを押す際には、objIE.document.getElementById("sansyo").clickという感じのソースでボタンをクリックしていました。
が、これだと参照ボタンに対するonfocus・onblurイベントが働かず、その際に本来呼ばれるはずのスクリプトが実行されないということが分かりました。
残念ながら、そのスクリプト内でどのような処理が行われているかまでは解析不可能でしたが、ともかくonfocus・onblurを作動させながら参照ボタンを押すために、いくつかの方法を試行してみました。
(この事例はググっても全くヒットせず、我流でやるしかありませんでした・・・)

①Focusで参照ボタンにフォーカスを当ててからクリックしてみる

objIE.document.getElementById("sansyo").Focusで参照ボタンのオブジェクト"sansyo"にフォーカスを当ててから、clickしてみることにしました。
しかし、、、どうやら参照ボタンにはFocusを使ってもフォーカスが当たらないらしく、何も解決しませんでした。

②TAB遷移で参照ボタンにフォーカスを当ててからクリックしてみる

まず直前の項目にFocusでフォーカスを当て、そこからTABで参照ボタンにフォーカスを遷移させる方法を試してみたところ、見事に参照ボタンにフォーカスが当たりました。
が、喜んだのも束の間。
参照ボタンをclickしてファイルパスをセットし、いざ更新ボタンを押してみると・・・なんと事象変わらず。(死)
結果から考察すると、参照ボタンにフォーカスが当たっていようといまいと、clickでボタンを押す限りonfocus・onblurは判定されないと言えそうです。

③mouse_eventで参照ボタンを「マウスで押す」

最終的に行き着いたのがコレ。
フォーカスを当てるだの当てないだのはかなぐり捨てて、手動と全く同じようにマウスカーソルで参照ボタンを押してやろうという試みです。
ただ、参照ボタンの正確な座標を知る必要がある上、毎回同じ位置に参照ボタンが表示されるように工夫する必要があります。

なので、仕方なくこうやって対策しました。
(1)画面を左上端に強制的に移動させる(X座標=0、Y座標=0)
   参照ボタンが毎回同じ座標に表示されるようにするため。
(2)参照ボタンの座標にマウスカーソルを移動し、左クリックのイベントを実行する
   事前に(1)状態での参照ボタンの座標を特定しておくこと。

ミッションコンプリート!(号泣)
ハマった時間が長いだけに、達成感もひとしおです。

一応、IEオブジェクトのプロパティにはoffsetTop・offsetLeftなるものがあり、これでもオブジェクトのX座標・Y座標は取得できるらしい。
が、こいつらときたら、画面左上端からの絶対座標ではなく、「BODYタグからの相対座標」という殺意すら覚える糞仕様のため、こっちは使いませんでした。

BODYタグの位置ってどこよ?
分かり辛いわ、そんなもん。

ということで、最大の難関を乗り越え、何とか実用化への目途がつきました。
現場の反応や実装面での問題点などまた動きがあれば、ブログで紹介していきたいと思います。



還元率の高いポイントサイトで、ハイペースでポイントが貯まります ポイントサイトのポイントインカム

獲得ポイントの高いアンケートサイトで、効率的にポイントが貯められます infoQ新規会員登録

VBAからのIE操作で謎の現象発生

RPA自作プロジェクトの続報です。

先日デモをやってから業務部門より引き合いが来て、基幹システムに対するいくつかのデータ登録・更新業務を自動化することになりました。

それを受けて我がRPA自作プロジェクトも開発が急ピッチで進み(毎日定時アガリですけど)、数々の難関を乗り越え、ついに実用化段階に入りました。

そこで、業務部門への納品を翌日に控えたある日、基幹システムの本番環境にて動作検証を行ってみることにしました。
まぁ、HTMLも全て同一のテスト環境では問題なく動いてるんで、接続先URLが変わったところで何が起きるわけでもないんですが、念には念を入れとこうというレベルです。

さてさて、ではツールのボタンをポチっとな・・・・


・・・あれ?

全然動かないんだけど・・・(滝汗)

IEが起動して基幹システムのログイン画面までは表示されるんですが、ここからなぜか自動ログインが作動せずにエラーになる。。。


なになに、何なのコレ。
ツール壊れた?
じゃあテスト環境で試してみるか。。。うん、全く問題無い。

じゃあ改めて本番環境でポチっと・・・


やっぱり動かねぇや。(泣)


まさかの現象にしばし茫然自失-
しかし、業務部門に約束した納品日は翌日。
気を取り直して原因調査を開始しました。


スポンサーリンク


デバッグモードでエラー箇所を特定したところ、IEオブジェクトobjIEを操作するところでエラーになっていました。
(objIEは、標準モジュールでPublicとして定義)

Sub button_click()
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Navigate 【URL】
  objIE.Visible = True

  exexLogin 'ログイン用プロシージャ
  ・
  ・
  ・
End Sub

'ログイン用プロシージャ ※標準モジュール
Sub execLogin()
  objIE.document.forms(0).userID.value = userID  ← ここでエラー
  objIE.document.forms(0).password.value = pass
    ・
    ・
    ・
End Sub

エラー原因は、objIEがNothingになっているためです。
分からないのは、execLoginを呼び出すところまではちゃんとオブジェクトはセットされているのに、なぜかプロシージャの中に入るとNothingになってしまうという点。

色々試してみましたが、objIEをローカル変数にすることで対処できました。

Sub button_click()
  Dim objIE As Object
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Navigate 【URL】
  objIE.Visible = True

  exexLogin objIE 'ログイン用プロシージャ
    ・
    ・
    ・
End Sub

'ログイン用プロシージャ ※標準モジュール
Sub execLogin(objIE As Object)
  objIE.document.forms(0).userID.value = userID
  objIE.document.forms(0).password.value = pass
    ・
    ・
    ・
End Sub

objIEをローカル変数にしたので、各プロシージャ・ファンクションにも引数渡しするように修正。
こうして、無事納品期限には間に合いました。

しかし・・・これって、何なんですかね?
IE操作に関するVBAのバグなのか。
それともPublic変数の仕様なのか。

詳しい方がいらっしゃったら、是非ご教授下さい。



還元率の高いポイントサイトで、ハイペースでポイントが貯まります ポイントサイトのポイントインカム

獲得ポイントの高いアンケートサイトで、効率的にポイントが貯められます infoQ新規会員登録
プロフィール

Author:たみおと
36歳にして社内SEに転職しました。
ベンダーSE・社内SEどちらの方が記事を読んでも、ご参考になる体験談をUPしていきたいと思っていますので、宜しくお願い致します。

検索フォーム
ブログランキング
よろしければ、ポチっと一押しお願いします。m(__)m

ブログランキング・にほんブログ村へ
カテゴリ
よく読まれている記事
最新記事
おすすめ書籍
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

なぜ、システム開発は必ずモメるのか? [ 細川義洋 ]
価格:2160円(税込、送料無料) (2016/11/7時点)



[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

絵で見てわかる RPAの仕組み (絵で見てわかる) [ 西村 泰洋 ]
価格:2786円(税込、送料無料) (2018/7/30時点)



月別アーカイブ
リンク