エンタープライズ企業のための「次世代RPA」メディア

RPAとマクロ/VBAの違いは? ~Automation Anywhere Enterprise A2019と比較してみた

2020/11/06 コラム



 パソコン上で作業を自動化するツールであるRPAとマクロ/VBARPAの方が高価である一方、業務の適用範囲や必要とされるスキルレベルが低いため、一般の現場ユーザーにとってはハードルが低いとされるが、具体的な内容を知りたいという声を多く頂いた。

 そこでこの記事では、RPAツールであるAutomation Anywhere Enterprise A2019Excelマクロ/VBAを比較しながら、両者で同じことをやるのにどのような違いがあるのか具体的に比較してみることにした。RPAとマクロ/VBAの一般的な比較については、以下の記事を参照されたい。

 

RPAとマクロ/VBAの違いは?

Excelに記載された宛先にメールを出す

 まずやってみたいのが、Excelファイルに保持されているリストから情報を取りだすシナリオだ。このシナリオは様々な業務で使われる、とても汎用性が高いシナリオである。たとえば、Excelファイルの中に保持されている連絡先の一覧にメールで連絡をする業務をExcelマクロ/VBAAutomation Anywhere Enterprise A2019の両方で行ってみよう。この業務はExcelとメールの両方を使うというのが特徴である。

 

マクロ/VBAの場合: Excelから外部プログラムを起動するコマンドを実行する必要あり

 まずExcelマクロ/VBAの場合について、やり方を見てみよう。メール送信.xlsxを開いてみる。一覧の中で利用したいのは電子メールアドレスの一覧である。Excelマクロの画面の記録機能を活用することもできるのだが、生成したいコマンドがセル読み込み1つ分なので、記録機能は使わずにVBAによるコーディングを行うことになる。

 一覧から電子メールアドレスを抜き出すところは以下のようなループを手で書いていくことになる。ループの中では、一番左側のA列に値が入っている限り、D列のメールアドレス等を参照してSendmail関数に渡す。

Sub Start()
  Dim N As Integer

  N = 1
  Do While Range(“A”+CStr(1+N)).Value<>””
    Sendmail Range(“A” + CStr(1 + N)).Value,
             Range(“B” + CStr(1 + N)).Value,
             Range(“D” + CStr(1 + N)).Value
    N = N + 1
  Loop

End Sub

 そしてメール送信部分を作ることになるが、メールはOutlookで送ることになる。これは標準のVBAではできないため、専門的にはOutlookCOMオブジェクトとして外部呼出しする手続きを行う。VBAプロジェクトでMicrosoft Outlook Object Libraryへの外部参照設定を行った上でOutlookExcelから操作するコードを作っていく。この部分は標準ではないので、Outlook Object Libraryのライブラリの仕様を参照しながらコーディングしていくことになるため、少々高度なプログラミングとなる。

  Sub Sendmail(company As String, name As String, address As String)
  Dim outlookApp As Outlook.Application
  Dim mailItem As Outlook.mailItem

  Set outlookApp = CreateObject(“Outlook.Application”)
  Set mailItem = outlookApp.CreateItem(olMailItem)

  mailItem.To = address
  mailItem.CC = “”
  mailItem.BCC = “”
  mailItem.Subject = “テストメール”
  mailItem.Body = company + vbCrLf + name + “様”
                + vbCrLf + “こんにちは。お知らせです。”

  mailItem.Save
  mailItem.Send

  Set outlookApp = Nothing
  Set mailItem = Nothing

  Application.Wait Now() + TimeValue(“00:00:03”)
End Sub

 最後の行はクラウドメール等を使う場合1分間に30通以上送るとエラーにするなどの送信制限をかけている場合があるため、1分に20通未満しか送れないようにするためだ。また、Outlookはあらかじめ起動しておいた方が無難である。

 このコードでStart()を実行すると、Outlookからメールが送られる。しかし、コードを少し間違えると無限ループに陥ってしまったりうまく動かなかったりと、素早く作成するにはそれなりの技が必要になってくる。作成に要した時間は、デバッグも合わせて20分くらいだろうか。

 

Automation Anywhere Enterprise A2019の場合: 4ステップで完了

 次はAutomation Anywhereを使う場合だ。Automation AnywhereをはじめとするRPAは、Excelファイルの中に表形式のデータが入っている場合にそれを取り出す操作はマクロより簡単にできる部品が用意されていることが多い。Excelの高度な操作でメール送信.xlsxを開き、ループ処理を入れてExcelの高度な操作で1行ずつ表部分を読み込むオプションを選択、それをメール送信アクションで受ける、あとはウェイトをメール送信の後に入れる、といった4アクションのシンプルなつくりで完成する。ものの4分で作成を完了できる。

最新の株価を取得してExcelに転記する

 これもよくある業務だが、ウェブページ上の情報、たとえば現在の最新の株価や商品価格などの情報を毎日Excelファイルにダウンロードしてくるものだ。

 

マクロ/VBAの場合: Power Queryを使うとウェブの情報を簡単に取り込めることも

 ExcelでWebページから情報を持ってくる機能として、Power Queryというものがある。VBA/マクロではないが、この機能と組み合わせると、あらかじめ決まったページの決まった部分にある情報の更新であればある程度簡単にできる。しかし、Power Queryという普段はあまりなじみのないアドオンアプリケーションの動きについてよく理解しておく必要があるのと、Power Queryはビジュアルな要素指定が必ずしもできない、Webページ内で取得できる要素にかなり制限がある点 (HTMLテーブル形式で描画されている必要がある) は注意が必要だ。その代わり、うまく当てはまるシナリオであればノーコードでデータをExcelセル上に取得できる。 

 株価情報を特定のWebページのURLから取得したい場合、データタブの「Webから」データの取得と変換、をクリックする。

 取得したいURLを入れて先に進むと、そのWebページ上で取得できるデータ (HTMLのテーブル)の一覧が表示される。

 Webプレビューを見ることも可能だが、最近はInternet Explorerのセキュリティが厳しくなったり、サポート終了間近だったりするために、きちんと動作しない。この例では、一覧のテーブルの中に欲しいデータ (現在の株価情報386)がないために、データが取得可能な他のページを探してくる必要がある。現在の株価情報が表示されている部分はテーブルのようにも見えるのだが、この部分はHTMLのつくりで言うとテーブルではないために取ってくることができないのだ。

 別のURLで、近い数値を取ってこれるものがあったため、これをテーブルで取得することにする。テーブルを左側で選択後、「データの変換」ボタンを押す。

 すると、Power Queryにテーブルが読み込まれた。今回は特に形式を加工せずに取り込むため、そのまま「閉じて読み込む」ボタンを押す。

 すると、Excelシート上にテーブルが読み込まれた。

 「更新」ボタンを押すと最新の情報に更新される。この部分はVBA化することが可能だ。

Sub Start()
  Application.Workbooks(1).RefreshAll
End Sub

 作成に要した時間は、ページの試行錯誤も含めて10分くらいだろうか。

 

Automation Anywhere Enterprise A2019の場合: ウェブスクレイピングでどんな場合でも簡単

 Automation AnywhereをはじめとするRPAでは、Webスクレイピングで情報を持ってくることになる。これはとても簡単な操作で実現できる。データが表示されているページをブラウザであらかじめ表示しておき、「レコーダー」ボタンでレコーダーを起動、ブラウザのウィンドウを指定してレコーディングを開始、マウスカーソルを取得したいページ内のテキスト上に置いたときに表示される赤枠を頼りに、欲しい情報をクリックする。 

 その後レコーダーを終了させて、やりたいこと (今回は値の取得) をプロパティで最終調整する。取得したい部分やパーツによって難易度が多少異なるが、慣れれば簡単に取得可能だ。現在の株価を取得して表示させるフローチャートはたった2ステップで完了する。

 作成に要した時間は、デバッグも合わせて4分くらいだろうか。

 

Excelのフォームの内容をExcelの一覧表に転記する

 最後に、同じExcelの中で転記をすることを考える。あるフォルダーにあるExcelファイルをすべて開いて、その中の名前、会社名、連絡先の情報を一覧にする業務だ。一番最初のメール送信先リストを作成するわけである。

 

個別のアンケートフォーム (アンケート14.xlsx)

 

集計ファイル (集計.xlsx)

 

作業フォルダー

 

マクロ/VBAの場合:マクロの記録で転記は可能、フォルダー検索部分はVBAでコーディング

 まずExcelマクロ/VBAの場合について、やり方を見てみよう。Excelマクロの画面の記録機能を活用できる。アンケート1.xlsxと集計.xlsxを開いて、集計.xlsxのウィンドウで開発タブの「マクロの記録」をクリックしよう。マクロは作業中のブック (つまり集計.xlsx)に保存するようにする。

 

 アンケート1.xlsxのフィールドを集計.xlsxのリストにコピー&ペーストする操作を完了したら「記録の停止」をクリックし、Visual Basic Editorで標準モジュールを見てみよう。マクロがVBAの形で記録されているのがわかるだろう。ここまではコーディングの知識は不要である。

 

 アンケート2.xlsxやアンケート3.xlsxからもコピー&ペーストを実行するためには、このVBAコードを汎用化できるように書き換える必要がある。書き換える作業が必要になる。ここからはVBAおよびプログラミング知識が求められる。

 最終的には、以下のようなコードを作成する。赤字のところは元のコードから修正をしたところである。(マクロを保存するため、集計.xlsxは集計.xlsmというファイル名にする必要がある)

Sub Start()
  Dim foldername As String, filename As String, cnt As Integer
  cnt = 1
  foldername = “C:\My Folder\”
  filename = Dir(foldername + “*.xlsx”)
  Do While filename <> “”
    Workbooks.Open foldername + filename
    Macro1 filename, cnt
    cnt = cnt + 1
    filename = Dir()
  Loop
End Sub

Sub Macro1(filename As String, N As Integer)

‘ Macro1 Macro


  Windows(filename).Activate
  Range(“C5”).Select
  Selection.Copy
  Windows(“集計.xlsm“).Activate
  Range(“A” + CStr(1 + N)).Select
  ActiveSheet.Paste
  Windows(filename).Activate
  Range(“C6”).Select
  Application.CutCopyMode = False
  Selection.Copy
  Windows(“集計.xlsm“).Activate
  Range(“B” + CStr(1 + N)).Select
  ActiveSheet.Paste
  Windows(filename).Activate
  Range(“C7”).Select
  Application.CutCopyMode = False
  Selection.Copy
  Windows(“集計.xlsm“).Activate
  Range(“C” + CStr(1 + N)).Select
  ActiveSheet.Paste
  Windows(filename).Activate
  Range(“C8”).Select
  Application.CutCopyMode = False
  Selection.Copy
  Windows(“集計.xlsm“).Activate
  Range(“D” + CStr(1 + N)).Select
  ActiveSheet.Paste
End Sub

 

 このコードでStart()を実行すると、4つのアンケートファイルが起動し、集計.xlsmのリストに各項目のコピー&ペーストが行われる。しかし、コードを少し間違えると無限ループに陥ってしまったりうまく動かなかったりと、素早く作成するにはそれなりの技が必要になってくる。

 作成に要した時間は、デバッグも合わせて40分くらいだろうか。

 

Automation Anywhere Enterprise A2019の場合: コマンドのドラッグ&ドロップだけで同様のロジックを組み上げていく必要あり

 次はAutomation Anywhereを使う場合だ。実はAutomation Anywhereに限らず他のRPAソフトも含めてExcel業務で得意なシナリオは、最初に紹介した既にExcelの表に入っているデータを効率よく読み出す仕掛けだ。Excelの断片的なセルに記載されている情報を効率よく読み出す仕組みはない。しかも、Excelマクロのようにセルに入っているデータのレベルでの画面記録ができないため、先のVBAで作成したのと同様のロジックをドラッグ&ドロップでくみ上げていく必要がある。もしくはキーストロークの記録でくみ上げていく手法もあるが、ぱっと見て何をやっているのか分かりづらくメンテナンス性に欠けるのと、環境によってうまく動かない可能性があるのであまりお勧めできない。

 実際にロジックを組んでみると以下のようになる。フローチャート (ステップが多いのでリスト形式で表示) にはなっているが、組んでいる中身はプログラミングと同等である。変数のインクリメント、ファイルの列挙とファイル名の参照、型キャストなどいくつか難しい要素も登場する。RPAのファイル列挙の場合はVBADir関数の場合と違い、Excelファイルを開いているときに作成される、名前が”~$”で始まる隠しファイルもファイル列挙でヒットするので、これは除くようなロジックも組む必要がある。

 作成に要した時間は、デバッグも合わせて30分くらいだろうか。VBAより少し少ないか同程度かかることになる。

結論

 今まで見てきたように、すべての業務シナリオでVBA/マクロよりもRPAが優れているかというと、そういうわけでもない。たとえばExcelアプリの中で画面による記録をやろうとする場合は、Excelマクロの機能を使ったほうが良いのだ。また、RPAで提供されているExcel関係のコマンドは多いRPAソフトだと100種類くらい提供されているものもあるが、Excel VBAで提供されているオブジェクト/クラス/メソッドは数百種類以上にも及んでおり、小回りが利くことも含めてできることはExcel VBAの方が圧倒的に多い。

 RPAでコマンドが提供されているものについても、「ファイルを開く」「ファイルを閉じる」「セルに書き込む」など、VBA1メソッドがRPA1コマンドに対応しているだけのものは、結局RPAでも同じことをすることになるので作成難易度は下がらないことになる。そのため、実際にはExcel VBARPAの併用で自動化するのが現実解である場合も多い。Automation Anywhereのように、RPAからはExcelマクロを呼び出すコマンドが用意されていることが多い。

 RPAで用意されている典型的な業務シナリオにあてはまる自動化プロジェクトを非エンジニアの現場ユーザーで実施しようとする場合は、RPAも選択肢に入ってくるだろう。