はじめに
マイクロソフトが今年3月から、RPAツール「Power Automate Desktop」(以下PAD)の無償提供をWindows10ユーザ向けに始めました。一部の機能制限はあるものの、「トライアル期間は無料」ではなく無料で継続的に利用可能という価格破壊プランです。今まで「便利そうだけど、予算を確保して導入したあげく十分に活用できなかったら…」とRPA導入に躊躇していた方にとっては朗報ではないでしょうか。
PADはRPAツールですから、ブラウザを操作して社内のWebアプリケーションを操作したり、加工したファイルを添付したメールを送信したりと、様々な操作が可能です。もちろん、Excelブックの加工も可能です。
用意されているExcel関連アクションは少ない
しかしここに一つ問題があります。PADで用意されているExcel関連アクションは下記の24個しかないのです。これでは、ごく簡単な処理しかできません。「Excelマクロの実行」アクションを用いて、VBAで処理を記述しておいたExcelブックを呼び出すという方法もありますが、一連の処理の記述箇所がPADのフローとExcelブックに分断されてしまいます。
- Excelマクロの実行
- Excelワークシートに列を挿入
- アクティブなExcelワークシートの取得
- Excelワークシートから列を削除
- すべてのExcelワークシートの取得
- Excelワークシートから列における最初の空の行を取得
- Excelワークシートを削除
- Excelの起動
- Excelワークシートの名前を変更
- 実行中のExcelに添付
- Excelワークシート内のセルをアクティブ化
- Excelワークシートから読み取り
- Excelワークシート内のセルを選択
- Excelの保存
- 選択したセル範囲をExcelワークシートから取得
- Excelワークシートに書き込み
- Excelワークシートからセルをコピー
- Excelを閉じる
- Excelワークシートにセルを貼り付け
- アクティブな Excelワークシートの設定
- Excelワークシートに行を挿入
- 新しいワークシートの追加
- Excelワークシートから行を削除
- Excelワークシートから最初の空の列や行を取得
「VBScriptの実行」アクションで解決!
この問題、実は「VBScriptの実行」アクションを使えば解決です。VBScriptはVBAと同じく、VisualBasicを元にした言語ですので、VBAとほとんど一緒です。主な違いは下記のとおりです。
- 変数宣言する場合(宣言しなくても可)、型は指定できない。「Dim foo」はOKだが「Dim foo As Long」はエラーになる。
- For…NextステートメントやFor Each…Nextステートメントを記述する際、Nextの次にカウンタ変数を記述するとエラーになる。「Next i」のように書かず「Next」とだけ書く。
- 「Sub Macro1 ~ End Sub」で囲まず、中身の処理だけを記述する。
上記のようにVBScriptの文法等はVBAとほとんど同じですので、まずExcelのVBE(Visual Basic Editor)で開発したうえで、中身を「VBScriptの実行」アクションに貼り付ける、という方法が使えます。
実際に作ってみよう
それでは実際に、PADの中にVBScriptコードを記述してみましょう。Yahoo!ファイナンスから出来高ランキング上位50銘柄を取得し、所定のフォーマットに加工する、という処理を実行してみます。
まず、下記フローのアクション1~4で出来高ランキング表をExcel上に取得します。
取得したままの状態は下図のようになります。ここから、下記①~⑤の加工を行ってみましょう。
- 市場欄が「東証ETF」となっている行は灰色に塗る。
- 下図のA・E・H・J列は削除する。
- 銘柄名と出来高の列の列幅を調整する。
- 株価欄の表示形式は「#,##0.00」とする。
- 1行目に見出し行を挿入し、太字とする。
この加工を行うためのVBScriptコードは下記のとおりです。ご覧のとおりVBAとそっくりですが、処理対象ブックを指定するために1行目でGetObject関数を使用している点が、通常のVBAとは異なります。
GetObject関数の引数は「”%FileName%”」となっています。この%記号で囲まれた箇所には、PAD変数の変数名を記述します(本件の変数「FileName」はフロー中の3番目のアクションで設定したものです)。PADが「VBScriptの実行」アクションを実行する際は、まずスクリプト中の%~%の部分がPAD変数の値に置き換えられ、次にVBScriptコードが実行される、という流れになっています。この仕組みによって、PAD変数の値をVBScriptに引き渡すことができるのです。
下記の場合、%~%の箇所は文字列に置き換えられますので(PAD変数「FileName」が文字列型であるため)、%~%はダブルクォートで囲む必要があります(これを忘れるとVBScript側でエラーになります)。
Set wb = GetObject("%FileName%")
With wb.Worksheets(1)
For Each rw in .Range("A1").CurrentRegion.Rows
If rw.Cells(1, "C").Value = "東証ETF" Then
rw.Interior.Color = RGB(191, 191, 191) '灰色
End If
Next
.Columns("J").Delete '掲示板へのリンク
.Columns("H").Delete '株価の前日比
.Columns("E").Delete '取引値の時刻
.Columns("A").Delete '行番号
.Columns("C").AutoFit '銘柄名
.Columns("F").AutoFit '出来高
.Columns("D").NumberFormat = "#,##0.00" '株価
.Rows(1).Insert
With .Range("A1:F1")
.Value = Array("銘柄コード", "市場", "銘柄名", _
"株価", "前日比", "出来高")
.Characters.Font.Bold = True
End With
End With
VBScriptコードが完成したら、フローの最後に「VBScriptの実行」アクションを作成し、そのコード欄に貼り付ければOKです。コード欄の中で編集するのは不便なので、VBEやNotepad等のエディタで書いてから貼り付けるようにしたほうが効率的でしょう。
実行結果は下図のようになります。VBScriptコードで記述したとおりに整形されていますね。
VBScriptがエラーになったら
「VBScriptの実行」アクションの中に記述したVBScriptコードにバグがあっても、PAD自体はエラーメッセージを出してくれません。その代わり、「VBScriptの実行」アクションで生じたエラーをPAD変数で取得できるようになっています。PAD変数の名前はデフォルトでは「ScriptError」です(下図)。
試しに前記のVBScriptコードで、6行目の「End If」を「End」に変えたうえでフローを実行してみましょう。PADのフロー自体は何事もなく終了しますが、想定した加工処理は行われません。つまり「VBScriptの実行」アクションが機能しなかったということです。
ではPAD変数「ScriptError」に格納された値を見てみましょう。PAD画面の右側にある変数ペインで変数「ScriptError」をクリックして「表示」を選択すると、「[前略].tmp(6, 12) Microsoft VBScript コンパイル エラー: ‘If’ がありません。」という値が格納されているのが分かります。この「(6, 12) 」というのは6行目の12文字目(インデントに用いられたスペースを含む)のことで、ここに予期された「If」が無いというエラーであることが分かります。
VBScriptコードの戻り値を取得するには
さきほどPAD変数「ScriptError」を見た際、隣に「VBScriptOutput」というPAD変数があったのにお気づきの方もおられるかと思います。説明欄に「スクリプトの出力」と書かれているとおり、VBScriptコードの戻り値をPAD変数で取得することができるのです。具体的には、VBScriptコードの中で「WScript.Echo foo」のように記述すると、VBScript変数fooの値をPAD変数(デフォルトでは「VBScriptOutput」ですが、自由に変えられます)に格納できます。
では実際に試してみましょう。先ほど用いたコードに3行追加しました。市場が「東証ETF」となっている行を数えて、変数cntに格納しています。
Set wb = GetObject("%FileName%")
With wb.Worksheets(1)
cnt = 0
For Each rw in .Range("A1").CurrentRegion.Rows
If rw.Cells(1, "C").Value = "東証ETF" Then
rw.Interior.Color = RGB(191, 191, 191) '灰色
cnt = cnt + 1
End
Next
WScript.Echo cnt
【後略】
実行すると、下図のようにVBScript変数cntの値がPAD変数VBScriptOutputに返されています(テキスト値で返されるので、PADフローで数値として後続処理を行う場合は「テキストを数値に変換」アクションで数値化してください)。この「WScript.Echo ~」と前記の%~%表記を用いることで、VBScriptコードとPADフローとの間で値を受け渡せることがお分かり頂けたかと思います。
Power Automate Desktopの無償提供開始により、RPAツール活用の自由度は大きく広がりました。コトラでは自社内でも、Power Automate Desktopを含む様々なソリューションを活用して、業務の効率化を積極的に推進しています。
組織の業務効率化・DX化でお困りのことがございましたら、経験豊富な担当者がご相談に乗らせて頂きます。
お気軽にお寄せください!