PowerAppsとエクセルで紙に印刷する最終解決法(今のところ)
PowerAppsにはPrint関数がありますが、紙1ページ分しか印刷できません。この問題をエクセルとの連携により解決しました。エクセルだから任意の書式にできます。その方法を普通のやり方と比べて実演でご紹介しています。
(動画時間:8:26)
Udemy.comでオンラインコースを運営しています。
マイクロソフトPowerApps 中級編【SharePointで、実務で使える業務アプリの作り方:勤怠管理アプリ編】
⇒ 半額になる「ディスカウントリンクページ」へ
PowerApps単体の印刷機能はしょぼい。
こんにちは、リーンシグマ、ブラックベルトのマイク根上です。
業務改善コンサルをしています。
以前、PowerAppsの印刷機能についての動画を作りました。
その動画ではギャラリーやデータテーブルで
下にスクロールした部分も印刷ができる裏技をご紹介しています。
⇒「PowerAppsの印刷機能の作り方(ギャラリーの非表示行を印刷する)」
しかし、後でお見せしますが、
最初の1ページまでのデータしか印刷できません。
残念ながら現在のPowerApps単体ではこれが限界なのです。
実務では紙での印刷が必要な場面はまだまだ多いです。
僕のレストランのクライアントさんで、
受注情報をキッチンに持っていく為に、
どうしても紙に印刷する機能が必要で、
今回、エクセルとの連携でその課題を解決したのです。
今日はそのやり方をサンプルアプリでご紹介します。
まずはその完成形をお見せしましょう。

上図の様に人名一覧表の簡単なアプリがあります。
データはSharePointリストに入っていて、
全部で149人のデータがあり、
ドロップダウンで、都道府県と血液型でフィルターが掛けられます。
右上のボタンの「OnSelect」属性にPrint関数が入っています。
右上のボタンの「OnSelect」属性
Print()
そのボタンをクリックすると紙に印刷ができるのですが、
なんとギャラリーの見える部分しか印刷できません。(下図参照)

〈 サンプルデータの出典元:https://yamagata.int21h.jp/tool/testdata/ 〉
そこで次の画面でその問題の改良をしました。
そっちですと、ギャラリーの見えない部分も印刷できます。
このやり方の詳しい作り方を以前の動画で実演しています。
⇒「PowerAppsの印刷機能の作り方(ギャラリーの非表示行を印刷する)」
それでもPowerApps単体でできるのですが、
最初の1ページまでのデータ量しか印刷できません。
業務によってはこれで大丈夫な時もありますが、
今回の僕のクライアントさんはもっと印刷したいデータ量があるし、
複雑な印刷のレイアウトにする必要もありました。
エクセルとの連携でPowerAppsの印刷の問題を解決
そこで今回出来上がったのが次です。
その「エクセル印刷」ボタンを押すと、
「エクセルファイルを開けていいか?」と聞いてきますので、
それに「Open」をクリックして答えます。
すると、エクセルファイルが開いて、
同じデータベースからデータが来て、
簡単に、きれいに印刷ができます。

〈 サンプルデータの出典元:https://yamagata.int21h.jp/tool/testdata/ 〉
またPowerAppsに戻って、フィルターを掛けての印刷も、
ちゃんとエクセルで印刷ができます。
エクセル側ではVBAを使ってデータを持ってきてますので、
そのデータをカテゴリーで集計したり、
複雑な計算結果も自由に表示できます。
また、色やフォントサイズなどは
エンドユーザーレベルで変更できますので、
逆に使い勝手がすごく良いと、
クライアントさんに喜ばれました。
これでPowerAppsでできる事がかなり広がります。
それでは次にこの仕組みの概要をご紹介します。
PowrAppsのアプリでのフィルターの選択肢をどうエクセルに伝えるか?
この仕組みの肝はアプリで選んだ選択肢、
パラメーターと言いますが、
これをどの様にエクセルに伝えるかです。
その為にフィルターの数だけ列がある
小さなテーブルを一つ用意しました。
ユーザーテーブルでやってもいいです。
そして、アプリ内の各ドロップダウンの「OnChange」属性で、
Patch関数を使って選択された値を、
データベースのその列に記録します。
ドロップダウンの「OnChange」属性
Patch(
Tbl_Users,
LookUp(
Tbl_Users,
UserEmail = User().Email
),
{
Prefecture: Self.Selected.Result
}
);
ユーザー毎に記録場所を設けていますので、
万が一、複数ユーザーが同時にこの作業をしても
問題が無いようにできています。
ドロップダウンの選択肢を動的に作成する方法
余談ですが、ドロップダウンの選択肢を
その「Items」属性で設置しますが、
データベースから選択肢の値を持ってきて
その中に「全ての県」などの
データベースに無い言葉を入れるのは結構大変です。
しかし、今回それを簡単にできる方法を見つけたのでお見せします。
ドロップダウンの「Items」属性
Distinct(
Split(
”全ての県;” & Concat(
Tbl_Citizen_List,
Prefecture & “;”
),
”;”
),
Result
)
複数の関数のネストの式は内側から見ていき、
「Tbl_Citizen_List」が人名のデータベースで、
最初にそこから「Prefecture」 列から都道府県データを持ってきて、
Concat関数でそれらを全てセミコロンで繋げた文字列を作成します。
見難いですが、その結果は数式ボックスの下で確認できます。(下図参照)

それに「&」記号を使って「全ての県」の文字を最初につなげています。
そして今度はSplit関数でセミコロン毎にデータを一列のテーブルに入れています。
その列名が「Result」になっている事に留意して下さい。

このままだと重複が多いので最後にDistinct関数で重複を削除しています。
これにより任意の文字を含めて動的に
ドロップダウンやコンボボックスの選択肢を作成できます。
PowerAppsからエクセルファイルを開ける機能の作り方
最後に「エクセル印刷」ボタンですが、
その「OnSelect」属性ではLaunch関数で
印刷用のエクセルファイルを開く事だけやっています。
このURLの取得の仕方を次にお見せしましょう。
「エクセル印刷」ボタンその「OnSelect」属性
Launch(“https://…(OneDrive内のエクセルファイルのURL)”)
まず印刷用のエクセルファイルを作成して、
それをOneDriveのどこかのフォルダーに保存します。
そして、メニューバーの「ファイル」、「情報」、「パスのコピー」で、
それをクリックしたらこのファイルのURLを取得できるのです。
それをさっきのLaunch関数に持ってきます。
するとそのURLの最後に「?web=1」があります。
これがあるとエクセルオンラインで開いてしまいます。
エクセルオンラインでは残念ながらVBAは使えません。
そこで、さっきの「?web=1」を取ると、ユーザーのPCのエクセルで開くのです。
エクセルのADOとSQLでデータを持ってくる。
この後はエクセルのVBAでの作業になります。
簡単に言いますと、
- エクセルが開いたらVBAがトリガーされる。
- 最初にさっきのテーブルからフィルターの選択肢情報を取りにいく。
- それを使って次に人名のデータベースからデータを抽出する。
この機能の作成にはSQL言語とADOの専門知識が必要になりますが、
ネットで「ADO エクセル」とかで沢山情報が出てきます。
最後は技術的な話になってしまいましたが、
PowerAppsの印刷の問題が解決できたのは大きいです。
これによって業務アプリとしてより多くの業務に
PowerAppsを活用できると思います。
SQLやADOはちょっと難しいかもしれませんが、
もし僕にお手伝いできることがあったら次のリンクからお知らせ下さい。
⇒「お問合せ」
「こちらの記事も読まれてます。」