
OnStartに変数を並べているなら、名前付き計算式の導入で起動時間を短縮できます。変数と異なり、必要な瞬間にだけ計算されるため、アプリの応答性が向上します。
設定場所:アプリレベルでFormulaプロパティを開く
名前付き計算式を定義するには、ツリービューでアプリそのものを選択した状態で、右側のプロパティパネルの Formulas プロパティ(日本語UIでは「計算式」)を開きます。ここにコードを入力することで、アプリ全体で参照できる計算式が誕生するわけです。
変数一覧パネルには表示されないので、名前でしっかり識別することが重要になります。nfプレフィックスを使うと、どの値が名前付き計算式なのか一目瞭然です。
基本の書き方:イコール&セミコロン
最もシンプルな書き方は次の通りです。
nfUser = User();
イコール記号の右辺に値を返す式を書き、末尾に必ずセミコロンを付けます。これが命名規則です。変数を定義する Set 関数との構文は大きく異なるので注意しましょう。
Set 関数と比べると、Set は「Set(varName, value)」という順序ですが、名前付き計算式は「nfName = value;」という逆の向きになります。初めての人は戸惑いやすいポイントです。
変数との違い①:Immutable(変更不可)
名前付き計算式は、一度定義されたら後から書き換えることはできません。つまり、変更不可能な属性を持つということです。その代わり、コード内でうっかり上書きされるリスクがなくなります。
変数(Set関数で定義)は、何度でも Update Select ボタンのOnSelectなど、イベントハンドラー内で書き換えられます。一方、名前付き計算式はアプリ起動時に一度だけ評価され、その値は保証されます。
ボタンの OnSelect プロパティで nfUser を書き換えようとすると、エラーが返ります。この挙動を理解することが、設計を大きく変える第一歩になります。
変数との違い②:遅延評価
OnStart では、アプリ起動時にすべての処理がブロッキング実行されます。つまり、OnStart 内の処理がすべて終わるまで、ユーザーは待つしかありません。読み込む件数が多ければ多いほど、起動画面は長く表示されたままになります。
一方、名前付き計算式は必要な瞬間に計算されます。例えば、画面Aで nfUser が参照されるタイミングで初めて User() 関数が実行されるということです。すべての計算式を起動時に完了させる必要がないので、アプリ全体の応答性が改善されるわけです。
ただし、計算式の定義自体は起動時に構文チェックされます。構文エラーがあれば、起動時に検出されます。

命名規則:nfプレフィックスで識別性を高める
変数一覧パネルには表示されない名前付き計算式だからこそ、命名規則が重要です。nf(named formula)というプレフィックスを付けることで、コード内でその値が計算式であることを即座に判断できます。
例えば nfUser、nfDepartments、nfThemeColor といった具合です。ほかの開発者がコードを見たときも、プレフィックスを見るだけで「これは名前付き計算式だ」と理解できるため、チームでの開発時にも有効です。
典型的な用途:4つのパターン
名前付き計算式が活躍する場面は、主に4つに絞られます。
まず、ユーザー情報キャッシュです。User() 関数の結果を nfUser として定義しておけば、OnStart でブロッキングされることなく、必要なコントロールで User().FullName などとアクセスするより効率的になります。
次に、テーマカラー定数です。ColorValue("mediumaquamarine") といった色指定を一箇所で管理し、アプリ全体で共通の nfPrimaryColor などを参照することで、デザイン変更時の修正箇所が1つで済みます。
3番目は、変わらないリストです。例えば、都道府県リストやステータス選択肢を Table({Value:"北海道"},{Value:"青森県"},...) のように定義しておけば、複数の Combobox コントロールで共有できます。OnStart で ClearCollect を実行するより、起動速度が向上します。
最後に、フィルター済みサブセットです。nfExecutives = Filter(Employees, Department = "Executives") のように、特定条件でフィルタリングしたテーブルを先に計算しておくことで、ギャラリーやコンテナの Items プロパティを単純に保てます。
OnStartを完全に置き換えるものではない:使い分けの実際
名前付き計算式は便利ですが、すべてのケースで OnStart を置き換えられるわけではありません。2つの例外があります。
まず、深リンク処理です。アプリが特定の引数付きURLで起動された際、その引数を抽出して変数に設定する必要がある場合、OnStart のブロッキング実行が有効になります。遅延評価では、引数の確認が遅れるため、画面遷移ロジックが複雑になりがちです。
次に、確定させる必要がある値です。例えば、現在のユーザーが持つ権限フラグを計算して、その結果に基づいて特定の画面を表示・非表示にする場合、起動時に確定していることが重要になります。遅延評価だと、計算結果が変わるタイミングで画面の表示状態が揺らぐリスクがあります。
つまり、起動速度を優先したい値は名前付き計算式に、初期状態の確定が必要な値は OnStart に、という使い分けが理想的です。
まとめ
名前付き計算式は、immutable かつ遅延評価される計算式です。OnStart に並べた変数をそのまま移行することで、アプリの起動体感を大きく改善できます。ユーザー情報、テーマカラー、選択肢リスト、フィルター結果といった「一度取得したら変わらない値」の管理に最適です。
OnStart をすべて置き換えることはできませんが、小さな改善の積み重ねが起動速度を左右します。次のステップとして、自分のアプリで OnStart に書かれている処理を見直し、どの値が名前付き計算式の候補になるかを検討してみてください。
関連記事:Power Appsパフォーマンス改善まとめ → Power Appsパフォーマンス改善まとめ
関連記事:名前付き計算式の書き方チートシート → 名前付き計算式の書き方チートシート