コラム コラム:Basicスクリプト(VB)との連携

本記事では、AutoMateのBasicスクリプト(VB)の活用につきまして紹介させていただきます。
(本記事では、AutoMateタスクにおけるBasicスクリプト(VB)の活用について紹介いたします。
Basicスクリプトの構築・処理内容につきましては弊社のサポート範囲外となりますのでご了承下さい。)

評価式やCase文などをAutoMateのアクションとしてではなく、
VBで一行で書きたい、などといった要望をお持ちではないでしょうか。
その際は、「Basicスクリプト」アクションが非常に便利です。

このアクションの何よりもの特徴・メリットは、
AutoMateのアクションで定義した変数と値のやり取りが可能」な点です。

以下、例を提示します。
AutoMateの変数「var_Num」の値が、
・0以下の場合はAutoMateの変数「var_Result」に「D」を入れる
・1以上20以下の場合はAutoMateの変数「var_Result」に「C」を入れる
・21以上40以下の場合はAutoMateの変数「var_Result」に「B」を入れる
・それ以外の場合はAutoMateの変数「var_Result」に「A」を入れる
という処理があったとします。

その場合、AutoMateのCase文では「IS」構文が使用できないため、
IFアクションを重ねがけするか、Basic functionsの「If」を重ねがけする必要があり
ステップ数が増えて処理が見づらくなったり、関数が複雑になったりします。
変数Aの中身を変数Bの値に応じて変更するだけの処理に対して、ステップ数が大幅に増えることは
避けたいと考えられるユーザー様もいらっしゃるかと思います。

そこで、SELECTアクションを用いる代わりに、「Basicスクリプト - 実行」アクションで
下記のような処理を書くと、必要なステップ数が一つだけで済みます。
'-----------Basicスクリプトの内容1 ここから-----------
Sub Main()
'変数「var_Num」および「var_Result」はこのアクションよりも前に
'「変数 - 作成」アクションまたは「タスク変数」にて宣言されている必要がある
Select case var_Num

'0以下の場合 D
Case Is <= 0
var_Result = "D"
'1以上20以下の場合 C
Case 1 to 20
var_Result = "C"
'21以上40以下の場合 B
Case 21 to 40
var_Result = "B"
'それ以外(41以上)はA
Case else
var_Result = "A"
End Select
End Sub
'-----------Basicスクリプトの内容1 ここまで-----------

ユーザー様独自の処理(例:和暦への変換など)の処理をBasicスクリプトとして定義しておき
他の処理から渡されてきた変数を変換し結果用の変数に格納、その後対象の変数を後続処理に使用する等
処理の幅が大きく広がります。

なお、Excelに対する操作も、定義が可能です。
ただし、AutoMateのBasicスクリプトはExcel VBAとは異なるため、以下の制約があります。
1. BasicスクリプトアクションのたびにExcelを開閉する必要がある
2. Excelオブジェクトに対する操作であることを、明確に宣言しなければならない
3. Excel VBAの定数(xlDown等)は認識されずそのまま使用できないため、数値に置き換える必要がある
4. Excelのバージョンが変化すると動作しない可能性もある

以下の点に留意した上で、サンプルを提示します。
とあるExcelファイルの「Sheet1」のA1からC列の最終行までを
別のExcelファイルの「Sheet1」の同じセルに値をコピーするサンプルです。
変数「var_ExcelBookName」「var_ExcelBookName2」「MaxRow」は
AutoMateのアクションで先に宣言し、「var_ExcelBookName」「var_ExcelBookName2」には
それぞれのExcelファイルのフルパスが入っていることが前提となります。
'-----------Basicスクリプトの内容2 ここから-----------
Sub Main()

'Excel開く(表示状態で) 開くブックは変数値で変わる
set objExl1 = CreateObject("Excel.Application")
set objExl2 = CreateObject("Excel.Application")
objExl1.Workbooks.Open var_ExcelBookName
objExl2.Workbooks.Open var_ExcelBookName2
objExl1.Application.Visible = true
objExl2.Application.Visible = true

'Excel1のA列の最終行をA1から取る
'「xlDown」とするとExcelの定数が認識できずエラーになるので、イミディエイトで確認できる値を指定
'「-4121」は「xlDown」と等価
MaxRow = objExl1.Worksheets("Sheet1").Range("A1").End(-4121).Row
'コピー処理
objExl1.Worksheets("Sheet1").Range("A1:C" & MaxRow).Copy
'ペースト処理 値のみ 12 = xlPasteValuesAndNumberFormats
objExl2.Worksheets("Sheet1").Range("A1:C" & MaxRow).PasteSpecial Paste:=12
'コピー状態を解除
objExl1.CutCopyMode = False
'カーソルをA1に戻す
objExl2.Worksheets("Sheet1").Range("A1").select

'コピー元のExcelは保存せず終了
objExl1.DisplayAlerts = False
objExl1.Workbooks.Close
objExl1.DisplayAlerts = True
objExl1.Quit()

'コピー先のExcelは保存して終了
'ここが「Workbooks.Save」や「Workbook.Save」、「workbook.close savechanges:=」だとエラーになる
'「ActiveWorkbook.Save」で回避
objExl2.ActiveWorkbook.Save
objExl2.Workbooks.Close
objExl2.Quit()

End Sub
'-----------Basicスクリプトの内容2 ここまで-----------

このように、Excel VBAをAutoMateに持たせることが可能になり、
なおかつAutoMateのExcelアクションに含まれない処理(例:セルの背景塗りつぶし、罫線、条件付書式設定、ソート)等も
実装することが可能となります。
また、AutoMate側で実装する利点としては、操作対象のExcelファイルにマクロを内蔵する必要が無いため
毎回ユーザーにより作り直され、なおかつ名前が変化するファイルに対して
同じ処理を行う事が可能と成ります。

VBAと同様の処理を行いたい・ExcelマクロをRPAに乗せかえたいとお考えの方は、ぜひともご活用ください。
AutoMateで実装可能な処理の幅が大きく広がります。