この記事では、Power Automate Desktop(PAD)を使って、データの取得から送信までの自動化フローを構築する手順を解説します。最初は、同僚たちにシンプルなフローを試してもらい、そのフィードバックを元に改良を重ね、最終的にExcelの処理も加えました。
完成版のPADの動作動画
PADでやろうとしたこと(概略図)
フローのソースコード
🐶クリックしてフローコードを表示🐶
WebAutomation.LaunchEdge.LaunchEdge Url: `` WindowState: WebAutomation.BrowserWindowState.Maximized ClearCache: False ClearCookies: False WaitForPageToLoadTimeout: 60 Timeout: 60 BrowserInstance=> Browser
UIAutomation.Click.Click Element: appmask['Window \'ログイン - 職場 - Microsoft Edge\'']['Edit \'cssLoginTableTextBox\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
MouseAndKeyboard.SendKeys.FocusAndSendKeys TextToSend: `` DelayBetweenKeystrokes: 3 SendTextAsHardwareKeys: False
UIAutomation.Click.Click Element: appmask['Window \'ログイン - 職場 - \'']['Edit \'cssLoginTableTextBox\' 2'] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
MouseAndKeyboard.SendKeys.FocusAndSendKeys TextToSend: `` DelayBetweenKeystrokes: 3 SendTextAsHardwareKeys: False
UIAutomation.Click.Click Element: appmask['Window \'ログイン - 職場 - Microsoft Edge\'']['Button \'ログイン\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
UIAutomation.Click.Click Element: appmask['Window \' システム - 職場 - Microsoft Edge\'']['Button \'送信\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
UIAutomation.Click.Click Element: appmask['Window \' システム - 職場 - Microsoft Edge\'']['Hyperlink \'_日次/月次\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
UIAutomation.Click.Click Element: appmask['Window \' システム - 職場 - Microsoft Edge\'']['Button \'検索\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
WAIT 5
UIAutomation.Click.Click Element: appmask['Window \'システム - 職場 - Microsoft Edge\'']['Button \'CSV出力\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
WAIT 5
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''C:\\Users\\331824\\Downloads\\I_TenpoJisseki.csv''' Visible: True ReadOnly: False Instance=> ExcelInstance
Excel.SelectCellsFromExcel.SelectCells Instance: ExcelInstance StartColumn: $'''A''' StartRow: 1 EndColumn: $'''Z''' EndRow: 300
Excel.CopyCellsFromExcel.Copy Instance: ExcelInstance
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''C:\\Users\\\\Desktop\\店舗配信用\\店舗配信用.xlsm''' Visible: True ReadOnly: False Instance=> ExcelInstance2
Excel.PasteCellsToExcel.PasteAt Instance: ExcelInstance2 Column: $'''A''' Row: 1
Excel.ResizeColumnsOrRows.AutofitAllColumns Instance: ExcelInstance2
Excel.ResizeColumnsOrRows.AutofitAllRows Instance: ExcelInstance2
Excel.RunMacro Instance: ExcelInstance2 Macro: $'''色の変更と行削除_枠追加_ウィンドウ固定_列も固定'''
Excel.SaveExcel.SaveAs Instance: ExcelInstance2 DocumentFormat: Excel.ExcelFormat.FromExtension DocumentPath: $'''C:\\Users\\331824\\Desktop\\店舗配信用\\東.xlsm'''
Excel.CloseExcel.Close Instance: ExcelInstance2
Outlook.Launch Instance=> OutlookInstance
Outlook.SendEmailThroughOutlook.SendEmail Instance: OutlookInstance Account: `` SendTo: `` Subject: $'''''' Body: $'''
''' IsBodyHtml: False IsDraft: False Attachments: $'''C:\\Users\\331824\\Desktop\\店舗配信用\\東.xlsm'''
Excel.CloseExcel.Close Instance: ExcelInstance
File.Move Files: $'''C:\\Users\\331824\\Downloads\\I_TenpoJisseki.csv''' Destination: $'''C:\\Users\\331824\\Desktop\\店舗配信用''' IfFileExists: File.IfExists.DoNothing MovedFiles=> MovedFiles
UIAutomation.Click.Click Element: appmask['Window \'システム - 職場 - Microsoft Edge\'']['Button \'ログアウト\''] ClickType: UIAutomation.ClickType.LeftClick MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter OffsetX: 0 OffsetY: 0
なぜPADを導入したのか
職場では「データ処理の時間短縮」が課題でした。そこで、Power Automate Desktop(PAD)を導入。社内PCに初期インストールされ、日本語対応も充実しているので手軽に使えます。
初めに複雑なフローを提示しましたが、同僚たちの興味は薄かったため、自動ログインやデータ保存などのシンプルなフローから試してもらい、徐々に改良を重ねました。
使用したツール
- Power Automate Desktop (PAD): 自動化フローを作成
- Excel: データ処理・編集のために使用
- Visual Basic for Applications (VBA) : Excelでマクロを使用して処理を自動化
基本フローの手順
最初は次の手順で基本フローを作成しました(この時点ではExcelでのデータ処理は含んでいません)。
- 自動ログイン: UI要素をクリックし、IDとパスワードを入力。
- データ保存: 指定したファイルのダウンロードと保存。
- メール送信: 保存されたファイルを自動でメール送信。
まずは自動でログイン!
UI要素をクリックで、任意のUIをクリックできるようになります。
自動でデータを取得!
UI要素をクリックで指定したファイルのダウンロードを開始します。
ダウンロードしたファイルを選択してみよう!
ダウンロードしたファイルをメールで送ろう!
ここまでフローを設定すると、自動でメールまで送ってくれるようになります。
最後に、ファイルがダウンロードフォルダに保存されたままなので、移動させます。
これで、データ取得からメール送信までが自動化されました。
職場で使ってみよう!
作成したPADフローを職場の仲間に試してもらいました。事前に以下のような説明を行いました。
その中でもPADに興味を示してくれた2名(上司と同僚)からフィードバックを頂きました。
上司と同僚の紹介
上司(統括リーダー 40歳 男)
- 関東ブロックを統括
- 資料作成やデータ処理に多くの時間を費やしている
- 店舗の巡回ができないのが課題
- PADについては知識があるが、使用は今回が初めて
同僚(複数店舗を巡回している薬剤師 35歳 男)
- 複数店舗を巡回
- デジタルツールに詳しくない
- 主な業務は店舗教育
- データ編集に時間がかかり、業務が滞ることがある
使ってもらった感想(フィードバック)
フィードバックを受ける際の質問内容
-
業務のどの部分で役立つと感じましたか?
-
完全自動化への抵抗感はありましたか?
-
他に改善できるポイントはありますか?
-
自分でもこのツールを使ってみたいと思いましたか?
フィードバック内容
上司(統括リーダー 40歳 男)
- 自動ログイン: ワンクリックで簡単にログインできることを評価
- 完全自動化: 完全自動化を推奨
- ファイルの見やすさ: 視覚的にデータを見やすくする改善点を提案
同僚(複数店舗を巡回している薬剤師 35歳 男)
- 教育的指導の懸念: 時間を割けないため、ファイルの見やすさを強調
- 自動化のメリット: 他の仕事をしながらの自動処理を評価
- フローの長さ: フローが長すぎることへの懸念を示す
フィードバックに基づく改善点
- 完全自動化: 最初は手動操作を含めて部分自動化していたが、フィードバックに基づき最終的に完全自動化に移行した。
- ファイルの見やすさ: ダウンロードしたファイルの自動加工機能を追加し、データを見やすく整理。
- フローの簡潔化: 操作が負担にならないように、フローを短くする工夫をした。
フィードバックを基にした改善
VBAを使ってデータを見やすくしよう!
ダウンロードしたファイルが見づらかったため、VBAで自動整形機能を追加しました。
ついでに、「ダイアログでのファイル選択」から、自動でファイルを選択するように設定します。
VBAマクロコードの例
以下は、必要なエリア部分を抽出し、特定店舗のセルに色を変更し、ウィンドウ枠を固定するVBAコードです。
🐶クリックしてVBAコードを表示🐶
```vba Sub 色の変更と行削除_枠追加_ウィンドウ固定_列も固定() Dim lastRow As Long Dim lastCol As Long Dim i As Long Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ' 実際のシート名に変更' 最終行と最終列を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' 末尾からループする(逆方向で行を削除)
' 1行目は消さないので、2行目以降をチェック
For i = lastRow To 2 Step -1
' A列のセルに「」が含まれていない場合、その行を削除
If InStr(ws.Cells(i, 1).Value, "") = 0 Then
ws.Rows(i).Delete
End If
Next i
' 最終行の再取得(行削除後に変更される可能性があるため)
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' 色の変更:B列に「」「」「」が含まれるセルの行の色を変更
' 1行目は消さないので、2行目以降をチェック
For i = 2 To lastRow
If InStr(ws.Cells(i, 2).Value, "") > 0 Or _
InStr(ws.Cells(i, 2).Value, "") > 0 Or _
InStr(ws.Cells(i, 2).Value, "") > 0 Or _
InStr(ws.Cells(i, 2).Value, "") > 0 Then
ws.Range("A" & i & ":R" & i).Interior.Color = RGB(255, 255, 0) ' 黄色に変更
End If
Next i
' 1行目に太枠を設定
ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol)).Borders.LineStyle = xlContinuous
ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol)).Borders.Weight = xlThick ' 太枠
' 2行目以降に普通の枠を設定
For i = 2 To lastRow
If Application.WorksheetFunction.CountA(ws.Rows(i)) > 0 Then ' データがある行だけ枠を適用
ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol)).Borders.LineStyle = xlContinuous
ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol)).Borders.Weight = xlThin ' 普通の太さ
End If
Next i
' 1行目とB列のウィンドウ枠の固定
ws.Cells(2, 3).Select ' B列と2行目を基準にしてウィンドウ枠を固定
ActiveWindow.FreezePanes = True
End Sub
結果として配信できるぐらいにはなりました。
以上で、冒頭の動画のように完全自動でメール配信まで行ってくれるようになります。
気を付けるポイント
-
ネットワークの不安定さ: データのダウンロード前後に待機時間を設け、ネットワークの安定を確保しましょう
-
マクロの連携: マクロ名を間違えるとフローが動作しません。正確に入力し、事前にテストを
-
メールの複数送信: 複数宛先には、「;」で区切ることが必要です
フィードバックを受けてみて感じたこと
デジタルに慣れていない人に複雑なフローを説明しても興味を持ってもらえないと感じました。最初は簡単なフローから始め、徐々に機能を拡張することで、チーム全体の業務効率を向上させることができました。小さな成功体験を提供することで、デジタルツールへの理解と信頼が深まりました。
まとめ
シンプルな自動化から始めることで、チームの効率化に一歩前進できたと思います。デジタルツールを活用する際には、徐々に慣れてもらうステップを踏むことが重要だと感じました。今後も継続的に改良を重ね、より効果的な業務フローを目指していきます。