BOOKFIELD's Knowledge Base
【RPAノウハウ】UiPath|InvokeVBAでのExcelソート
UiPathでExcelのテーブルをソートするには、通常「テーブルの並び替え」アクティビティを使用します。「テーブルの並び替え」アクティビティでは、予めExcel側でテーブル名を設定しておく必要があります。
ところがExcelファイルの管理権限がない場合や、既に大量のファイルが存在していて、テーブル名を付ける作業が大変な場合などには困りものです。
こうした際には、「Invoke VBA」アクティビティを用いることでその機能を代替することができます。
使い方は非常に簡単で、Invoke VBAアクティビティにVBAのコードを記述したファイル名とマクロ名を指定するだけです。ソートを行うためのVBAのコードは以下のようなものになります(マクロの記録で生成したコードを一部修正)。
Public Function Macro1()
'
' Macro1 Macro
'
'
Range("A1:C7").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("B2:B7") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:C7")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select
End Function
でも、これではシートを指定したりテーブルの範囲を変更したい場合にいちいちVBAのコードを書き換えなくてはならないので大変という声が聞こえてきそうですね。そんな時には、次のように引数も渡せますので、ご心配なく。
引数を扱えるように修正したVBAのコードは以下のようになります。
この例では[sheet2, 5, 2]という引数を引き渡していますが、それぞれ「nameSheet」「numCol」「keyCol」という変数名で受け取っています。
Public Function sort(ByVal nameSheet As String, ByVal numCol As Integer, ByVal keyCol As Integer)
Dim lastRow As Integer
lastRow = Worksheets(nameSheet).UsedRange.Row + Worksheets(nameSheet).UsedRange.Rows.Count - 1
Sheets(nameSheet).Select
Range(Cells(1, 1), Cells(lastRow, numCol)).Select
ActiveWorkbook.Worksheets(nameSheet).sort.SortFields.Clear
ActiveWorkbook.Worksheets(nameSheet).sort.SortFields.Add Key:=Range(Cells(2, keyCol), Cells(lastRow, keyCol)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(nameSheet).sort
.SetRange Range(Cells(1, 1), Cells(lastRow, numCol))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select
End function
データソートに限らず、UiPathのアクティビティでこなせない作業が出てきた際にはInvoke VBAアクティビティの使用を検討してみてはいかがでしょうか。