はじめに
第9回では、PADの「Pythonスクリプトの実行」で別ブックの値を取得し、「キーの送信」で集計シートへ書き込む構成を実機検証しました。ループを通した動作はおおむね確認できたものの、集計シートへの追記だけが状況によって不安定になるという課題が残っていました。
今回はこの課題を解決した内容です。原因を突き詰めていくと、値を1文字ずつ「キーの送信」でタイプさせる方式そのものに無理があり、クリップボード経由でまとめて貼り付ける方式に切り替えることで安定しました。あわせて、セル移動・シート切り替えを名前ボックス経由で一撃にする方法もまとめます。
前回までの課題のおさらい
第9回では、集計シートへの1行分の書き込みを次のような形で行っていました。
キーの送信: %CurrentFileName%{Tab}%ValuesText%{Enter}ファイル名と抽出した値をタブ区切りでつなげ、「キーの送信」アクションの文字列としてそのままタイプさせる方式です。値の数が多い、あるいはファイル数が多いループを回すと、まれに入力が飛ぶ・ズレるといった現象が発生し、原因の切り分けが難航していました。
解決の方向性:3つのパターン
実機検証を重ねる中で、キー送信を安定させるための3つのパターンが固まりました。
UI要素クリックからショートカットへ: 当初は名前ボックスやシートタブの指定に「UI要素クリック」を使っていましたが、これがなかなか安定しませんでした。ページの再読み込みやレイアウトのわずかな変化でUI要素の位置がズレたり、クリックがうまく認識されなかったりすることが原因と考えられます。そこで、名前ボックスへのフォーカスもショートカットキー({Control}({Shift}({F6})))に切り替えたところ、こちらは安定して動作しました。以下のパターン1・2は、この置き換えを踏まえたものです。
パターン1:セル移動と入力は名前ボックス経由で一撃にする
{Control}({Shift}({F6})){Control}({A})B1{Enter}{Control}({V}){Enter}{Control}({Shift}({F6})):名前ボックスへフォーカスを移動{Control}({A}):名前ボックス内に残っている文字列をすべて選択(上書きの準備)B1{Enter}:セル番地を指定してそのセルへジャンプ{Control}({V}){Enter}:クリップボードの内容を貼り付けて確定
{Down}や{Right}を積み重ねてセルを移動する方式は、途中でどこか1回でもキーが抜けると位置がズレたまま以降の処理が全部狂います。名前ボックスへセル番地を直接指定するこの方式は、現在位置に関係なく必ず目的のセルへジャンプできるため、ズレが蓄積しません。
補足:{Control}({A})は本当に必要か
{Control}({Shift}({F6}))のショートカットで名前ボックスへフォーカスすると、実はその時点ですでに中の文字列は全選択状態になっています。そのため理屈のうえでは直後の{Control}({A})は不要です。ただし、UI要素で名前ボックスを直接指定してフォーカスする方式(ショートカットを使わない場合)では、{Control}({A})を付けないと入力が安定しませんでした。今回のフローではショートカット経由でも念のため統一して付けていますが、付けても副作用はないため、どちらの方式でも{Control}({A})を入れておくのが無難です。
パターン2:シート切り替えも名前ボックスで一撃
{Control}({Shift}({F6})){Control}({A})集計!A1{Enter}名前ボックスにはシート名!セル番地の形式でも直接ジャンプできます。UI要素でシートタブをクリックする方式と違い、シート名の表記ゆれやタブの並び順変更の影響を受けません。
パターン3:まとまったデータはクリップボード経由で一括貼り付け
1件ずつループでキー送信するのではなく、値をまとめてから1回の{Control}({V})で貼り付ける方式です。区切り文字を変えることで、貼り付ける形も自在に変えられます。
| 展開したい形 | 区切り文字 | PAD側の作り方 |
|---|---|---|
| 横一列(1行分) | タブ区切り | 「テキストの結合」でタブ区切りに結合 |
| 縦一列(1列分) | 改行区切り | 「リスト」変数をそのままクリップボードへ設定(自動で改行区切りになる) |
| 縦横の表 | タブ+改行の組み合わせ | 「データテーブル」変数をそのままクリップボードへ設定(自動変換される) |
このパターンには2つのメリットがあります。
- 安定性:1回の貼り付けで完結するため、ループ中のどこかでキーが抜けてズレる、というリスクそのものがなくなる
- スピード:1件ずつ「キーの送信」を繰り返すよりも、クリップボード経由の一括貼り付けは圧倒的に高速
【必須】「キーの送信」の詳細設定を変更する
ここまでの3パターンを組み込んでも、この設定を変更しない限り安定しません。「キーの送信」アクションの詳細設定に「キーの入力の間隔の遅延」という項目があり、既定値は10ミリ秒です。これを100ミリ秒に変更してください。既定の10ミリ秒のままだと、Excel Online側の反応が追いつかず入力が抜け落ちる原因になります。
ただし最適な値はPCのスペックやExcel Onlineの応答速度など環境によって変わるため、100ミリ秒でも不安定な場合はさらに数値を上げて調整してください。
PADフロー全体(実機検証済み)
以上3つのパターンを実際に組み込んだPADフローです。どのアクションでどの変数が作られるかを省略せず記載します。
0. 事前準備
- 「変数の設定」で
MainFilePathにMainブックのローカル同期コピーのフルパスを設定(例:C:\Users\ユーザー名\OneDrive - 会社名\sample_003.xlsm) - 「新しいChromeを起動する」でMainブックが開かれているChromeタブに接続し、
Browserに保存
1. フォルダ選択とMainシートへの書き込み(パターン1の実践)
- 「フォルダーの選択ダイアログを表示」でフォルダを選択し
SelectedFolderに格納 - 「フォルダー内のファイルを取得」で
Filesを取得 - 「クリップボード テキストを設定」で
SelectedFolderをクリップボードへ - 「キーの送信」:
{Control}({Shift}({F6})){Control}({A})B1{Enter}{Control}({V}){Enter}(B1セルへジャンプして貼り付け)
2. ファイル名一覧の書き込み(パターン3・縦一列の実践)
- 「新しいリストの作成」で
FileNamesを作成 For each CurrentItem in Files- 「項目をリストに追加」で
CurrentItem.NameをFileNamesへ追加 End(ループ終了)- 「テキストの結合」で
FileNamesの項目を新しい行(改行)区切りで結合しJoinedTextに保存 - 「クリップボード テキストを設定」で
JoinedTextをクリップボードへ - 「キーの送信」:
{Control}({Shift}({F6})){Control}({A})B2{Enter}{Control}({V}){Control}({Up})(B2へジャンプして貼り付け→貼り付けた範囲の先頭へ戻る)
改行区切りのテキストを貼り付けると、Excel側が自動的に1行ずつB2、B3、B4…と縦に展開してくれます。ファイル数ぶんループを回す必要はありません。
3. 集計シートの準備(パターン2の実践)
- 「Pythonスクリプトの実行」で対象シート名を取得し、生成変数を
TargetSheetNameに変更(第9回の2-1と同一コードを流用) - 「Pythonスクリプトの実行」でセル番地一覧を取得し、生成変数を
AddressesJoinedに変更(第9回の2-2と同一コードを流用) - 「キーの送信」:
{Control}({Shift}({F6})){Control}({A})集計!A1{Enter}{Control}({Down}){Control}({Down}){Control}({Up}){Down}
集計シートへの移動は、名前ボックスで直接集計!A1へジャンプしてから空き行を探す方式に変更しました。第9回で使っていた{Control}({End})起点の方式とは異なり、A1へジャンプした後に{Control}({Down})を2回、{Control}({Up})、{Down}と続けます。
- 1回目の
{Control}({Down}):A1(見出し行)から、データがすでに入っていればその末尾の行へ、まだなければシート最下行へジャンプ - 2回目の
{Control}({Down}):1回目でデータ末尾に着地していた場合、そこから先は空欄が続くのでシート最下行へジャンプ(すでに最下行にいた場合はそのまま) {Control}({Up}):シート最下行から上方向へ戻り、最後に見つかった入力済みセル(見出し行、またはデータの最終行)へ着地{Down}:その1つ下=次の空き行へ移動
見出し行だけの状態でも、すでにデータが数行入っている状態でも、この4ステップで正しく次の空き行に着地することを実機で確認しています。集計シートの1行目には見出しを入れておく前提です。
4. 対象ファイルごとの一括書き込み(パターン3・横一行の実践)
For each CurrentItem in Files- 「Pythonスクリプトの実行」で対象ファイルを直接読み込み、値を
|区切りで返す(第9回の「3. 対象ファイルごとの処理」と同一コードを流用)。生成変数をValuesJoinedに変更 - 「ファイル パス部分を取得」で
CurrentItemのファイル名部分をFileNameに保存 - 「テキストの分割」で
FileName+|+ValuesJoined(|でつないだテキスト)を区切り記号|で分割し、TextListに格納
ValuesJoined自体が内部で|区切りになっているため、FileNameを先頭にくっつけてから改めて|で分割すると、ファイル名と各値がすべてフラットな1本のリスト(TextList)になります。個別の置換処理をはさむ必要はありません。
- 「テキストの結合」で
TextListの項目をタブ区切りで結合し、JoinedText2に保存(=1行分のデータがタブ区切りテキストに) - 「クリップボード テキストを設定」で
JoinedText2をクリップボードへ - 「キーの送信」:
{Control}({V}){Left}{Down}(貼り付け→先頭列へ戻る→次の行へ)
貼り付け後にアクティブセルが先頭列にない場合に備えて{Left}で確実に先頭列へ戻し、{Down}で次の行の書き込み位置へ移動します。この2ステップだけでループの2回目以降も再ナビゲーション不要になることを実機で確認しています。
End(ループ終了)
5. 完了通知
- 「メッセージを表示」で完了メッセージを表示
実際に動かして検証する
フォルダ選択〜ファイル一覧の縦展開書き込み、集計シートへのジャンプと空き行検出、対象ファイルごとの横一行一括貼り付けまで、すべて実機で動作確認済みです。第9回で残っていた「集計シートへの追記が不安定」という課題は、1件ずつキー入力させる方式をやめてクリップボード一括貼り付けに切り替えたことで解消しました。
まとめ
- PADの「キーの送信」で値を1文字ずつタイプさせる方式は、量が増えるほど不安定になりやすい
- 名前ボックスやシートタブの指定を「UI要素クリック」で行う方式は安定せず、ショートカット(
{Control}({Shift}({F6})))で名前ボックスにフォーカスする方式に切り替えた - セル移動・シート切り替えは、名前ボックスへ
セル番地またはシート名!セル番地を直接送る方式にすると、現在位置に関係なく一撃でジャンプでき、ズレが蓄積しない - まとまったデータは「クリップボード テキストを設定」→「キーの送信」で
{Control}({V})一発で貼り付ける方式にすると安定する。区切り文字(タブ/改行/両方の組み合わせ)を変えるだけで、横一行・縦一列・表のどの形にも展開でき、1件ずつ送信するより高速でもある - 複数の値を1つのテキストに連結してから区切り文字で分割すると、個別の置換処理をはさまずに済むケースがある
- 【必須】「キーの送信」アクションの詳細設定「キーの入力の間隔の遅延」(既定10ミリ秒)は100ミリ秒に変更する。ここを変えないと安定しない。最適値は環境依存のため、それでも不安定な場合はさらに調整する
次回予告
集計シートへの書き込みが安定したことで、残る仕上げはPADフロー自体をMainブックのシート上から起動できるようにすることです。次回はこの起動部分をまとめる予定です。
関連記事
- 【Web版Excel】VBAをOffice Scriptsに移行する方法
- 【保存版】VBA→Office Scripts 書換チートシート
- 生成AIでVBAをOffice Scriptsに変換できるか?
- 【検証】生成AIはVBAをOffice Scriptsに変換できるか?
- 【Office Scripts×Power Automate】UserFormの代替で完了通知を自動化する
- 【Office Scripts】UserForm代替パターン:進捗表示はセルで、キャンセルは実行ボタンで実装する
- 【Office Scripts×PAD】Power Automate for Desktopのブラウザ操作でExcel on the webのスクリプトを起動する
- 【Office Scripts移行】別ブックデータ取得の下準備|マーカー検索でセル番地を記録する
- 【Office Scripts移行】別ブックを開いてデータを取得する本編|PAD×PythonでWorkbooks.Openの壁を越える
※1回買えば複数サイトで使い回しOK
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


