BOOKFIELD's Knowledge Base

< All Topics
Print

【RPAノウハウ】UiPath|InvokeVBAでのExcelソート

UiPathでExcelのテーブルをソートするには、通常「テーブルの並び替え」アクティビティを使用します。「テーブルの並び替え」アクティビティでは、予めExcel側でテーブル名を設定しておく必要があります。

「テーブルの並び替え」アクティビティ

ところがExcelファイルの管理権限がない場合や、既に大量のファイルが存在していて、テーブル名を付ける作業が大変な場合などには困りものです。

こうした際には、「Invoke VBA」アクティビティを用いることでその機能を代替することができます。

「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のコードを書き換えなくてはならないので大変という声が聞こえてきそうですね。そんな時には、次のように引数も渡せますので、ご心配なく。

「Invoke 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アクティビティの使用を検討してみてはいかがでしょうか。

Table of Contents
MENU
PAGE TOP