LacotasuBlog

ポンコツ社内SEの備忘録

RPA WinActor

【備忘録】Excelで複数の列をソートする方法【WinActor】

投稿日:2021年12月17日 更新日:

前提条件と目標

↓ こういうExcelがあったとする。
複数の列で並び替えたい。

最初から用意されているこのノードをちょこっと修正した

このままだと一つの項目でしか並び替えできない。
複数の列で並び替えたい。

以下赤字が追加修正したコード(ソートしたい列が2つの例)

' ====指定されたファイルを開く====================================================

' ファイルのパスをフルパスに変換する
fname = !ファイル名!
SetUMSVariable "$FILE_PATH_TYPE", "1"
SetUmsVariable "$PARSE_FILE_PATH", fname
filePath = GetUmsVariable("$PARSE_FILE_PATH")

' workbookオブジェクトを取得する
Set workbook = Nothing
On Error Resume Next
' 既存のエクセルが起動されていれば警告を抑制する
Set existingXlsApp = Nothing
Set existingXlsApp = GetObject(, "Excel.Application")
existingXlsApp.DisplayAlerts = False

' 一先ずWorkbookオブジェクトをGetObjectしてみる
Set workbook = GetObject(filePath)
Set xlsApp = workbook.Parent

' GetObjectによって新規に開かれたWorkbookなら
' 変数にNothingを代入することで参照が0になるため
' 自動的に閉じられる。
Set workbook = Nothing

' Workbookがまだ存在するか確認する
For Each book In xlsApp.Workbooks
If UCase(book.FullName) = UCase(filePath) Then
' Workbookがまだ存在するので、このWorkbookは既に開かれていたもの
Set workbook = book
xlsApp.Visible = True
End If
Next

' Workbookが存在しない場合は、新たに開く。
If workbook Is Nothing Then
Set xlsApp = Nothing

' Excelが既に開かれていたならそれを再利用する
If Not existingXlsApp Is Nothing Then
  Set xlsApp = existingXlsApp
  xlsApp.Visible = True
Else
  Set xlsApp = CreateObject("Excel.Application")
  xlsApp.Visible = True
End If

Set workbook = xlsApp.Workbooks.Open(filePath)

End If

' 警告の抑制を元に戻す
existingXlsApp.DisplayAlerts = True
Set existingXlsApp = Nothing
On Error Goto 0

If workbook Is Nothing Then
Err.Raise 1, "", "指定されたファイルを開くことができません。"
End If

' ====指定されたシートを取得する==================================================

sheetName = !シート名!
Set worksheet = Nothing
On Error Resume Next
' シート名が指定されていない場合は、アクティブシートを対象とする
If sheetName = "" Then
Set worksheet = workbook.ActiveSheet
Else
Set worksheet = workbook.Worksheets(sheetName)
End If
On Error Goto 0

If worksheet Is Nothing Then
Err.Raise 1, "", "指定されたシートが見つかりません。"
End If

worksheet.Activate

' ====ハイライトを表示する========================================================

' HwndプロパティはExcel2002以降のみ対応
On Error Resume Next
ShowUMSHighlight(xlsApp.Hwnd)
On Error Goto 0

' ==============================================================

scell = !開始セル!
ecell = !終了セル!
cellAddress1 = !ソートキーのセル位置1!
cellAddress2 = !ソートキーのセル位置2!

orderStr1 = !並び替え順序1|昇順,降順!
orderStr2 = !並び替え順序2|昇順,降順!

headerStr = !1行目の扱い|見出しとしない,見出しとする,自動判別!
order1 = 1
order2 = 1

header = 2

If orderStr1 = "昇順" Then
order1 = 1
Else
order1 = 2
End If

If orderStr2 = "昇順" Then
order2 = 1
Else
order2 = 2
End If

If headerStr = "自動判別" Then
header = 0
ElseIf headerStr = "見出しとする" Then
header = 1
Else
header = 2
End If

Set cell1 = Nothing
Set cell2 = Nothing

On Error Resume Next
' R1C1形式にも対応する。
Set objRE = CreateObject("VBScript.RegExp")
objRE.IgnoreCase = True
objRE.Pattern = "^R(\d+)C(\d+)$"
Set matches1 = objRE.Execute(cellAddress1)
Set matches2 = objRE.Execute(cellAddress2)

If matches1.Count = 0 Then
Set cell1 = worksheet.Range(cellAddress1)
Else
Set cell1 = worksheet.Cells(matches(0).SubMatches(0) + 0, matches(0).SubMatches(1) + 0)
End If

If matches2.Count = 0 Then
Set cell2 = worksheet.Range(cellAddress2)
Else
Set cell2 = worksheet.Cells(matches(0).SubMatches(0) + 0, matches(0).SubMatches(1) + 0)
End If

On Error Goto 0

If cell1 Is Nothing Then
Err.Raise 1, "", "ソートキー1のセルが見つかりません。"
End If

If cell2 Is Nothing Then
Err.Raise 1, "", "ソートキー2のセルが見つかりません。"
End If

If UCase(scell) = UCase(ecell) Then
Err.Raise 1, "", "開始セルと終了セルで同じセルは指定できません。"
WScript.Quit()
End If

targetRange = scell&":"&ecell

'cell.select

If header = "" Then
worksheet.range(targetRange).Sort cell2,order2'※逆転させる
worksheet.range(targetRange).Sort cell1,order1'※逆転させる

Else
worksheet.range(targetRange).Sort cell2,order2,,,,,,header'※逆転させる
worksheet.range(targetRange).Sort cell1,order1,,,,,,header'※逆転させる

End If

Set objRE = Nothing
Set xlsApp = Nothing
Set worksheet = Nothing
Set workbook = Nothing

設定内容はこんな感じ

出荷数の昇順
商品コードの降順

▶で実行してみる

出荷数の昇順
商品コードの降順
でソートされました!

以上

-RPA, WinActor

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

[第27回]PADでキーボードの記号とかはどうやって入力すればいいんだよ問題について【キーの送信】

マイクロソフトが公表している有効なキーの一覧 https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-referen ...

Winactorのプチライブラリ「csvファイルをxls形式で保存」を使うとゼロ落ちしてしまう件、僕はもう無理矢理シナリオ作ったよ

前置き ↓こういうCSVがあったとして、エクセルで保存したい。 ↓一応、プチライブラリで、CSVファイルをExcelファイルで保存するライブラリが用意されている。 実際に使って見ようとすると・・・ 中 ...

[第15回]【PAD】Excelでピボットテーブルを実行する【デスクトップレコーダー】

今までは、レコーダーを使わずにやってきましたが、今回はレコーダーなしではさすがに面倒くさいのでデスクトップレコーダーを使っちゃいます。 とりあえず最終形はこうした ↓ 赤枠の部分はデスクトップレコーダ ...

WinActorってクリック、クリップボード、キーボード入力も出来るなら何でも出来るじゃないか?

例えば、ログイン画面があったとして①IDをクリックする②IDをコピーする③Ctrl+Vで張り付ける④パスワードをクリックする⑤パスワードをコピーする⑥Ctrl+Vで張り付ける⑦ログインボタンをクリック ...

no image

[第9回] 【PAD】自分で作ったフローを他人のパソコンで動かす方法【フロー共有】

無料版のPower Automate Desktopで自分で作ったフローを他人に渡したり、他人のロボットを自分で動かしたりできるのでしょうか?結論から言うと、 ある程度はコピーできる といった感じでし ...