PowerQueryの接続メンテナンス

PowerQueryの接続時のパスに関してのメンテナンス方法と更新頻度設定について

PowerQueryでデータの取り込みを行う場合に、どうしても発生するのが接続のメンテナンスです
単純にリンクの更新が主になります
またcsvファイルを社内Webシステム等からダウンロードする場合は、ダウンロードの名称が毎回違っていたり、所定の位置に上書き保存をしたりする必要があります
ここに関してはショートカットをうまく使うか、PowerAutomateDesktopを活用する方法で良いでしょう

今回の記事では、リンク切れや別のcsvファイルへ参照を変更したい場合の操作について解説を行います
2種類の方法がありますので、やりやすい方法で行ってください

ソースの変更を利用

PowerQueryを開くボタンの画像
PowerQueryを開くボタン

まずはPowerQueryを開きます
取り込みデータのテーブル内にアクティブセルがある状態になれば、リボンにクエリタブが表示されます
その中の最左にある「編集」ボタンをクリックします

PowerQueryの編集画面の画像
PowerQuery編集画面

PowerQueryの編集画面が表示されたら、メニュー右側にある「データソース設定」を選択します

データソースの設定画面の画像
ソース設定画面

ブック内にある外部参照のリストが表示されます
ここで注意してほしいのが、編集中のソース以外にもここには表示されますので変更対象のソースであることを確認して、選択してから操作を進めてください
別の形式のファイルを指定してしまうと、ソースの取り込みステップにてエラーが発生します
エラー発生の場合は一度画面を変更を破棄して終了してください

変更対象を選択してから、画面下側にある「ソースの変更」を選択します

ファイル設定画面の画像
ファイル設定画面

対象ファイルの変更を行うには、ファイルパス項目の参照ボタンからファイル選択ダイアログにて変更を行います
もし、文字コードに変更があった場合はここで修正可能です
変更が完了すればOKボタンを選択します
これで対象ファイルを変更することができます

詳細エディターを利用

ファイルパスだけであれば、絶対パス文字列を直接修正する方法も可能です
※他項目も変更可能ですが、理解していないと面倒です

PowerQueryの編集画面の画像
PowerQuery編集画面

PowerQuery編集画面のメニュー左側にある「詳細エディター」を選択します

詳細エディター画面の画像
エディター画面

この詳細エディターというのは、取り込みから各ステップの全ての内部コードを直接編集することが出来る機能です
黄色にハイライトした箇所が、データの絶対パスになるのでここに対象ファイルの絶対パスを拡張子まで含めて入力を行います

他の箇所を見てみると分かるように、各設定値もここで修正は可能です
例えば「Columns=15」というのはデータから15列を取り出すという意味になるので、ここを13とかにすれば取り込む列数を変更出来ます
取り込んでから削除しても良いですが、最初に取り込む量を減らすことが出来るのでデータの更新速度向上につながります
ただあくまでも左から何列という指定なので、歯抜けにしたいとか5列目だけとかは指定は出来ません

上記2点のいずれかの方法で、リンク切れになった際は対応を行ってください

更新頻度の設定について

外部データとの更新頻度も任意に設定可能です
ただあまり頻度が多いと他の作業に影響がありますので適当に調整します
初期設定では、更新を能動的に行う必要があります

プロパティ設定を開くボタンの画像
プロパティ設定

更新を自動的に行う場合は、クエリタブの左側にある「プロパティ」を選択します

クエリプロパティを開いた状態の画像
クエリプロパティ画面

画像は初期状態の表示となっています

「バックグラウンドで更新する」
これは更新中もExcelの操作が可能となりますので、通常はオンにしておいて問題ありません
ただ、後述の自動更新を設定した場合にその更新が行われていることを明示的に使用者に分からせるにはあえてバックグラウンドで実行しない設定も可能です

「定期的に更新する」
データの更新を開いている間、一定時間ごとに更新を行います
例えばcsvファイルなどの更新頻度の低いものではなく、Web情報であったり、最新情報が欲しいExcelデータであった場合に活用できます
ただこの取り込んだデータをピボットテーブルなどで集計する場合、そちらまで自動更新されるわけでは無いので注意が必要です

「ファイルを開くときにデータを更新する」
ブックオープン時に更新を行います
データの取得が目的のファイルであれば有効にしておくと良いです
前回開いた時点のデータを確認した場面も多々あり得るので、基本はオフで問題は無いでしょう
サブオプションの「ブックを保存する前に外部データ範囲からデータを削除する」をオンにすることで取り込んだデータを保存しないのでファイルサイズの軽量化を行えます
あまりにも大きいデータの取得を行っている場合は有効です

「すべて更新でこの接続を更新する」

すべて更新ボタンの位置の画像
すべて更新ボタン

すべて更新というのは、データタブの真ん中くらいにある画像のボタンです
これをクリックすると、ブックに含まれるピボットテーブルや接続などの再更新を行います
このオプション設定は、これをクリックしたときに更新を有効とするかどうかの指定です
名前の通り、すべて更新したいときに使用するボタンなので、なるべくこの設定はオフにしない方が混乱はしないと思うのでそのままオンの設定で問題ありません

VBAの場合だと、エディター画面を開いて、プロシージャを探して、パスの箇所を見つけて修正、となるのでメンテナンス工数は圧倒的に違います
接続関係のVBAは無くなりますね、こりゃ

PowerQueryについて

Excel2016以降で利用可能なPowerqueryの活用について

Excelの基本機能にPowerQueryという機能があります
この機能は外部データ(内部も可能)をテーブルとして取り込む機能です
この機能では取り込みを行う際のフィルターや並べ替えなどを含め記録することができます
それを記録しておくことで、定期的に外部データを取り込む際に効率化を図ることができます

多くの場合の取り込みデータはcsvか別ブックのデータになると思います
この機能の制約としてはテーブルとして出力されるため、取り込み先も表形式のデータになっていることが重要になります
ある程度は操作によって調整することが可能ではありますが、同じルールで作成が続けられることが前提となります
この機能を有効的に利用するなら、取り込み元もきれいに整えておくことをおすすめします
ただしcsvであれば、データの形式はきれいにそろっているのでそこはあまり気にしなくても大丈夫です
別ブックのデータを取得する際に特に重要です

Powerqueryを開くために、csvファイルを取り込む手順の画像
PowerQueryを開くための操作

まずPowerQueryを利用するにはデータの取り込み作業が必要となります
その取り込みの際に利用するのが、PowerQueryです
上記の画像の手順ではcsvファイルを取り込む際の流れになっています

  • リボンメニューから「データ」タブを選択
  • 「データの取得」を選択
  • 「ファイルから」を選択
  • 「テキストまたはCSVから」を選択
    ⇒取り込みたいcsvファイルを選択してください

今回の記事では郵便番号一覧のCSVデータを利用しています
日本郵便株式会社 – 郵便番号データダウンロード

Powerqueryの前に表示される取り込みデータのプレビュー画面の画像
PowerQuery前の画面

ファイルを選択すると、そのデータから自動的にデータが表形式に作成されてプレビュー表示されます
この画面の右下にある「読み込み」ボタンをクリックすると、新しいシート・テーブルが作成されてそこにデータが読み込まれます

約12万5千レコードが読み込まれた状態になっていると思います
このようにcsvファイルの取り込みは格段に簡単になっています

さらにcsvファイルでよくあるのが文字コードの不一致による文字化けです

文字コードを変更した場合の動き

これに関しては、このプレビュー画面の左上にある「元のファイル」という選択ボックスから文字コードを指定することで簡単に変更が可能です
プレビュー表示もされているので、正しい文字コードも選んでいけば分かります

ただここまでではPowerQueryの活用ではありません
この取り込んだデータの加工を、取り込む時点で加工するのがPowerQueryの機能となります

郵便番号一覧のデータでは郵便番号の列は全て数値になっていることが分かると思いますが、これは数字では無く決まった文字数のコードなので、どちらかというと文字列で取得をする方がデータに即しています
そこでPowerQueryを利用して郵便番号列は文字列に型を変更することが可能です

Powerquery画面で型変換の手順画像
PowerQuery画面から型変換を行う
  • テーブル範囲にアクティブセルを置いた状態で表示される「クエリ」タブを選択
  • 「編集」を選択 - PowerQuery画面が表示される
  • 変換したい列の見出しの左側にある個所をクリックすると型変換が行える
  • 「テキスト」を選択
  • 「現在のものを置換」を選択
Powerqueryにおいて、列の型変換をして取得されたデータが変更された状態の画像
型変換後のデータ状態

上記の手順を行うと、こちらの画像の様にデータが文字列型に変換されます
数値となり除外されていた頭の0が付与されていることも確認できます
単純にExcelでcsvファイルを開いたときは、この0が無くなるのがよくある注意点でしたがPowerQueryで取り込みを行えば次回以降は意識する必要が無くなります

変換作業が完了したら再読み込みを行うためのボタンの画像
操作の確定を行うボタン

変換作業が完了したら、PowerQueryの画面の左上の「閉じて読み込む」の画像の箇所をクリックするとその設定で再度csvファイルのデータを読み込みます
この操作は記録されているので、次回以降はPowerQueryの画面を開く必要は無くデータの更新を行うだけでこの作業が実行されます

PowerQueryの注意点はファイルへのリンクは絶対パスを利用している点です
フォルダ構成やファイル名などが変更になった場合はリンク切れとなり、データの更新が出来なくなります
VBAのような相対パスの概念は無いので注意してください
ここは環境によっては少し不便かもしれませんが、パスの修正自体はそれほど難しくは無いので割り切っておいて大丈夫です
普通に数式で外部参照している場合も同様ですし、それらより圧倒的にメンテナンスしやすいです

型変換に関しては、他にもいろいろな型があるのでリストを確認しておいてください
それと同じくらい強力なのがフィルタ処理です
取り込んだ後に必要なデータにフィルタ機能を利用してフィルタをかける作業がある場合は、そのフィルタ条件も取り込みの時点で指定することが可能です
1列など、切り替えが多い場合は逆に必要ないかもしれませんが
複数列などで条件立てをする場合は強力です

Powerquery画面でフィルター設定を行う手順の画像
フィルター設定手順

フィルタの手順については、通常のフィルタ機能と大きな違いはありません
各列の見出しにある▼ボタンをクリックすることで、条件の設定が出来ます

フィルタ設定画面の画像
フィルタ設定画面

特殊条件として便利なのが、この「空の削除」です
これを指定した列にある空白のレコードは除外されます
例えばコードが無いデータは不要なので、その列でこの設定をすることで不要なデータの取り込みを行わないようにできます

注意点としては、このPowerQueryの画面では全てのデータが読み込まれていないので
フィルタの選択項目がデータの全てになっていない
可能性がある点です
また取り込み元のデータのリストも、この手順作成時点と同じであるかどうかも分からないのでなるべく条件設定は抽象的な方がメンテナンスは減らせます
上記の画像例では、市町村以下の列で「オオサカシ」が含まれたものを指定しています
こうすることでデータの取り込み量を減らすことが出来るのでファイルサイズを無駄に大きくせずに済みます
これはこの後に行う、関数や作業の際にファイルの動作に影響を与える部分なので
可能な限りこのPowerQueryでデータを減らすことをお勧めします

また、Microsoftの推奨としてPowerQueryのステップもレコードを減らすものをなるべく上位にすることがあります
ステップの順番は、作業を行った順番に登録されていきます
例えば、今回の記事解説順で行くと以下の順番になっています

  1. データの取り込み
  2. 郵便番号列の型をテキスト型に変更
  3. 市町村列で「オオサカシ」を含むものにフィルタ設定

この手順で言うと、レコードの数を減らすのは3の手順となります
このフィルタによって1,200レコードほどになりますので100分の1ほどになります
これを2の手順にすることで、型変換の処理を行うレコード数を減らすことで読み込み速度の向上が見込めます
ステップの順番はドラッグするだけで簡単に行えます

ステップの修正

またステップの文字にマウスを移動させると、左側に×ボタンが表示されます
これをクリックすることでステップの削除も行えます

ステップの移動については、移動先との矛盾に注意が必要です
例えば今回の記事で行くと、上記の手順2で文字列に変更しています
その変更を前提として、郵便番号列で「011」で始まるものなどでフィルタ設定を行った場合にフィルタを移動させるとエラーとなります
なぜなら、型変換前は数値型のため「011」という文字列でフィルタ設定を行うことが出来ないためです
この場合にはエラーがちゃんと表示されるので、その場合は諦めるかステップを修正します
修正する場合は、ステップの文字列をwクリックすれば設定画面が表示されます

最後にPowerQueryとは直接の関係はありませんが、この機能を最大限活用するためにテーブル機能も活用します
と、いうのもテーブル機能というのは自動的に行が拡張されていきますが、その際に数式の入力された列の場合はその数式も自動的に拡張された行に反映されることを活用できます

実はPowerQueryで自動作成されたテーブルの最左列に追加を行っても読み込みに影響を与えません
これを利用します

テーブルに列を追加した場合の画像
追加した列

このcsvファイルのデータ列数は15列となります
その左に住所の文字列を結合したセルを作成してみます
画像の様に単純に行の各列を&で結合しただけの関数です

テーブル機能のおかげでデータの取り込み数によって自動的に増減するので、関数の行数を調整する必要もありません
またデータの取り込みを完了した時点で関数の結果も計算されています

もし、これまでcsvファイルをテキストコピーして貼り付け-データの分割でデータを作成-フィルタ機能で条件抽出-関数を作成して行数分オートフィルする
というようなよくある手順を踏んでいた場合は、データの更新を行うだけ(ワンクリック)でこの作業が完了してしまいます

この様にPowerQueryとテーブル機能と関数の組み合わせで、データの取り込みから加工までを設定で行えるためVBAをこれのために組んでいるなら早々にこちらへの切り替えをおすすめします
VBAのメンテナンスより遥かに簡単ですから

カスタムフォームの表示を利用して、強調メッセージを表示する

新機能のカスタムフォームを利用して、より見やすいメッセージボックスを表示するフローです

@@statistics_TextBlock: '1'
@@statistics_Action_Submit: '1'
Display.ShowCustomDialog CardTemplateJson: '''{
  \"type\": \"AdaptiveCard\",
  \"version\": \"1.4\",
  \"id\": \"AdaptiveCard\",
  \"body\": [
    {
      \"type\": \"TextBlock\",
      \"id\": \"TextBox\",
      \"size\": \"extraLarge\",
      \"weight\": \"bolder\",
      \"text\": \"${TextBox_Text}\",
      \"wrap\": true
    }
  ],
  \"actions\": [
    {
      \"type\": \"Action.Submit\",
      \"id\": \"OK\",
      \"title\": \"${OK_Title}\",
      \"IsCancel\": false
    }
  ],
  \"verticalContentAlignment\": \"center\",
  \"FormTitle\": \"${AdaptiveCard_FormTitle}\"
}''' @AdaptiveCard_FormTitle: $'''PowerAutomate''' @TextBox_Text: $'''強調したい文字列をここに入力する''' @OK_Title: $'''OK'''

2022年3月1日時点では、プレビュー機能の解説となります。
今後の本機能化の際にはご注意ください

記事コードを貼り付けした時に作成されるアクションの表示状態
コードを貼り付けた時に作成されるアクション

画像の様に「(プレビュー)」の文字がある場合は、本記事と同環境です

フローの実行時に実際に表示されたメッセージボックスの画像
実行時に表示されるメッセージボックス

こちらの画像の様に、指定した文字列を強調して表示することが出来ます

通常のメッセージボックスの表示状態の画像
通常のメッセージボックス

こちらが通常のメッセージボックスで表示された状態です
実際の画面で比べてみると差が良く分かりますが
この状態でも文字列の見やすさがどちらが良いかは一目瞭然です

これは新しく追加された「カスタムフォーム」を利用しています
このカスタムフォームは既存のメッセージボックスでは実現できなかった、任意のオブジェクトを自由に配置することが可能となったメッセージボックスです
今回の場合は、このオブジェクトからテキスト表示を行うオブジェクトとOKボタンの2つのオブジェクトを設定しています

カスタムフォームのウィンドウ操作

こちらの動画を確認してみてください
このカスタムフォームは、任意のサイズに調整可能で、しかも最小化にも対応できます
最大化については解像度にもよりますが画面いっぱいまでは広がらないです

テキストボックスやオプションボタンなどが自由に配置可能なので
ユーザーフォームをイメージ出来るようなウィンドウになっています

ただ、あくまでもメッセージボックスの延長線なので
ユーザーフォームの様にイベント処理はありません
ボタンを押すと画面が消えて次のフローが実行されます

なので現時点でもっとも有用なのが、もともとのメッセージボックスで指定できなかった文字の見やすさを調整できる点です
今回のフローは、単純に見えやすいメッセージボックスを振り替える目的以外に
Excelデータなどを見やすく表示するなどにも利用できます

ちなみにカスタムフォームは、常に最前面に表示されます
また現時点ではその設定を変更することは出来ません
メッセージボックスにはあるので本機能の際には対応されるかもしれません

表示文字列の設定方法について

アクションをwクリックして開いた設定画面の画像
アクションの設定画面

「カスタムフォームの表示」アクションをwクリックで設定画面を開きます
設定画面の「カスタムフォームデザイナー」という青いボタンをクリックします

カスタムフォームのオブジェクト配置を行うデザイナー画面の画像
カスタムフォームデザイナーの設定画面

こちらの「カスタムフォームデザイナー」というウィンドウが新規に立ち上がります
こちらを使って、カスタムフォーム内のオブジェクトを配置・設定を行います
全ての設定はこの画面から行います

表示文字列の変更には、1つ目の「TextBox」をクリックします

表示文字列の設定項目をハイライトした画像
設定項目

右側に表示されたメニューから「テキスト」という項目が表示される文字列に当たります
こちらを任意の文字列に変更することで表示する文字列を変更することが可能です
グレーアウトしていますが、変数を指定することも可能ですので
事前のアクションで取得したExcelデータの変数を指定すれば、動的に文字列を変更することが可能です
ただ、現時点で改行に対応していません
入力ボックスでも行えませんし、改行した変数を指定しても改行は無視されます
(ここは通常のメッセージボックスであれば対応出来る箇所なので、本機能時は対応されるかもしれません)

設定メニューの「折り返す」を表示した画像
改行の設定

また設定メニューを下に送ると「折り返す」という設定がありますが
こちらは今回の場合はオンにしておきます
これをしていないと、ボックスの幅からはみ出た分が表示されなくなります
文字列が極端に長い場合は、最大化しても全てが表示されなくなりますので、今回のような文字列を大きく表示する場合はオンにしておきます

また改行には対応していないと解説しましたが、この設定と下の「最大幅」を応用すればなんとなく任意のところで改行を組むことは可能ですがあんまり意味は無いかもしれません

表示文字の設定項目を表示した画像
表示文字の設定

さらに下の項目が表示文字列の設定になります
ここのサイズが一番大きい設定が画像の特大になります
もうちょい小さくしたい場合は、ここで変更可能です
「色」ですが、赤とか青という設定では無いし、現状背景色の設定が変更できないので逆に見えにくい文字色になる場合もあるので良し悪しです

基本的には「テキスト」の項目を変数か任意文字列に変更すればフローの役割は果たすと思います
これを利用して、Excelデータを別のデータとwチェックをする際にExcelを表示しなくても確認しやすくできます

ちなみに、設定項目最上の「ID」については日本語が入るとエラーになります
デフォルトが日本語になっているのでオブジェクト配置して、そのまま保存するとエラー発生してしまいますので注意が必要です
さすがにこれは本機能時には解消されるでしょう

字幕に簡易解説が付いてます

強力パスワードの生成をしてテキスト保存を行う

PowerAutomateDesktopを利用して、強力なパスワードを生成し、さらにそれをテキストファイルとして出力します

Variables.CreateNewList List=> List
LABEL ReCreate
Variables.ClearList List: List ClearedList=> List
LOOP LoopIndex FROM 1 TO 10 STEP 1
    LABEL Regene
    Text.Random UseUpperCaseLetters: True UseLowerCaseLetters: True UseDigits: True UseSymbols: True MinimumLength: 15 MaximumLength: 20 RandomText=> RandomText
    Text.Replace Text: RandomText TextToFind: $'''\\.|,|-|_''' IsRegEx: True IgnoreCase: False ReplaceWith: $'''再生成''' ActivateEscapeSequences: False Result=> Replaced
    IF Contains(Replaced, $'''再生成''', False) THEN
        GOTO Regene
    END
    Variables.AddItemToList Item: RandomText List: List NewList=> List
END
Display.SelectFromListDialog.SelectFromList Title: $'''生成パスワードの選択''' Message: $'''リストから使用するパスワードを選択してください(再生成を選択するとパスワードを再度生成します)''' List: $'''再生成
%List%''' IsTopMost: True AllowEmpty: False SelectedItem=> SelectedItem ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''Cancel''' THEN
    EXIT Code: 0
END
IF SelectedItem = $'''再生成''' THEN
    GOTO ReCreate
END
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
File.WriteText File: $'''%SpecialFolderPath%\\NewText.txt''' TextToWrite: SelectedItem AppendNewLine: False IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.DefaultEncoding
Display.ShowMessageDialog.ShowMessage Title: $'''PowerAutomateDesktop''' Message: $'''デスクトップにテキストファイルを生成しました''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True

強力なランダムパスワードを生成して、テキストファイルに書き出します
これを利用することで、考えるのが面倒なパスワードを簡単に生成出来ます
またローカルで作成が出来るので安心感もありますね

このフローでは使用不可文字を設定しています
それは「,」「.」「-」「_」の4文字です
これらは特別な意味を持つものもあったりするのであまり使用しなくても良いかな、と感じた4文字です
後述の解説を読んでもらえれば、除外を解除することも追加・変更も自由に行えます

また、リスト生成してその中から1つを選ぶものとなっており
気に入らなければ再生成することも可能になっています

フローの解説

コードを貼り付けると、22行のフローとなります
順番に解説を行います

1~3行目のフローの画像
1~3行目のフロー

1行目:新しいリストの作成
1行目ではランダム作成した文字列の選択リスト用のリスト変数を作成しています
ここで作成したListという変数に後述で選択するパスワードを格納していきます

2行目:ラベル
このラベルは、後述のフローでリストの再作成を選択した場合に戻ってくる場所になります
再作成を選択した場合は、ここから再開することで全く新しいパスワードの生成を行ことになります

3行目:リストのクリア
2行目でフローが返ってきたときには、前回生成のパスワードリストが残ったままです
それを削除するためのアクションです
なので再生成をしていない場合はまったく意味のないアクションですね

4行目のフローの画像
4行目のフロー

4行目:Loop
4行目からループ処理を行います
12行目のEndまでがループ処理内となります
このループでは、パスワードの生成リストを作成しています
ループの条件が1から10になるまで1を加算しつつ実行なので、ようするに10回実行しているってことですね
ここもリストに10個も選択肢いらんねんって場合は減らしても良いですし、もっとたくさんの中からめちゃめちゃ悩むけど選びたいって場合は増やしても良いですね

5~11行目のフローの画像
5~11行目のフロー

5行目:ラベル
2度目のラベルの登場ですね
ここでは後続の文字列生成時に除外したい文字が含まれていた場合に再作成を行うために戻ってくる個所になります
除外文字が含まれる文字列が生成された場合はここに何度でも帰ってきます

6行目:ランダムテキストの作成
これが今回の処理の目的のアクションですね
例コードでは22行にもなっていますが、シンプルに文字列だけ生成するならこの1行で済んでしまうって、身も蓋もない話です
また、このアクションには設定で利用する文字範囲の指定が出来るので
記号は含めたくない、とか大文字は含めたくないとかであればこちらの設定を変更すれば簡単に対応可能です

7行目:テキストを置換する
ここで除外文字を置換しています
6行目の解説にもあるように大きく利用文字の指定は出来るのですが、その中でこれだけとかの細かい設定は出来ないので除外処理を入れる必要があります
それがここのアクションになります

テキストを置換するアクションの設定画面を表示した状態の画像
テキストを置換するアクションの設定画面

このアクションの設定のうち、「検索するテキスト」に指定したものが除外したい文字になります
今回の場合は4文字なので、それを指定しています
ただ指定の方法が正規表現というなかなかクセのある指定方法になるので
正規表現を使うをオンにする必要があります

正規表現について細かく話すと、とんでもないことになるので
詳しく知りたい方はGoogle先生に聞いてみてください
今回の設定では、記事最初に記載した4文字を除外します
ただ「.」だけは正規表現上特別な意味を持つ文字なので、エスケープ文字という「\」を入力して「\.」としています
また各文字の間に「|」が入力されていますが、これは正規表現でORを意味します
なので4文字のどれかを置き換えるという意味になりますね

置き換え後については、なんでも良いのですが判定に必要になるので日本語の方が良いですね
ランダムテキスト作成で利用される文字だけは利用したらあかんですね

正規表現がなんかよく分からん、という場合はこの「検索するテキスト」に1文字だけ指定して、アクションを4行にしても構わないです
ただ、その時に注意してほしいのが「解析するテキスト」は2つ目以降は置換をした変数を指定しないといけないという点です
これをしてないと、1つ目で置き換えたものが2つ目でリセットされてしまいます

ここのアクションの設定次第で、除外文字を自由に指定できます
ただここに指定を増やしすぎると再作成になる可能性が上昇してパスワード生成に時間がかかってしまうので、あんまり増やしすぎないほうがええです

8行目:If
ここで置き換えした文字列「再作成」が存在しているかどうかの判定を行っています
その文字が含まれていれば、5行目のラベルに戻って再作成を行います
ちなみに10行目がこのIfの終了行になります

9行目:移動先
これが指定のラベル行に移動するアクションです
このアクションでフローを巻き戻すことが出来るんですね~

13行目のフローの画像
13行目のフロー

13行目:リストから選択ダイアログを表示
ここで作成したパスワードリストを表示して、ユーザーに生成するパスワードの指定を行ってもらっています
設定には、1行目で作成したListの変数を指定しているのと、再作成依頼用に「再作成」という項目も追加しています
これを最上部指定することで、初期選択に再作成が表示されます
またここではキャンセルも出来るようにしています
なので、戻り値として選択した項目の文字列と選択したボタンを設定しています

14~19行目のフローの画像
14~19行目のフロー

14行目~16行目:
ここでは13行目の選択ダイアログでキャンセルを選択した時の処理を行っています
キャンセルをした場合はフローを停止しています
ただそれだけですね

17行目~19行目:
ここでは選択したアイテムが再生成かどうかを判定しています
再生成が選択されていた場合は2行目のラベルに戻ります
リスト自体を更新することになります

20~22行目のフローの画像
20~22行目のフロー

20行目:特別なフォルダーを取得
ここでDesktopのパスを取得しています
保存場所自体は別にどこでもいいのですが、このフローの性質上作成されたテキストファイルを利用するのが後日とか、ずっと同じ場所に残しておきたいという想定が低いのでそういったファイルはDesktopに作成するのが便利です
パスワードを設定して、ブラウザに記憶させたり別途管理表に転記したならもう削除してしまうのが良いからです
ここではパス取得だけなので、保存場所を別の場所にしたい場合は次の行を変更します

21行目:テキストファイルに書き込みます
ここでテキストファイルの生成を行っています
同じ名称のファイルがあった場合は上書きします(確認は出ません)
フローの性質上、上書きせずに前回分を残しておく必要性が低いので上書きで良いです
またこの設定の「ファイルパス」を任意に変更すれば、好きな場所に生成することが可能です

22行目:メッセージを表示
完了メッセージを表示しています
ここも必要なければ削除して良いです
デスクトップ通知を無効にしていなければ、処理完了は通知が出るので不要っちゃ不要です

Desktop版からWeb版のフローを起動する

PowerAutomateのDesktop版からWeb版のフローを自動的に実行させる方法について

基本記事にも解説していますが、無償版ではWeb版のAutomateからDesktop版のフローを起動することは出来ません
またDesktop版からWeb版のフローを直接実行するアクションはありませんが、間接的・限定的ではありますが可能です
その方法は単純にWeb版のトリガーとなるようなアクションをDesktop版で実行すればよいだけです
ただ、この方法は上記の通り間接的な実行となるのでWeb版の起動開始までのタイムラグが数分かかることがあります
またWeb版を実行する段階でDesktop版から処理が移行して、以降はDesktop版側の処理を実行できません
その点を考慮した上で処理の検討を行ってください

具体的には、Web版でDesktop版が行えるアクション内でのトリガーを実行させる事になります
最も簡単なものが、OneDriveへのトリガーとOutlook等のメール受信です
この二つはいずれもDesktop版のアクションで可能なものとなっています

Desktop版のフロー

まずは、Desktop版のフローについてみていきます
上記の通り使用するアクションはOneDriveへのファイル作成とメールの送信です

OneDrive利用の場合

OneDriveのフォルダ構成の例画像
OneDriveのフォルダ構成例

画像の様に、トリガー用のフォルダー「新しいフォルダー」を作成して
処理加工を行ったものを格納する「新しいフォルダー(2)」を作成します

トリガー次第ではあるのですが、ファイルの作成や更新などのトリガーを利用している状態で加工後のファイルもトリガー用に入れてしまうと思わぬエラーに見舞われる可能性がありますので、分けておくようにしましょう

Desktop版で利用するアクションの場所を表示状態にした画像
Desktop側で利用するアクション

アクションのファイルの中にある「ファイルのコピー」(元ファイルが必要の場合)や「ファイルの移動」(元ファイルが不要の場合)を利用すれば簡単にファイルを作成できます
ローカルのフォルダにあるファイルを、上記のトリガー用のOneDrive「新しいフォルダー」に複製するだけです
これでDesktop版側の処理は完了になります

Web版AutomateのOneDrive上にファイルが作成された際のトリガーの設定状態の画像
Web版フローの設定状態

こちらはWeb版のAutomateのフローとなります
1つ目がトリガーです
ファイルが作成されたときに実行されます
またこの設定でトリガー用フォルダを指定しておきましょう

2つ目がOneDrive上で複製を行っているアクションです
実際にはこのアクションまでに何らかの処理等が行われて、加工や通知などを行いますが今回はそのまま加工用フォルダーに同じ名称のファイルを作成しています
ファイルという設定項目は識別子なのでパスではない点に注意してください

メール受信の場合

メール受信の場合はWeb版のトリガーとなれるアプリである必要があります
Office系アプリが入っている前提なので、Outlookが最も処理で扱いやすいです

Outlook.SendEmailThroughOutlook.SendEmail Instance: OutlookInstance Account: $'''自己メルアド''' SendTo: $'''自己メルアド''' Subject: $'''Desktopフローからの自動送信''' Body: $'''kkk0014
上記IDコードの処理を実行する''' IsBodyHtml: True

Outlookでのメール送信アクションのコードです
これ単体では使用できませんが、使用できるフローとなると少し長くなり
ここでそれを説明すると蛇足になるのでこれで確認してください

Outlookからのメールメッセージの送信アクションの設定画面と設定すべき項目の画像
アクションの設定画面

こちらが、メール送信アクションの設定画面です
今回の場合はトリガーの役割となるので、自分のアカウントから自分のアカウントへメール送信を行います
「アカウント」と「宛先」はいずれも同一のメールアドレスを指定すると自己送信が可能です

次に「本文」の1行目ですが「kkk0014」と記載しています
これはこちらのトリガーでの実行すべき処理判定に利用できます
処理コードとでも言っておきましょう
コードなので形式だけ整えておきましょう
例えば、1番目の処理なら「kkk0001」というように、数値の部分だけ連番で記載します、ここの詳細は後述します
あとは、コードだけだと迷惑メールに指定される可能性もあるので
適当に日本語の通じるメッセージを追記しておきましょう

また「本文はHTMLです」のチェックはオン(画像の状態)にするようにしておきましょう、これをしていないとHTMLのコードが本文として表示されてしまいます

次にPowerAutomateWebの作成を行います
今回はGmailになっていますが、Outlookではトリガーと本文指定が違うだけですので適宜読み替えてください

PowerAutomateWebのトリガーの設定を表示した状態の画像
トリガーの設定画面

1つ目の「新しいメールが届いたとき」がトリガーとなります
指定としては、件名をDesktop版で指定したものと同一にします
これを行っていないと、届いたメール全てでフローが実行されてしまいます
つまり、Desktop版から送信するメールの件名は他のメールと重複しそうなものは指定しないようにする必要があります
だいたい、Automateとか自動送信とかといった単語を組み合わせておけば重複することは無いでしょう
どうしても件名だけで重複がのぞけないのであれば、送信者であったり他の項目で絞っていきます

PowerAutomateWebの1つ目のアクションの画像
1つ目のアクション

1つ目のアクションでは、本文内容から処理コードを抜き出します

テキスト関数を検索して表示した状態の画像
テキスト関数

このアクションは「テキスト関数」というアクションを使用します
検索に「文字列」と入力すると表示されます
このうちの「部分文字列」というのが上記のアクションになります

指定した文字列から、任意の文字位置から指定の文字数を指定することで抜き出しが行えます
ちなみにこれ自体は関数にも同様の役割のモノがありますが、
基本的にPowerAutomateWebの関数は可読性が低く、アクション名の修正に対応できない点があるのでなるべくアクションを利用する方が良いです
また、このアクションでは文字位置は0から始まる点に注意してください
1文字目から抜き出す場合は「開始位置」が0となります
あとはコードの形式に合わせた文字数を指定するだけです

PowerAutomateWebで条件分岐を設定した状態の画像
条件分岐

あとは、スイッチを利用して処理コードごとの分岐を設定します
この時の条件に上記で取得した部分文字列を指定します
そのケース一致のところに任意の処理を作成します

フォルダー作成の方と違い、Web版のフローで処理の条件分岐が必要となるので少し煩雑に感じるかもしれませんがこちらの利点は比較的処理開始が早い点です
OneDriveのファイル作成は数分実行までかかることがありますが、こちらの受信処理はすぐに実行されるのでGmailでフローを作った場合は、Outlookに受信されるより先に処理結果が出てきたりします

ようするに一長一短なので、運用上の点から検討してください

上記の様に限定的ではありますが、Desktop版から自動的にWeb版のフローに移行させることが工夫次第で可能となります
ここで紹介した方法以外にも、Web版のトリガーに設定可能なものでDesktop版から処理出来ることはあります
いずれも少しずつアクションを見て、出来ることを再確認していってください

PowerAutomateDesktopの処理実行方法の検討について

PowerAutomateDesktop版でフローを作成する前に、しっかり検証しておいてほしいバックグラウンド可能について

PowerAutomateDesktopは、その名前の通りDesktop操作を含めて自動化を行うアプリです
いわゆるRPAですが、このアプリで利用できるアクションでは処理の実行についてバックグラウンド可能なものとアクティブ操作が必要となるものがあります

処理を組む際に、ここを念頭において作成を進めることはとても重要です
前提としてPCが占有されるアクションが存在することは理解しておいてください
これはアップデート等でどうにかなるものではありませんので
フローの流れを考える際に、可能な限りバックグラウンドで可能なもので作成するように意識しましょう
と、いうのもこのアプリはWin11で標準搭載となるなど、個人利用の場面想定が非常に大きいです
個人利用の場面において、RPA用のPCを準備しているという想定がほぼ出来ないためです、VBA実行のためだけのPCを準備したりはほぼ無いと思いますので、それと同じ認識で良いです

そして、バックグラウンド可能を考慮したいのが処理時間の観点です
人が操作するよりは早いとはいえVBAのそれらと比べるまでもなくゆったりしています
そのためPC占有をする処理の場合、それだけ占有時間がかさばります
ただこれは裏を返せば、バックグラウンドで実行できれば他の作業を行いやすいことも意味します

バックグラウンドで可能なアクションは、ファイルやフォルダーの操作やアプリ関係ではインスタンスの作成が選択肢として存在する場合は、完全にバックグラウンド可能です
またインスタンス表示自体は行っていても最小化で実行可能であれば、エラー時のことなどを考慮してその方が良いです
つまりアプリを最小化状態で処理できることが、実務上で目指すべき点です

逆にバックグラウンド実行が不可能なのが、WindowsのUI操作や画像判定です
WindowsのUI操作は最小化していても必ず標準サイズに戻されて全面表示されてしまいますし、クリックアクションであればマウスまで操作されます
また画像判定も同様に画面に表示されていなければ判定を行えません
これらのアクションが不可避の場合は、そのフローはあなたの作業を阻害します
こういったアクションを含むフローを作成する場合は、処理時間や実行タイミングで通常作業との衝突が避けられないなら、いっそ作成しない事も検討してよいです
もちろん、専用PCが準備できるのであれば別です

また、上記のアクションを回避する方法として別のアプリを利用する方法も検討してみてください
例えばUI操作も内容によってはVBAやVBSで実行可能なのであれば、そのExcelやコードをAutomateに実行させることでバックグラウンド化できます

あとはWeb版のAutomateを利用することも検討してみてください
無償版ではWeb版からAutomateDesktopのフロー実行はできませんが
トリガーさえ確保できれば、Desktop版からWeb版を起動することは可能です
簡単なもので言えば、OutlookやGmailなどのメール受信・OneDriveへのファイル作成あたりでしょうか
会社アカウントでなければ、メールやOneDrive利用が良いでしょう

自分から自分へのメール送信を行うフローをDesktop版で作成します
件名や本文に実行したい処理の条件分岐判断文字列を入れて送信します
Web版では受信をトリガーとして処理の実行を行います
こうすることでDesktop版ではメールの送信を行うだけなのでバックグラウンドで処理可能です

Web版のAutomateで出来ることも含めてフローを検討出来ます
2022年2月時点では会社アカウント限定ですが、ExcelWeb版のOfficeScriptも利用可能になるのでOneDrive上でExcelの加工も自由自在になります

フロー作成時は、まずアクションを実行してみてそれがバックグラウンド可能なものかを調べてから作成を進めるようにしましょう
アクションリストにあるので出来ることは確認した、では無く実際に実行してバックグラウンド可能かどうか確認した、という作り方をしましょう
この辺は今までのRPAのイメージとは違いますね

またVBAと比較しても、VBAはPCの占有を前提としている(マルチタスクが得意でない)ので処理速度はかなり重要な要素です
ですが、バックグラウンド処理であればそれほど重要な要素では無くなりますね
さすがAutomate、これからも常識を変えていくでしょうね

Automateで現在日時を任意のテキスト形式にする

PowerAutomateDesktopで日付データを任意のテキスト形式に変更するフロー

DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyyMMdd''' Result=> FormattedDateTime

年月日数値のみ(2022/1/1=20220101)

DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyyMMddhhmmss''' Result=> FormattedDateTime

年月日と時分秒(2022/1/1 1:23:45=20220101012345)

現在日時を取得して、任意のテキスト形式に変換するフローです
主にはファイル作成などの際に、ファイル名に利用したりする場面が多いです

フローの解説

1つ目のコードをコピペして作成されたフローの画像
作成されるフロー

1つ目のコードをコピペすると画像の様にアクションが作成されます
2つ目のアクションは形式を変更しているだけなので解説は割愛します

1行目でPCのシステムの日時データを取得しています
設定では日付のみも選ぶことは可能です

現在の日時を取得しますアクションの設定画面を東京時間で取得する設定にした画像
日時取得アクションの設定画面

こちらの画像の様に、特定のタイムゾーンを指定することも可能なので
PC時間が不安に感じるような場合には、標準時を取得させることも可能です
画像の設定では東京の標準時を取得しています
時差のある場所などの場合にはこの設定を行えば良いです

2行目で、日付データからテキスト形式に変換を行っています

datetimeをテキストに変換アクションの設定画面の画像
変換アクションの設定画面

ここで任意の設定にするには、「使用する形式」からカスタムを選択して「カスタム形式」に形式を指定します
画像では西暦4桁、月日は2桁にそろえる形で数値だけの形式です
ファイル名に「/」が使えないのでそれを除外した形ですね

他の文字列を結合したりもできるので、Excelの表示形式と同じイメージで設定できますが、それほどまだ特殊形式は無いです
特に和暦は存在していないですね
またカスタム形式ではなく標準形式も多少あるので、年月日の漢字も含めたい場合はそちらにあります
他にもいろいろありますが、だいたい以下のものが使えるかもしれません

カスタム形式説明サンプル(2022/1/1 1:23:45)
y年月のみ漢字付き2022年1月
yy西暦下2桁22
t時刻と分数1:23
tt午前/午後午前
ddd曜日(曜日抜き)
dddd曜日(曜日有り)土曜日
m月日のみ漢字付き1月1日

上記のうち1文字だけのものは単独で利用可能なものです
ちなみに「thh」とすると「午01」となります
本来はAM/PMのAかPが取得されるのでしょうが、日本語になっているせいで同じ文字列になってなんの意味もないですね
ちなみにこの影響でAM/PMの取得は出来ません

PDFファイルを分割してファイル作成を行う

PowerAutomateDesktopでPDFファイルのページを抜き出して、それぞれのページのみのファイルを作成するフロー

LOOP LoopIndex FROM 1 TO 100 STEP 1
    Pdf.ExtractPages PDFFile: $'''対象ファイルパス''' PageSelection: LoopIndex ExtractedPDFPath: $'''出力先ファイルパス''' IfFileExists: Pdf.IfFileExists.AddSequentialSuffix
    ON ERROR

    END
END

1ページごとに分割する

LOOP LoopIndex FROM 1 TO 100 STEP 2
    Pdf.ExtractPages PDFFile: $'''対象ファイルパス''' PageSelection: $'''%LoopIndex%-%LoopIndex + 1%''' ExtractedPDFPath: $'''出力先ファイルパス''' IfFileExists: Pdf.IfFileExists.AddSequentialSuffix
    ON ERROR

    END
END

2ページずつ分割する

PDFファイルで取得したデータが、ファイル数の軽減のために一つにまとめられてしまっていたりしてページごとに分割して保管をしたい場合に使用します
こんなPDF加工処理はVBAを使うと、オブジェクトの作成が必要となったり
なにかとややこしいですが、Automateを使うとたった一つのアクションで可能です
さらにループ処理を利用することで、ファイル内の全ページに対して処理を行うことも簡単に行えます

フロー解説

1つ目のフロー

1つ目のフローをコピペした際のフロー
1つ目のフロー

1つ目のフローをコピペすると、このような3行のアクションが作成されます

1・3行目はループ処理です
設定は全て1行目で行います

ループ処理の設定画面の画像
ループ処理の設定画面

ループ処理ではページの更新を行っています
「開始値」はPDFファイルの分割を開始ページとなります
「終了」についてはPDFファイルの最終ページ数と一致するのが望ましいのですが、簡単に取得も出来ませんし、実際処理上はそれほど重要ではありません
なので発生しないページ数を指定すれば問題ありません
ここでは100を指定していますが、100ページを超えるファイルの分割処理を行いたい場合は任意に増やすと良いです
「増分」についてはページの更新になるので、1つ目の場合は1ページごとの分割になるので1が指定されています
またループで数値は利用するので、変数は生成します

新しいPDFファイルへのPDFファイルページの抽出アクションの設定画面の画像
PDF分割アクションの設定画面

2行目のアクションではPDFファイルの分割と新規ファイルの生成を行います
「PDFファイル」「抽出されたPDFファイルのパス」にはそれぞれ元ファイルと出力先のパスを拡張子まで含めて行います
ここの設定に関しては「ファイルが存在する場合」で連番ファイルの生成を指定しているので元ファイルが上書きされることが無いため同じパスにしていても問題はありません、むしろ同じ場所に生成されるので分かりやすいかもしれません
「ページ選択」はループの変数を指定することで、対象ページを更新していきます
ちなみにこのアクションでファイルの保存まで完了するので、後続処理が無いので変数は生成していません

ここで重要なのが、ループ処理の説明でおこなった終了ページと終了数値が一致していない点についてです
このままだとループの数値がPDFファイルに存在していないページ数を指定するためエラーが発生してしまいます
そこでこのアクションにエラー処理を設定します

エラー処理を設定した場合のフロー上の表示についての画像
アクションの表示

2行目のアクションの左側に青色のマークがついていることに気づいていましたでしょうか
これはエラー処理が設定されている場合に表示されるものです
どんな設定がされているかは、アクションの設定画面から確認できます

エラー処理を設定するにはアクションの設定画面下部にある「エラー発生時」を選択する
エラー処理を設定する箇所

エラー処理を設定・確認するには、設定画面の下にある「エラー発生時」をクリックします

エラー処理の設定画面の画像
エラー処理の設定画面

すべてのアクションに対して、この設定は行えます
設定項目は豊富にあるので特にWebブラウザ操作などの不安定処理の際の再試行などが行えるため知っておくと良いです
今回の場合は、エラーが発生した状況が「存在しないページを指定した」というものであるため特に特別な処理は不要です
なので「フローの実行を続行する」と「次のアクションに移動」を選択しています

今回のフローは最低限のアクションで目的を達成するものなので行っていませんが
ループ処理に途中判定で終了条件が当てはまればループをすべて実行せずに抜けるような処理を作ることが可能です
上記の「次のアクションに移動」という選択肢のほかに「ラベルに移動」という設定もあります
これを活用することで、エラー発生時はループの外に作成したラベルに移動できます
そうすることで無駄なループ処理を行わないので処理の速度が向上できます
ページ数が膨大でかつ、そのうちのほんの一部しか処理を行わないのが前提であればそのような設定を行うことも有効かもしれません
総ページ数と処理回数は比例すると思うので、あんまりそういった場面は無いかもしれません

2つ目のフロー

2つ目のフローをコピペしたときに作成されるフローの画像
2つ目のフロー

2つ目のフローは複数ページごとに分割を行いたい場合に使用するものです
ここでは2ページごとに分割を行っています
数値を修正することで3ページごとや10ページごとなどの任意の分割を行うことが出来ます
また設定自体はページに関するところ以外は1つ目のフローと同じですので、そのあたりは割愛します

ループアクションの設定画面の画像
ループアクションの設定画面

「増分」を編集します
2ページごとに処理を行う場合は、その加算分を指定するだけです
なので3ページごとなら3、といった具合です

新しいPDFファイルへのPDFファイルページの抽出アクションの設定画面の画像
分割アクションの設定画面

次に分割アクションの設定項目の「ページ選択」を編集します
ここを編集していないと1ページしか抽出されません
入力例にもありますが、連続ページを指定する場合は開始と終了の数値の間に「-」(半角ハイフン)を入力して指定します
今回の場合は変数となるので変数で指定を行います

変数の計算についてですが、画像のとおり「%LoopIndex + 1%」とします
%で囲んだものは変数と認識されます
そのため「%LoopIndex%+1」とした場合はエラーとなります
はじめはこの%内に入れ込むことが分からなくて、わざわざ変数に加算するアクションを利用したりしていました
なので、ここの+1の数値を3ページごとなら+2にする、といった具合で編集を行います

以上の様に任意ページも2か所編集するだけで可能になります
VBAでも出来ますが、こっちのほうが楽なのが分かりますな

デスクトップに複製ファイルを作成する

PowerAutomateDesktopでデスクトップに指定のファイルを複製するフロー

File.GetPathPart File: $'''複製元ファイルを指定する''' Directory=> Directory FileName=> FileName
File.GetTempPath TempFile=> TempFile
File.Delete Files: TempFile
File.Copy Files: $'''%Directory%\\%FileName%''' Destination: TempFile.Directory IfFileExists: File.IfExists.Overwrite CopiedFiles=> CopiedFiles
File.RenameFiles.Rename Files: CopiedFiles[0] NewName: $'''複製ファイル名を指定する''' KeepExtension: True IfFileExists: File.IfExists.Overwrite RenamedFiles=> RenamedFiles
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
File.Move Files: RenamedFiles[0] Destination: SpecialFolderPath IfFileExists: File.IfExists.Overwrite

PowerAutomateDesktopで自動化を行う際に、原本ファイルの編集は行わないようにして、複製を作成して加工処理を行うような場合に使用するフローです

フローを実行すると、指定したファイルを指定した名前でデスクトップに複製ファイルを作成します
このフローでは単一のファイルを想定していますので複数ファイルを対象とすることは出来ません

このフローで修正が必要な点は、原本ファイルの完全パスと複製ファイル名です
この2点だけ任意に変更してください

フロー解説

作成されたフロー

画像のものが実際に作成されたフローとなります

1行目では原本ファイルのパスを取得しています

原本ファイルの指定

ファイルパスの設定を変更します
これが原本ファイルの指定になります

ファイルの選択ダイアログで指定が出来るので、簡単に指定できます
エクスプローラーで完全パスをコピペしても良いです

2~3行目のアクションでは、仕様上必要となるアクションで
元々の目的には一切関係のない箇所です
と、いうのもファイルの複製や移動がフォルダ指定までしか行えないため
複製を行う場合は一旦元のファイルとは別の場所に格納する必要があります
同名なので同じ場所は当然使用できません

別の場所というのが案外やっかいで、PCの環境ごとにフォルダ構成も異なっています
なので方法としては2つ考えられます

今回のフローの様に一時ファイルという仕様上のファイルを利用する方法と、同場所に重複が確実に発生しない名称でフォルダの作成を行ってそこに格納する方法です

後者の場合はフォルダの名称が確実に重複しないことが大前提になりますので、名前の定義が面倒ですし、場所がローカルでは無くサーバー環境などであれば他の人にも変なフォルダの作成がされたのが分かるためそれも好ましくはないです

そこで今回のフローでは一時ファイルの取得アクションを利用することで、そのファイルが作成される過程で同時に作成されるフォルダを利用します
このフォルダはローカル環境であることと、Automateによる一時ファイルフォルダのため通常利用しているフォルダの可能性も皆無なので安全です

ただ、残念なことにファイルの作成を行わないアクションがありません
なので一時ファイルが完全に不要なのですぐに削除を行っています
これでフォルダだけが作成された状態にすることが出来ます

4行目で原本ファイルのコピーを一時ファイルフォルダに作成を行います
前述のとおり、この複製ファイルは原本ファイルと同名になっているので
5行目でファイルの名前を変更しています

ファイル名変更の設定画面

設定項目中の拡張子を保持するを有効にしているため、ファイル名の指定に拡張子は不要です
これのおかげで元ファイルの形式が一切判断が不要となっていますし、どんな形式にも対応可能になります

6行目はVBAでもある特別なフォルダーの取得というアクションです
他にもダウンロードフォルダなどが取得可能です
ここではデスクトップを取得しています
当然デスクトップはPC環境によって差があるので取得を行う必要があります

7行目で一時フォルダ内に作成した複製ファイルをデスクトップに移動しています
この時同名ファイルがあった場合は上書きされるので注意してください

ファイルのコピーアクションで、同時にファイル名の指定が出来ないおかげでステップ数が結構増えてしまいました
今後のアップデートで設定可能になるかもしれませんが、それまではこれで対応してください

変数について

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型でしたが、普通に数値計算出来るし
返し値は数値となっています

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