変数について

PowerAutomateDesktopでの変数の基本的な話

PowerAutomateDesktopでは、変数が利用できます
変数には型の指定は存在しません
VBAのような型指定は行わずに、変数の名前のみ設定を行います

また、独自の仕様として変数名は自動的に作成されます
ほとんどの場合においてはこの変数名をそのまま利用する方がコードの可読性は上がりますので、そのまま利用して問題ありません
同じ名前があった場合は自動的に連番が付与されるので、変数名の重複は発生しません

フロー変数

変数の生成などについて

フロー変数とは、PowerAutomateDesktopで作成するフロー内でのみ有効な変数となります
他のフロー実行時には当然影響を与えないものです

このフロー変数は、フロー単位のためサブフローを作成していたとしてもそこは共通となりますのでそこに関しては注意が必要です

まずは実際の作成を行ってみます
返し値を持つアクションであれば、自動的に作成が行われます

作成された変数

今回は「マウスの位置を取得します」アクションを利用してみます
このアクションは実行された時点でどこにマウスカーソルがあるかを返すアクションです
返された値は変数に格納されます
VBAでいうようなアクションの中にアクションを入れて、返し値を計算等にそのまま利用するような作成は行えません
返し値は全て一旦変数に格納する必要があります

このアクションでは、マウスのXとYの位置を数値で返します
2つの値を返すので変数も自動的に作成されるものが「MousePosX」「MousePosY」が作成されます
画像の右側に作成されていることが確認できます
変数の名前からも容易に用途が分かるようになっています

変数名の設定画面

アクションの設定画面の一番下に変数の設定があります
「生成された変数」を開くと、各変数の詳細が確認できます
ここできちんと変数の解説がされているので、改めて変数に入るものがなんなのか確認しやすくなっています

設定を変更した状態

変数の名称の箇所をクリックすると変数の名称を変更可能です
また返し値が不要な場合は無駄な変数が作成されて一覧が煩雑になるので
変数の生成を抑止できます
その場合は、トグルボタンを切り替えることでグレーアウトして作成がされなくなります

変数の変更を保存した状態

画像の様に設定変更を行うことで、フロー変数が任意の状態に設定されていることが確認できます
このようにして、変数の自動作成には対応を行っていきます

処理実行した後の状態

この変数一覧は内容の確認も行えます
実際に処理を実行してみると、変数に格納された値が表示されます
デバッグ時などに確認します

また、下部にある消しゴムボタンをクリックすると全ての変数を一括してクリアできます

簡易設定

パスワードなどデータが見えてしまうと困るようなものの場合は、マウスオーバーで表示される帽子とメガネマークをクリックすることで内容が表示されないようになるモードもあります

基本的にPowerAutomateDesktopは自分のための自分で作成した処理なので通常は気にしなくても良いですが、このサイトの様に説明を行う場合などには活用できます

活用メニュー

また右クリックでも表示されるメニューから「使用状況の検索」を実行すると
画像の下側にあるような変数が使用されているアクションの一覧が表示されます

何らかの理由で変数を置き換えたり、削除したりする場合には事前に漏れなく確認を行うことが可能です

変数の指定について

変数を生成したら、それを各アクションで使用します

生成された変数を指定する場合のボタンの場所についての画像
変数の指定ボタン

生成した変数を指定するには、アクションの設定ボックスの右側に「{x}」というボタンがあり、それをクリックすることで変数リストが表示されるので
そこから指定することで設定ボックスに入力されます
画像の通り、変数は「%変数名%」の形式で表されます
この%で囲んだ中身が変数として認識されるので、ファイルのパスなどで変数以外のものを指定したい場合はこの%の外側に指定することで設定できます
この場合は特に文字列であることを明記する必要はありません
Automateは基本的に変数は自動判定をするからです

また、数値変数の場合に設定ボックス内で既定の計算をして指定をしたい場合がありますがその場合は以下の様に入力を行います

数値変数を指定する段階で計算する入力方法の画像
変数を計算して指定

画像の様に%の内側に計算式を記入します
こうすることで計算された結果が変数として出力されます
「%NewVar%+1」と%の外に計算式を記入した場合は「+1」は文字列と認識され計算が行われず、しかも数値変数であったものが文字列変数に変化してしまいます

変数を上記の形式でそれぞれ入力して実行した場合の出力結果の画像
計算を実行した状態

画像を確認してください
1行目で変数に「1」を設定しています、この変数は数値変数です
2行目では「%NewVar%+1」と指定しています
その結果は右側にある通り「1+1」という文字列になってしまって1+1の計算が行われていません
3行目では「%NewVar+1%」と指定しています
こうすることで変数内で計算が行われるため、1+1が計算されて結果「2」が出力されています
4~6行目はそれぞれ四則演算を行っていますが、すべて2行目同様に%の内側に入力を行っています

また、固定数値ではなく変数と変数を計算したい場合もあります
その場合も同じく%の内側に指定を行います

変数と変数を計算して出力する入力方法と出力結果の画像
変数と変数を計算して出力

画像では「NewVar5」の内容を変更しました
変数で変数を計算する場合には「%変数名 * 変数名%」という形で入力します
ここも「%変数名% * %変数名%」の様に計算式を%の外に出してしまうと文字列化してしまいます
画像の場合は「NewVar」は1、「NewVar3」は2なので「1*2」が計算されて2が出力されていることが分かります

ここが少し知っていないと出来なくて不便な点なので、しっかり押さえておいてください

入出力変数について

入出力変数とは、このフローの外部とやり取りをすることの出来る変数となります
いわゆる引数となります

前述していますが、あくまでも外部のフローとのやり取りに使用するものであり
メインフローとサブフロー間でやり取りするようなものではありません
つまり、単独で実行されるフローには一切作成の必要は無い変数になります
またフロー変数と違い自動的に作成されることはありません

まずは作成を行ってみます

作成ボタン

作成する画面は、画像の+ボタンをクリックすると入力か出力かの選択肢が表示されます
まずは入力を選択してください

入力変数の設定画面

入力変数では主に設定するのは変数名と既定値です

変数の種類とデータの種類についてはここでは変更できませんので初期値で問題ありません

「変数名」はこのフロー内で利用する際の名称です
「外部名」はこのフローを呼び出す際の設定画面に表示される名称です
ここは後述します

「既定値」はフローの呼び出しの際の未入力時のデータです
処理のエラーリスクを考慮すると、何らかの設定はある方が良いでしょう

「説明」は呼び出しの際の変数の説明に表示されます
変数名が紛らわしい場合は記載しても良いです

出力変数の設定画面

出力変数は設定項目はほとんど必要ありません
格納されるデータによって型が決まるので、型指定も存在しないです

とにかく、外部から分かりやすい記載をしていれば大丈夫です

そして今回テスト処理としてはこのフローは引数に渡された数値に1.1を積算して返す、いわゆる消費税込み金額の計算処理とします
VBAでもよくある処理ですね

SET NewOutput TO NewInput * 1.1
作成するアクション

変数の設定をするアクションで計算を実行します
出力変数に入力変数から計算を行い格納しています

これで一旦フローを名前を付けて保存を行います
とりあえず名前は「消費税計算」とします

このフローは一旦閉じておいてください
※ここまでに作成したフローとは別のフローで作成を進めてください
次に新規でフローを作成して、以下のアクションを作成します

@@flowname: '消費税計算'
External.RunFlow FlowId: 'e5450efa-1d40-4c88-ab9e-73324cb03d41' @NewInput: 100 @NewOutput=> NewOutput
アクションの設定画面

外部フローを実行するには、「Desktopフローを実行」から行えます
「Desktopフロー」では環境にあるフローが自動的にリスト表示されます
なので先ほど作成して保存した「消費税計算」を選択します

選択すると、同期されて入力変数が反映されます
画像の通りで作成した「NewInput」が表示されます
この変数の右側にある情報ボタンにマウスオーバーさせると、説明に記載した文章が表示されます

テストのために、引数に渡す数値を「100」に設定します
設定が完了したら処理を実行してみましょう

計算結果

処理を実行すると、変数に計算値が格納されています
数値は引き渡した数値「100」に1.1の積算で「110.0」が返されています
小数点数値が表示されているので、変数の型が実数になっているようですね
元々「消費税計算」の引数ではString型でしたが、普通に数値計算出来るし
返し値は数値となっています

型の確認も出来ないので、結果をみて判断するしかないですが
実数か整数かはあまり影響は無いとは思いますがそれ自体はこのフローで処理を行えばよいだけですね

Excelで空白になるまでセル参照ループする

PowerAutomateDesktopでExcelのセルを参照していくループ処理

Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeRow=> FirstFreeRow
LOOP LoopIndex FROM 1 TO FirstFreeRow STEP 1
    Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: 1 StartRow: LoopIndex ReadAsText: False CellValue=> ExcelData
    IF IsEmpty(ExcelData) THEN
        EXIT LOOP
    END
    # ここにセル値(ExcelData)での処理内容を作成する
END

PowerAutomateDesktopで開いたExcelのアクティブシートの指定列のセルを1セルずつ参照していく処理になります
Excel表データの自動化の基本中の基本の処理になります

事前にExcelを開いて、シートのアクティブ状態は設定した状態で使用します

アクション解説

アクション作成時

処理の最初に、空白行数値を取得しています
この数値をループ処理の終了判定とします
ちなみにアクションとしては行と列の両方を取得出来るアクションですが
今回の処理に列数値は必要ないので除外しています

次にループ処理に入ります
上記で取得した数値まで1ずつ加算しながら処理を行います
ループ内ではExcelからループで加算している変数の行数値にあるデータを取得しています
この内容によってなんらかの処理をさらに作成を行っていく形となります
またループの終了条件としてセルが空白かどうかも追加しています
通常実行であればそれほど大きな時間はかからないかもしれませんが、必要ないなら終了してしまいます

この一連のアクションで設定すべき箇所はあまり多くありません
参照列と開始行の指定くらいです

それ以外の少しの改変で応用できる部分は1行ずつ処理するかどうかや空があっても最終行まで処理を行うかなどになります

指定列の変更について

列の設定画面

列の指定には、3行目の「Excelワークシートから読み取り」の設定を変更します
この設定項目のうちの先頭列が列指定になります

今回の処理では単一セルの値を取得しているので、先頭列という名称にはほぼ意味は無いので、指定列数値と置き換えて考えてください

ここは数値になるので、アルファベットでの指定は出来ません
A列なら1、C列なら3といった具合で指定を行います

今回のコードでは1となっているので、A列が指定されていることになります

行の設定について

行に関する設定

行の設定については2つの用途があります
設定は2行目の「Loop」の設定を行います

まず「開始値」ですがここの数値がセル参照の初期セルとなります
今回のコードでは1となっているのでA1から参照が始まる形になります
ですが、だいたい見出しがある場合があるかと思いますので
その場合には実データの行数値を指定する必要があります

処理対象

例えば、画像のような表データを参照したい場合は見出しが2行目で実データは3行目から始まっています
なので、開始値の数値を「3」に設定する必要があります

次に「増分」ですが、この数値を増加させることで1行ずつの処理では無く
1行飛ばして処理を行ったりすることが可能になります
表データの場合はあまり変更することはないかもしれませんが
複数行を1つのデータとして表が作成されているようなものの場合にはこの設定が必要となります

空白の場合の終了判定について

ループ処理を行う際に、途中に空白セルが存在する前提がある場合は
途中で処理が終了してしまうことになってしまいます
そんな場合は空白で終了する判定を無くす必要があります

ここは設定では無く、4~6行目のIF処理をそのまま削除すれば良いだけです

削除した状態

画像のような形になればOKです

この処理についてはインスタンス表示が無くても可能な処理なので
完全バックグラウンドで処理を実行することが出来ます

安心感のあるゴミ箱を空にする方法

PowerAutomateDesktopを活用して不要ファイルを一定期間復活可能な状態で削除する方法

/# F_Name_1=常に処理時に空にしたいフォルダの絶対パス
F_Name_2=OneDrive上に作成したゴミ箱フォルダの絶対パス#/
SET F_Name_1 TO $'''空にするフォルダの絶対パス'''
SET F_Name_2 TO $'''OneDriveのゴミ箱の絶対パス'''
BLOCK Get_Err
ON BLOCK ERROR all

END
    Folder.GetFiles Folder: F_Name_1 FileFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
    LOOP FOREACH CurrentItem IN Files
        File.Move Files: CurrentItem Destination: F_Name_2 IfFileExists: File.IfExists.Overwrite
    END
    Folder.GetSubfolders Folder: F_Name_1 FolderFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Subfolders=> Folders
    LOOP FOREACH CurrentItem IN Folders
        Folder.Move Folder: CurrentItem Destination: F_Name_2
    END
    Folder.Empty Folder: F_Name_2
END
ERROR => LastError
IF LastError <> $'''エラーはありません''' THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''PowerAutomateDesktop''' Message: $'''ファイル整理が失敗しました''' Icon: Display.Icon.ErrorIcon Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
END

フローの最初にある変数の修正をしてください

不要ファイルは毎日発生します
本当の意味での不要ファイルというものは存在せず、その内容自体は機密事項であったり個人情報があって他人に知られるのは困ってしまう情報が含まれたファイルがほとんどです

会社のセキュリティルールによっては定期的に不要ファイルの削除を行うようになっていることもあると思います

しかし、ゴミ箱に放り込んだファイルを完全に削除する操作は少し躊躇することが多々あります
なぜなら完全削除した後に、やっぱりあのファイル必要だった!とか再確認だけしたかった!とか一時的でも復活して欲しいことが懸念としてあるからです

これは結構ネックに感じてしまう部分です
かといって長期間ゴミ箱を空にせずにおくこともルール違反になってしまうし
ゴミ箱の自動削除設定で削除すると復元が大変です

要するにゴミ箱は常に空にしつつ、削除したファイルは一定期間は復元出来る状態にしておきたい、というすごくわがままな考えを抱くのが自分だけでしょうか!?
いえ、これがあるとめっちゃ出遅れてもう無くなってしまったと諦めていた人気商品がまだあった時の感動と同義です!
この記事の方法で、会社の情シスの人や上司にはちゃんと空になったゴミ箱をこれ見よがしに見せつけてください
後述の方法で、一定期間は復元可能なので毎日の削除作業も気楽なもんですよ!

OneDriveを活用する

結果から言いますと、OneDrive上で削除を行うという方法になります
OneDriveは削除されたデータは、通常アカウントでは30日・職場などのアカウント等の場合は93日(管理者で変更可能)の間は復元が可能な状態でゴミ箱に格納されます

ゴミ箱からは削除しておいて、こちらでバックアップを取っちゃおうというものです
OneDriveのクラウド上であれば必要な時に復元するのもデバイスを選ばず行うことが可能なのも今の時代にあっていて良いと思います

しかし、単純にExplorerでOneDriveのファイルを削除してもゴミ箱に行ってしまいますし、削除のためにいちいちWebアプリを起動するのも面倒です

そこでPowerAutomateDesktopを活用します
今回のフローでは同時に不要ファイルがたまりやすいダウンロードフォルダも空にするようなフローにしています

いや、ダウンロードフォルダは空にせんでええですよ
余計なことまでしないで下さいという人は下のコードだけで良くなります

Folder.Empty Folder: $'''OneDrive上に作成したゴミ箱フォルダの絶対パス'''

OneDriveの指定フォルダを空にするアクションです
ただこんだけになります

いや、やっぱりダウンロードフォルダも空にしたいねん、という人は引き続き記事確認を行ってください

フローの流れについて

変数設定アクション

フローの流れですが、途中に幾度か対象フォルダのパスが出てくるので最初に変数でダウンロードフォルダとゴミ箱フォルダの絶対パスを変数に取得します
これ以降は変数で対象フォルダの指定を行います

エラー処理

4行目からのエラー処理です

エラー処理終端

14行目までを包括する形に設定しています
これはファイルの移動や削除の処理がファイルの編集権限であったり、使用中による削除不可という状況が往々にして発生することを考慮して後続のエラーメッセージ用に設置しています

この4行目のアクションではエラーが発生した場合は処理を継続してかつ14行目から実行するようにしているため後続処理が実行されます

ちなみに処理的には移動できなかったとか、削除できなかったとか、フォルダパス構成が違っていたとかの原因についてはどうでも良いと考えます
単純に削除したつもりがされていなかった状況を回避できれば十分なので
後続でエラー内容の判定までは行っていません

ファイルの移動アクション

ダウンロードフォルダにあるファイルを全てゴミ箱フォルダに移動させます
ちなみにファイルとフォルダを同時に移動させるアクションが無いので、ファイルとフォルダをそれぞれで行う必要があります
まずはファイルの移動を行っています

フォルダの移動アクション

次にフォルダの移動も行います
中のデータはそのまま移動できるので再帰処理は不要です

ゴミ箱を空にするアクション

ここがゴミ箱フォルダを空にするアクションです
前述していますが、結局ここだけでもほぼ目的を達成できます

エラーメッセージアクション

ここまでのファイル操作でエラーが発生しているかどうかを判定して
発生していれば、15行目でエラー情報の取得を行います
その結果が「エラーではありません」になっていなければなんらかのエラーが発生していると判断が出来ます
その場合にのみメッセージを表示しています
処理の目的から完了のメッセージは不要と思います
欲しい場合はこの辺を修正してください

ゴミ箱は空っぽの状態でバックアップ体制取れるなんて、なんて素晴らしいの!
というお声にお応えしますが残念なことに、無償版では自動実行ができません
なのでAutomateDesktopを起動して、フローを手動実行する必要があります
はい、最後の最後に爆弾です
自動的に出来ひんのんか~いって声が聞こえてきそうです

PowerAutomateDesktopのフローのコピー方法について

Desktop無料版でのフローの共有方法について

本サイトでのコピーについて
PowerAutomateDesktopのコードコピーはバージョンの相違により
コードが貼り付けられない事や設定項目の追加によるエラー発生があります
コードの貼り付けが行えない場合はバージョンの確認を行ってください

PowerAutomateDesktopではフローの共有が有償版でないと行えません
そもそもデスクトップ環境というのは案外差があるので、あまりフローを汎用的に作成するというのは向いていないのですが、それでも汎用的なものやこのサイトで紹介するようなフローをコピペしたい場合があります

PowerAutomateDesktopは多少触ればわかると思いますが、アクションをコピーして複製することは普通に右クリックメニュー等から可能です

実はこのコピペしているのはアクションのそれではなく、内部コードをコピペしています、内部コードの結果が画面には分かりやすくフロー表示されているだけなんですね

Display.ShowMessageDialog.ShowMessage Title: $'''test''' Message: $'''テストメッセージ''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> TestValue
貼り付けしたアクション

上記のコードをコピーしてから、PowerAutomateDesktopのフロー範囲で貼り付けを行ってください
すると画像のアクションが作成されるはずです

このように実際のコピペにはコードが利用されているのが重要な点です
しかもこのコードは設定項目もしっかり反映されるので変数についても同じものがコピペすることが可能なので、自動作成ではない変数を利用していても問題ありません
UI要素などの利用しているものも同じくコピペされるので便利です

また今回は1アクションですが、まとめてコピペすることも可能です
この場合の文字数が凄まじいことになりますので本記事では割愛します

注意点としては、サブフローやそれをまたぐようにコピペは出来ない点です
サブフローを利用している場合は、コピペ先でも同名のサブフローを作成してフローごとにアクションをコピペする必要があります
とはいえ、ただのコピペなのでそれほどの作業量にはならないと思います

そして、このコードのコピペがチャット送信などで簡単に共有できますし
メモ帳に貼り付けてテキストファイルで送信してコピペしてもらうことも可能です

これは実は個人的な開発でも有用です
PowerAutomateDesktop自体結構重たいアプリなので、他のフローで作成した一部の汎用処理をコピペしたい場合にいちいち編集画面を起動しなくても
再利用したいフローをテキストファイルとして保管しておけば簡単に複製が可能です

Windows11で標準搭載となるPowerAutomateDesktopは今後さらに利用場面が増えるはずなので、無料版でのフローの共有方法は早い段階で習得しておきましょう

Excelのテーブルのデータ範囲を削除する

PowerAutomateDesktopでテーブル機能のデータ範囲のみを一括削除を行う方法

Excel.LaunchExcel.LaunchAndOpen Path: $'''対象ファイルの絶対パス''' Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance
Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow
IF FirstFreeRow > 2 THEN
    Variables.DecreaseVariable Value: FirstFreeColumn DecrementValue: 1 DecreasedValue=> FirstFreeColumn
    Variables.DecreaseVariable Value: FirstFreeRow DecrementValue: 2 DecreasedValue=> FirstFreeRow
    Excel.DeleteCells.DeleteCells Instance: ExcelInstance StartColumn: 1 StartRow: 3 EndColumn: FirstFreeColumn EndRow: FirstFreeRow ShiftCellsDirection: Excel.ShiftCellsDirection.Up
END
Excel.CloseExcel.CloseAndSave Instance: ExcelInstance

対象ファイルの絶対パスを修正してください

PowerAutomateDesktopにはテーブル範囲を取得するアクションはありません
通常のセル範囲と同じように取得を行う必要があります
しかし、テーブル機能は通常のセル範囲と同様に扱えないことが多くあります
そのひとつが削除操作になります

テーブル機能の範囲をうまく取得せずに削除を行おうとするとエラーとなります
削除前に少し手間をかける必要があります

実際のフロー

画像のようにフローを組むとテーブル機能のデータ範囲を削除することが可能となります
実際の削除に必要となる手順としては2~7行目のアクションになります
1・8行目はExcelの起動と終了なので割愛します

まず2行目はアクティブシートの行と列の最初の空白の位置を取得します
ここで注意したいのがデータの無い行列を取得する点です

VBAのLastCellのような使用済みの最終セルの外側になります
さらにAutomateではテーブル機能の判別が出来ないので、テーブルの外側に入力値があった場合はテーブル範囲を超えてしまうため、削除アクションでエラーとなります
あくまでもテーブル機能の範囲のみのシートに対して有効ということになります
ただテーブル範囲より上の行や左の列であれば、削除範囲の始点を変更すれば対応可能です

3行目はIF分岐になります
データ範囲が存在しなければエラーとなってしまうので、見出し範囲と同じ行数であれば処理は行いません

4行目・5行目では取得した最終列・行数値を1減らしています
これは前述のとおり、ここで取得されるのはデータの最終セルではなくその1つ外側になっているので削除対象範囲がそれぞれ1を引いた数値となります
これをしていないとテーブル機能の場合はエラーになってしまうので重要になってきます
ただのセル範囲であれば気にしなくて大丈夫です

6行目で実際に削除を行います
開始の行列に関しては決め打ちで問題ありません
終点については取得・計算した列・行数値を使用します
このアクションを行うことでテーブルのデータ範囲を一括で削除出来ます

ちなみに、テーブル機能には集計行というデータ範囲外の行を作成することが出来ます
画像と同じアクションではその集計行まで削除を行ってしまいます
集計行を作成している場合は、5行目の行数値の減算数値を1から2に変更することでうまくデータ範囲だけを指定することが出来るようになります

まだまだ思い通りの動きをさせようと思うと回りくどいフローになってしまうことが多いですが、最悪VBAを作成してそれを実行しても良いです
処理速度は圧倒的に早いですしね
ただ、今回のような処理であればインスタンス表示を無くせば完全バックグラウンド処理に出来るのでその点を考慮すると処理時間はVBAほど考慮しなくても良いですね

PowerAutomateDesktopをExcelVBAと連携

PowerAutomateDesktopとExcelの連携の有効利用について

Excel.RunMacro Instance: ExcelInstance Macro: $'''プロシージャ名;引数1;引数2'''

VBAを実行するアクション

PowerAutomateDesktopはExcelを操作するアクションが複数あります
これらはそのアクション名を見ればおおよそ操作方法については分かるとは思います
Automate自体は処理速度がそれほど早いものでは無いので、VBAで実行できることであればそちらで行う方が圧倒的に早く処理できます

しかし、記事にあるようにAutomateと連携させることで今までVBAだけでは少し難しい処理が可能となります
・ユーザーフォームの操作を自動化
・IE以外のWebブラウザでの処理化

これらの処理はVBA単体で行うことを考えるとかなりハードルの高いものです
ですが、Automateと連携させることで驚くほど簡単に実装出来ます

VBA処理をAutomateから実行

まずAutomateからVBA処理の実行の方法を確認しておきます
操作方法は難しくありませんが、VBA処理の呼び出しで最も最初に注意しておく必要があるのが引数に引き渡せるのが「テキスト型」のみになっている点です
これは処理をすでに作成している場合に引数を設定している場合は要注意です
まあ、あまりオブジェクト等の引き渡しをトリガーになる処理に入れたりは無いとは思いますが…
VBA側で工夫すればテキスト型に限定されていたとしても、だいたい何とかなるとは思いますのでここは仕様と割り切って対応が必要な部分です

Excelのインスタンスを作成するアクション

まずは処理の作成されたExcelブックを開く必要があります
「Excelの起動」アクションから簡単に実行できます

アクションの設定画面

「Excelの起動」は次のドキュメントを開くに設定します
「ドキュメントパス」は絶対パスでファイルを指定します
「読み取り専用として開く」はオンにします
もちろん処理の内容を保存する必要がある場合はオフのままにしておく必要があります
ただ通常のExcelの開く処理と違い、すでに開かれているブックを開こうとした場合に注意のメッセージが表示されずに読み取り専用で起動されます
読み取り専用で開くことを前提としておくことで処理の安定化を図れます

残りの項目は初期設定のままで問題ありません、インスタンスの表示に関しては処理次第で変更しても良いです

プロシージャ名と引数を指定して処理を実行するアクション

処理の実行には「Excelマクロの実行」アクションを利用します

実行する処理

まずこちらが今回実行する処理です
引数に指定された文字列をメッセージ表示する処理です
分かりやすくするために引数を2つ指定しています

アクションの設定画面

アクションの設定画面の1つ目のインスタンスは先ほどExcelを開くアクションで生成された変数を指定します

「マクロ」の設定ですが、「プロシージャ名;引数1;引数2;…」のような形式で全て文字列のまま入力を行います
最初にプロシージャ名を入力しますが、プロシージャ名のみだけの指定となっていますのでモジュールは指定の必要がありません
と、いうより実際にはプロジェクト内全てを参照しているので別のモジュールに同名のプロシージャがあった場合は下記画像のエラーが発生するので注意してください

同名プロシージャが存在しているとエラーになる

とはいえ、別のモジュールでVBA上はさほど問題にならないとはいえ同じ名前のプロシージャが存在するというのはちょっと考えモノですね
動けばええやんという考えの自分ですがさすがにそれは是正した方が良いと思います

少し脱線しましたが、プロシージャ名の後に「;」(半角セミコロン)で引数を区切って入力します、複数ある場合も同形式でそのまま入力していきます

ちなみに、Automate側で数値型の変数を指定したとしてもVBAは文字列として受け取っているので問題が無いので、「”」で囲んだりする必要はありません

実行時の状態

実際に実行してみると、ブックが起動してプロシージャが実行されます
メッセージも渡した文字列がしっかり受け取っていることが分かります

ちなみに、このアクションはVBA処理が終了するまでアクションが停止する点は注意が必要です
もし、Automateで複数の処理を連続実行させたい場合はメッセージ表示などの処理は無くしておいた方が良いですね

ブックを閉じるアクション

蛇足ですが、開いたブックを閉じるには「Excelを閉じる」アクションを実行します
設定項目も生成されたExcelインスタンスの変数を指定するだけですね
ここは実際に操作してみると難しい場面ではないと思います

ユーザーフォームの操作を自動化

ユーザーフォームの操作の自動化ですが、この処理はVBAでは実装はめちゃくちゃに難しいと思います
そもそもVBAにはマウス操作すら行うことが出来ませんし、入力にしてもSendKeysメソッドでシビアなタイミング管理で実行する必要があります

そもそもこのユーザーフォームの操作を自動化する場面自体がほぼ無いかもしれません
ただ入力内容が転記レベルの単調なものであったり、フォームの作成を行ったのが自分では無くさらにその処理の全貌があまり定かではない場合が考えられます

とはいえ、基本的にユーザーフォームの操作自体も全てVBAで処理作成されているわけですから上記の様に処理の全貌が分かっていれば何とかなるかもしれませんが
やはりクリックイベントやチェンジイベントなどで連鎖的に処理が行われるのはユーザーフォームでは当たり前に行われる処理です
それらを全て単純にCallステートメントで呼び出すだけで動くとも限りません

と、前置きが長くなりましたが要はVBAではユーザーフォームの操作を行うのが困難ということです
ですが、Automateでは通常のウィンドウ同様にユーザーフォームの各コントロールを操作が可能です

コントロールの追加

まずはユーザーフォームの操作したいコントロールを登録します
Automateのウィンドウ左にある「UI要素」ボタンをクリックして、表示された画面から「UI要素の追加」ボタンをクリックします

追加の画面

追跡セッションという画面が表示されて、ユーザーフォーム上にマウスを移動させると認識するコントロールに赤枠が表示されます
この赤枠の表示された状態でCtrl+左クリックをすることで、追跡セッション画面に登録されます(画像の状態)
登録出来たら完了ボタンをクリックします

コントロールが追加された状態

これでコントロールの登録が出来ました
同じ要領で必要なコントロールを追加してください
この作業自体は後でアクションの追加時点でも可能なので、ここで追加しなくても都度追加しても大丈夫です

数が少ないうちは気になりませんが、UI要素の数が多くなると管理が大変になりますので各要素の右クリックメニューから名前の変更が可能なので多くなりそうなときは活用してください

登録内容

今回は3つのコントロールを登録しました
閉じるボタンについては作成出来るコントロールではありませんが、ウィンドウ操作が可能なためこれも自動化の対象に出来ます

今回の作成する操作
・テキストボックスに「test」と入力する
・クリアボタンをクリックしてテキストボックスの内容を消去
・フォームの閉じるボタンをクリックしてフォームを閉じる
この3つの操作をAutomateで自動操作してみます

使用するアクション

使用するアクションは2つで、テキスト入力とボタンのクリックアクションです

作成したフロー

いずれのアクションも設定自体は全く複雑なものはありません
直感的に設定可能なのでここでは割愛します

1ではテキストボックスに入力する処理を実行
2ではクリアボタンを押しています、これでテキストボックス内容が消去されます
3では閉じるボタンを押しています、これでフォームが閉じられます

実際の動きに関しては静止画では分かりづらかったので動画を作成しました
動きの気になる人は確認してみてください

フォームの自動操作

この処理において注意の必要なのが、Automateの仕様ではウィンドウのUI操作はマウスの操作も含まれるため他の作業を行いながらの処理実行は出来ません
そもそも自動化なのでしょうがないですけど

IE以外のWebブラウザでの処理化

IEの警鐘が鳴らされてから久しいですが、全くアプリの停止はありませんが
やはりIEの表示が行われないサイトであったり、IE未対応のWebシステムの出現もあり可能であればVBAでの情報収集等のWeb操作もIE以外のアプリを使えるようになると良いです

主なアプリと言えば、GoogleChromeかIEの後継であるMicrosoftEdgeなどが代表的なものと思います

しかしこれらの操作をVBAから行うには「Selenium」の導入が必要となります
ただIE操作のコードともプロパティやメソッドに違いがあったりするので
Web上からのコピペでようやくIE操作が出来たのにChromeに移行するのも大変です

そんな時にAutomateが出番となるかもしれません
もちろんVBAで操作するほどの処理速度を実現するのは不可能ですし、VBAで操作するほど細かい操作はまだAutomateは対応できません
ただこの対応に関しては、今後増加していくことは容易に想像できます

さらに、先般訳あってChromeの使用が出来なくなったのでEdgeに振り替えを行う必要があったのですがAutomateはインスタンス関係のアクションを振り替えるだけで終了しました
このメンテナンス上の優位性はすごいと感じた次第です

今回はChromeを操作して、この部品庫サイトの記事一覧のリストをExcelに取得してみたいと思います
なんせこの部品庫サイトは更新いつしたか分からんもんね

処理の流れとしては、Chromeの起動から情報の取得・Excelの起動をしてVBAに情報を引き渡してVBA処理で入力して保存終了・Chromeを終了の流れで処理化してみましょう
ちなみに、今回の記事では細かい作成要領は割愛します

まずは先にVBA処理を作成しましょう
引数にはテキスト型しか指定出来ないことは解説済みです
そして今回Automateから引き渡すテキストデータは記事一覧が改行されたテキストデータです
それを踏まえて以下のような処理を作成しました

作成した処理

今回の処理に関してはテスト処理なので画像で紹介しています
VBA処理の流れは最初に前回入力値の消去を行っています、全てA列に入力しているのでA列の入力データを消去しています
次に入力用のセルを変数に取得しています
この辺の入力処理は色々想定できるのでなんでも良いです、配列で一括入力もしようと思えば出来ますが、今回は変数セルを更新していって入力を行っていく形にしました
さすがに記事数が数万になったりすることは無いですからね、これからの人生全てを捧げても無理でしょうね、それは♪

次に引数のテキストデータを1行ごとに分割して入力するループ処理です
ここに関してはAutomateからどんなデータが引き渡されるかも事前に知っておく必要はありますが、引き渡すデータは改行されて改行コードはCrLfになっています
なのでそれをSpiritで分割して処理します

次はAutomateのフローを作成します

Web操作の開始アクション

前述しましたが、AutomateではいくつかのWebアプリを操作可能です
現状は画像の4つのアプリですね
今回はChromeを利用したいと思います

各アプリの操作前に拡張機能のインストールが必要になります

拡張機能の設定メニュー

メインメニューの「ツール」⇒「ブラウザー拡張機能」⇒任意のWebアプリを選択するとそのアプリで拡張機能のインストール画面に移行しますのでインストールを実行してください
以降はそのまま操作が可能となります

作成したフロー

今回の作成フローはこんな感じです
1はChromeを起動しています
画像のものはテスト用なのですでに起動済みのものを取得していますが処理化であれば新しく起動で良いでしょう

2行目の「Webページ上の要素の詳細を取得します」アクションで記事一覧のリストを取得しています

リスト範囲の取得

UI要素を指定してその範囲のデータを取得しますので、UI要素を追加します
画像の様にsectionタグになっている範囲がそうなのでその辺にマウスを移動させると取得可能です

取得されたデータ

Automate上での取得データは画像のようなものになっています
表示された文字列を単純なテキストデータとして取得していますね
行数値にあるように改行されたテキストデータです

3~5のアクションではこの記事前半で解説しているExcelのマクロ実行を行っています、今回の場合はデータの更新が必要になるので読み取り専用では開いていませんし、閉じるアクションでは保存するようにしています
ただ、見える必要のない処理なのでExcelのインスタンス表示はしていません

この処理ではWebアプリの操作は要素の取得のみで、Excelもインスタンスの表示が必要ない点から、処理はバックグラウンド実行が可能です
他の作業を行いながら処理を実行できるという事ですね

Automateの自動化も工夫次第でバックグラウンド処理にすることが可能なので、より有効活用が出来ると思います

処理の動きを確認出来る動画を作成しましたので動きの気になる人は確認してみてください

部品庫サイトの記事一覧のリストをExcelに取得

動画の方は動きの確認用にフローを少し編集しています
3行目のアクションをExcelの起動ではなくすでに起動済みのExcelを取得するアクションに変更してブックの閉じるアクションは無効化しています

動画の最初と最後でExcelのA列にデータが入力されていることを確認してください

そして最後にとても大切なことを1つ
この記事の例を試すことにより、部品庫サイトに高アクセスでサーバー攻撃しないでね

パスワードを取得する汎用フロー

パスワードをExcelに保存してそれを取得するフローの作成とそのフローの外部フロー化として汎用性をあげる方法について

Excel.LaunchExcel.LaunchAndOpen Path: $'''対象ファイルの絶対パス''' Visible: False ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelInstance
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: 1 StartRow: 1 ReadAsText: True CellValue=> PasAc
Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: 1 StartRow: 2 ReadAsText: True CellValue=> PasP
Excel.CloseExcel.Close Instance: ExcelInstance

対象ファイルの絶対パスは修正してください

PowerAutomateDesktopでWebアプリやサービス等を自動化するフローは、だいたい最初に想定することかもしれません
そこで重要となってくるのがログインアカウントとパスワードの取得です
基本的にはテキスト入力のアクションのプロパティに設定しても良いのですが、パスワードが定期的に変更が必要だったり、強制的に数か月経過すると変更が必要となるものもあります

そんな時にいちいちAutomateのプロパティを編集するのも面倒です
しかも1つなら大して問題にはなりませんが、これが複数あった場合かつそれも複数のフローになっていた場合は非常に面倒です

そこで利用したいのがExcelです
Excelにアカウント名とパスワードを一覧として保存しておきます
そして必要なアカウント情報を取得しに行ってそれをAutomateに入力をしてもらいます

こうすることにより、Excelファイル1つで必要なアカウント情報を一元化できかつ編集も楽になります
またセルの位置さえ変動しなければ、フローへの影響もなく
関連するフロー全てに対して有効に出来ます

さらにこの記事中ではそのフローを別フローとして保存して実行することで、あらゆるフローから汎用的に利用できるようにしています

実際に作成してみる

パスワードファイルを開く

最初のアクション追加

最初のアクションはExcelファイルを開く操作になります
Excelファイルを直接開くには「Excelの起動」アクションから行えます
このアクションをダブルクリックします

Excelの起動アクションのプロパティ設定画面

プロパティ設定を上から順番に行います

まずは起動時の動作の「Excelの起動」ですが、ここは選択肢から「次のドキュメントを開く」を指定します
これで2つ目のドキュメントパスの指定が可能となりますので、パスワードファイルをダイアログから選択してください
これでフルパスの入力が行われます

基本的に目的に対してはこの2つの設定を行えば十分ですが、さらに以下の設定も行っておきます

「インスタンスを表示する」はオフにする
セルデータが欲しいだけなので表示する意味が無いからです
後述しますが場合によってはファイルのデータ閲覧を防ぎたい場合にも有効です

「読み取り専用として開く」はオンにする
これもインスタンスを表示しないのでどちらでも良いのですが、自動化処理の場合には編集しないならなるべくこの設定を行っている方が良いですね
自動処理というのはスケジュールやなんかでいつ発生するか分からないので、編集したいときに実行されてると迷惑です

詳細項目の「パスワード」はExcelの標準機能の読み取りパスワードの文字列です
これはこのファイルにあるデータはアカウント情報やパスワード情報という観点からファイル自体にパスワードを設定して、だれでも閲覧できるようにしたくない場合に設定して、フローで開く場合にはここでパスワードを指定することになります

前述にあるようにこの閲覧制限をしたいファイルを利用する場合はインスタンス表示(Excel表示)をしない方が良いですね

最後に保存ボタンをクリックしてアクションの作成完了です

セルの値を取得する

まずはファイルの中身を先に説明します

ファイルのデータ

このように特に見栄えは全く考慮する必要もなければ、A列にアカウント名、B列にパスワードとします
別のアカウント情報は改行して入力を行っていきます
ここは別にこれと同じでなくても、データがどこにあるか分かれば問題ないです
このデータをフローに取得してもらいます

そして取得アクションの前にもう1点設定を行っておきます
それは入出力用変数の設定です

前述しましたが、このフローは別のフローから外部呼出しを可能とすることを目的にしています
なので別のフローからどのアカウント情報が欲しいかを入力変数、取得した情報を出力変数として代入する必要があるためです

変数の設定画面

Automateの画面左側上部に変数のウィンドウがあります
もしこのウィンドウが表示されていない場合は、閉じる×ボタンのすぐ下の「{x}」というボタンをクリックすると表示されます
ちなみに{x}というのはAutomateでの変数の表現となります
他にも利用可能な場面で表示されています

そのウィンドウ上部の入出力変数の範囲から+ボタンをクリックしてさらに「入力」を選択します

入力変数の設定画面

変数の設定画面が表示されます
基本的に変更の必要も無いのですが、そのままで分かりにくい場合はそれぞれの項目を任意のものに設定を行います
ちなみに、データの種類は選んだら分かりますが数値型とかは無いのでテキストで問題ありません
そもそもAutomateではあまり変数の型は意識が必要ないです

また、選べる項目に機密テキストがありますが、これはこのフロー上でも確認が不可能になる暗号化されたものに利用します
これは別途アクションが必要になるのでまた別のお話とします

最後に作成ボタンをクリックして作成を完了させます

入力変数の作成時と同様の画面で今度は出力変数の作成を行います
これがフローで取得したアカウント名とパスワードを格納して返す変数です
ここではアカウント名とパスワードの2つの出力変数の作成を行ってください

まとめて取得してリストとして1つの変数で返すことは可能ですが
このフローの目的からするとまず間違いなく呼び出し元ではアクションがそれぞれ別のアクションで変数を利用します
連続したデータであるよりは、別々の変数の方が利用しやすいです

出力変数の作成

変数名と外部名を任意に指定して作成します
ちなみに、この変数名と外部名に関しては後でフロー呼び出しの解説で説明します

変数の作成完了した状態

画像の様に入出力変数が3つ作成された状態となれば、準備完了です

アクションの選択

実際のデータの取得アクションを作成します
アクションはExcelの起動の下にある「Excelワークシートから読み取り」を使用します
ダブルクリックすると設定画面が表示されます

アクションのプロパティ設定画面

Excelインスタンスと取得は初期上のままで問題ありません
もし違っていたら画像の様に設定してください

このアクションではアカウント名を取得したいので、先頭列は「1」を指定します

次の先頭行は先ほど作成した入力変数を指定します
変数を利用する場合は、入力ボックスの右側にある変数ボタンをクリックします
画像の様に変数の選択画面が表示されますので、そこから作成した入力変数を選択します

代入先の選択

次に詳細項目内の「セルの内容をテキストとして取得」を有効にします
しなくてもほぼ問題は無いとは思いますが、アカウント名とパスワードが数値であることは無いと思います

最後に生成された変数項目内で取得したデータの格納先を指定します
初期状態ではローカル変数になっているので、変数ボタンをクリックして出力変数を指定します

最後に保存ボタンをクリックして作成完了です

2つ目の取得アクション

同手順で2つ目のパスワードを取得するアクションを作成してください
設定は画像のような形で設定します
先頭列が「2」になっていることに注意してください

パスワードファイルを閉じる

取得が出来たらパスワードファイルは閉じます

閉じるアクションの選択画面

画像の「Excelを閉じる」を使用します
これをダブルクリックしてください

Excelを閉じるアクションのプロパティ設定画面

特に設定を変更する必要はありません
保存ボタンをクリックして作成してください

フローの全体

完成すると画像のような4ステップのフローが完成します
途中の読み取りアクションでは出力変数に代入しているので特に返し値を意識する必要はありません

完成したらフローを保存してください
このフローは入力変数である引数が必要になるので動作確認は別フローで行います

フローの動作確認

別のフローを新規に作成してください

別フローの実行アクションの選択画面

別のフローを実行するアクションはフローコントロール項目内の「Desktopフローを実行」を使用します
これをダブルクリックしてください

アクションのプロパティ設定画面

先ほど作成したフローをリストから選択します
ここでは「PasGet」を選択しています

設定完了状態

フローを選択すると自動的に同期されて、入力変数が作成されたフローであれば設定画面に自動的に表示されます
ここに任意のデータを入力します

また前述にて後ほど説明するといっていました、入出力変数の外部名ですが
ここに初期状態で表示された変数名がそれに一致する事になります
なので基本的にはどちらも同じものを利用している方が分かりやすいです

作成完了状態

アクションを作成すると画像の様に1ステップのアクションが作成され、フロー変数が自動的に作成されます

呼び出し元としてはこれだけで取得フローを実行して返し値を受け取る事ができます
これを実際に実行してみます

実行後の画面

こちらが実際に実行した後の画面です
フロー変数に指定した行のアカウント名とパスワード文字列が取得されていることが確認できます
入力変数には「2」を指定したので、Excel2行目の情報が取得されています

この様に外部フローとして汎用的に取得処理を作成することで、パスワードの変更等があった場合でもフローの修正が必要なくなります
行数を変更さえしなければですが…

サブフローよりもさらに強力に汎用性を上げることの出来る外部フローの呼び出しを有効に活用しましょう

PowerAutomate Desktopについて

PowerAutomateのDesktop版のインストールについて

ついに提供開始されました
最初に書いておきますが無償提供はあくまでも無償版という形での提供になっている点には注意が必要です

正直、Web版との連携が取れないのは致命的ですが、それでもローカルな作業であれば画期的な対応が出来るようになるはずです
何よりほんの半年で無償版の提供まで行っているくらいですから、この無償版をみんなが利用するようになれば更なる機能追加も期待大です

導入も簡単です、既にWeb版で解説している管理画面からダウンロードサイトへ移動可能です

メニュー画面

作成メニューを選択して、その中から「デスクトップフロー」を選択します

起動画面

起動画面が表示されます
ここから「アプリのダウンロード」を選択してください
インストールファイルがダウンロードされます
ダウンロードファイルから、PCにインストールしてください

アカウントログイン等の初期作業を行います
こちらの作業も複雑なものはなく数ヶ所設定すれば完了です

初期表示

新しいフローを作成するには画像のボタンをクリックして作成を始めます

フローの名前設定画面

フローの名前を設定する画面が最初に表示されます
ここで名前を付けなくても、後で編集可能なためとりあえず作成をしてみます

編集画面

開いてみて分かるのは、Web版とは全く違う作成画面であることです
こちらにもなれていく必要がありますが、やはりコードの記載は全く不要で日本語で記載された各項目も難解な解読を必要としません

最初に書いた通り、トリガーの設定はありません
処理アクションを追加していきます

細かいフローの作成手順などは別の記事で解説していきますが、ここでは無償で利用できる環境を整えれれば完了です
また、このサイトでは無償版の解説を行うこととし、有償版の解説については扱いませんのでご了承ください