13
4

More than 3 years have passed since last update.

【UiPath】Excel - 右下最終セルを求める

Posted at

はじめに

この投稿は、RPAツール「UiPath」でExcelの最終列/最終行を取得する方法についての記事です。

この記事は、UiPath Friends もくもく会 2021年5月開催 2021-05-22(土)08:45 - 12:00 で書きました。

幾つかある方法

VBAだと、

 VBAで良くある例
  最終行:Cells(1, 1).End(xlDown)」      '// 下に移動する
  最終列:Cells(1, 1).End(xlToRight).Column  '// 右に移動する

のように「指定位置から下または右へ移動」して取得するのが王道ですが、UiPathでは、方法が取得方法が幾つかあります。

1)範囲を読み込みアクティビティの行数列数から求める

「範囲を読み込み(ReadRange)」アクティビティでシート全体を読み取り、データテーブルの行数(rows.Count)または列数(columns.Count)から最終列・最終行を計算します。UiPathのフローだと以下のような感じです。

image.png

列名は計算式で列数から求められます。
ただし、この方法は以下のような「表位置が左上では無い」場合は「ズレてしまう」ので、そのまま取得できません。
(先頭行が列名ではない。先頭列が空白になっている)

image.png

以下に確認しやすいように、以下にxaml形式でアップしました。

2)コードを呼び出し (Invoke Code) アクティビティで実行

VBAで良くある例の

 VBAで良くある例
  最終行:Cells(1, 1).End(xlDown)」      '// 下に移動する
  最終列:Cells(1, 1).End(xlToRight).Column  '// 右に移動する

をUiPathで実施します。「VBA を呼び出し (Invoke VBA)」アクティビィティでも良いのですが、ここでは「コードを呼び出し (Invoke Code) アクティビティ」で VB.NET で記載します。

'// 起点から右下セルを取得する
'//   入力引数 - firstPosition : 起点となる開始セル(例:B2)
'//   出力引数 - lastPosition  : 結果セル(例:E2)
Dim ap As New Microsoft.Office.Interop.Excel.Application
Dim wb As Microsoft.Office.Interop.Excel.Workbook
Dim firstCell, lastColCell, lastRowCell As Microsoft.Office.Interop.Excel.Range
Try
    wb = ap.Workbooks.Open(bookPath)
    For sidx As Integer = 1 To wb.Sheets.Count
        Dim ws As Microsoft.Office.Interop.Excel.Worksheet =  CType(wb.Sheets(sidx), Microsoft.Office.Interop.Excel.Worksheet)
        If ws.Name = sheetName Then
            firstCell = CType(ws.Range(firstPosition), Microsoft.Office.Interop.Excel.Range)
            lastColCell = firstCell.End(Microsoft.Office.Interop.Excel.XlDirection.xlToRight)'// 右移動
            lastRowCell = lastColCell.End(Microsoft.Office.Interop.Excel.XlDirection.xlDown) '// 下移動
            lastPosition = lastRowCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
            Exit For
        End If
    Next
    wb.Close
Catch ex As Exception
    Console.writeLine(ex.ToString)
    Throw(ex)
Finally
    If Not(wb Is Nothing) Then wb = Nothing
    ap = Nothing
End Try

以下に確認しやすいように、以下にxaml形式でアップしました。

その他

他に「画面操作で位置取得する方法」もありますが、ホットキーを押下 (Send Hotkey) を伴うため操作の邪魔が入ると取得できないことがあります。

また、画面操作せずに「範囲を読み込み(ReadRange)」アクティビティを駆使して実施する方法もありますが、ココでは割愛します。(時間が出来たら書きます)

終わりに

いかがでしたでしょうか。表取得で困った時に、方法の一つとして役立てば幸いです。

この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4