Visual Basic や JavaScript などの別のプログラミング ツールを使ってきた方は、変数はどこにあるのかという疑問を抱くことでしょう。 PowerApps は若干異なり、別のアプローチが必要です。 変数の説明に進む代わりに、Excel で何をしようとしているかを考えてください。

他のツールでは、明示的に計算を実行し、その結果を変数に格納していたことでしょう。 ところが、PowerApps と Excel のどちらも、入力データが変更されると自動的に数式が再計算されます。そのため、通常は変数を作成したり更新したりする必要はありません。 可能な限りこの方法に従うことで、アプリをより簡単に作成、理解、維持することができます。

場合によっては、PowerApps で変数を使用する必要があります。これにより、動作の数式を追加して Excel のモデルを拡張します。 これらの数式が実行されるのは、ユーザーがボタンを選択したときなどです。 動作の数式の中では、他の数式で使用する変数を設定すると便利なことがよくあります。

一般的には、変数の使用を避けてください。 ただし、変数を使わないと目的の動作が得られないこともあります。

Excel を PowerApps に変換する

Excel

それでは、Excel のしくみを確認しましょう。 セルには、数値や文字列などの値、または他のセルの値に基づく数式を含めることができます。 ユーザーがセルに別の値を入力すると、新しい値に応じてすべての数式が自動的に再計算されます。 この動作を実現するためにプログラミングは必要ありません。

Excel に変数がありません。 数式が含まれるセルの値は入力内容に基づいて変化しますが、数式の結果を記憶してそれをセルや他の場所に格納する方法はありません。 セルの値を変更すると、スプレッドシート全体が変更される可能性があり、それ以前に計算された値はすべて失われます。 Excel のユーザーは、セルをコピーして貼り付けることができますが、それはユーザーが手動で制御するものであり、数式では不可能です。

PowerApps

PowerApps で作成したアプリの動作は、Excel と非常によく似ています。 セルを更新する代わりに、画面上の任意の場所にコントロールを追加し、数式で使用するために名前を付けることができます。

たとえば、TextBox1 という名前のテキスト ボックス コントロールのほか、TextInput1TextInput2 という名前の 2 つのテキスト入力コントロールを追加することで、アプリで Excel の動作を複製できます。 TextBox1Text プロパティを TextInput1 + TextInput2 に設定すると、TextInput1TextInput2 に格納されている値がどのような数値であってもその合計が自動的に表示されます。

TextBox1 コントロールが選択されていて、Text の数式が画面上部の数式バーに表示されていることに注目してください。 ここで、数式が TextInput1 + TextInput2 となっていることがわかります。 Excel ブック内のセル間に依存関係が作成されるのと同様に、この数式によってこれらのコントロール間に依存関係が作成されます。 ここで、TextInput1 の値を変更してみましょう。

TextBox1 の数式が自動的に再計算され、新しい値が表示されます。

PowerApps では、数式を使用して、コントロールのプライマリ値だけでなく、書式設定などのプロパティも決定できます。 次の例では、テキスト ボックスの Color プロパティに設定された数式により、負の値は自動的に赤で表示されます。 If 関数は Excel と非常によく似ています。
If( Value(TextBox1.Text) < 0, Red, Black )

TextBox1.Text の計算結果が負の場合、数値が赤で表示されます。

数式は、さまざまなシナリオで利用できます。

  • デバイスの GPS を使用した場合、Location.LatitudeLocation.Longitude を使用する数式によって、マップ コントロールに現在の位置を表示できます。 移動すると、マップによって位置が自動的に追跡されます。
  • 他のユーザーがデータ ソースを更新できます。 たとえば、チームの他のメンバーが SharePoint リスト内の項目を更新する場合があります。 データ ソースを更新すると、依存するすべての数式が自動的に再計算され、更新されたデータが反映されます。 この例をさらに進めて、ギャラリーの Items プロパティを数式 Filter( SharePointList ) に設定すると、新しくフィルター処理されたレコード セットが自動的に表示されます。

利点

数式をしたアプリの作成には多くの利点があります。

  • Excel を知っていれば PowerApps もわかります。 モデルと数式の言語は同じです。
  • 他のプログラミング ツールを使用したことがある場合は、これらの例を実現するためにどれだけの量のコードが必要になるかを考えてみてください。 Visual Basic では、各テキスト ボックスの変更イベント用にイベント ハンドラーを記述する必要があります。 このそれぞれで計算を実行するコードは冗長であり、不一致が生じる可能性があります。また、共通のサブルーチンを記述することが必要になる場合もあります。 PowerApps では、1 行の数式 1 つでこのすべての処理を実現しました。
  • TextBox1 のテキストがどこから取得されるかを理解するには、Text プロパティの数式だけを確認すればいいことがわかります。 ほかに、このコントロールのテキストを変更する方法はありません。 従来のプログラミング ツールでは、プログラムのどこからでも、任意のイベント ハンドラーまたはサブルーチンでラベルの値を変更できました。 これにより、変数がいつどこで変更されたかを追跡するのが難しくなります。
  • ユーザーは、スライダー コントロールを変更した後に考えを変えた場合、スライダーを元の値に戻すことができます。 アプリでは以前と変わらず同じコントロールが表示されるため、まるで何も変わっていないかのように見えます。 "what if" を試したり要求したりした場合でも、Excel の場合と同様、派生的な問題は発生しません。

一般的に、数式を使用して効果を得ることができれば楽になります。 PowerApps の数式エンジンをうまく利用しましょう。

変数を使用するタイミングを把握する

単純な加算器に変更を加えて、累計機能を備えた昔ながらの計算機のように動作するようにしましょう。 [Add] ボタンを選択すると、数値が累計に加算されます。 [Clear] ボタンを選択すると、累計が 0 にリセットされます。

ここで作成する計算機では、Excel に存在しない機能、つまりボタンを使用しています。 このアプリでは、数式だけを使用して累計を計算することはできません。なぜなら、値はユーザーが行う一連の操作によって異なります。 代わりに、累計を手動で記録して更新する必要があります。 ほとんどのプログラミング ツールでは、この情報を "変数" に格納します。

場合によっては、アプリが目的の動作を行うために変数が必要になります。 ただし、このアプローチには注意が必要です。

  • 累計を手動で更新する必要があります。 この処理は自動再計算では実行されません。
  • 累計は、他のコントロールの値に基づいて計算できません。 累計は、ユーザーが [Add] ボタンを選択した回数と、選択したときにテキスト入力コントロールに格納されていた値に基づきます。 ユーザーが 77 を入力した後で [Add] を 2 回選択したのか、加算する値に 24 と 130 を指定したのか、 合計が 154 になった後でその違いを見分けることはできません。
  • 合計に対する変更は、異なる経路から生じている可能性があります。 この例では、[Add] ボタンでも [Clear] ボタンでも合計を更新できます。 アプリが期待どおりに動作しない場合、どちらかのボタンに問題の原因があるのでしょうか。

コンテキスト変数を作成する

計算機を作成するには、累計を保持する変数が必要です。 PowerApps で最も単純な変数は "コンテキスト変数" です。

コンテキスト変数のしくみは次のとおりです。

  • コンテキスト変数を作成および設定するには、UpdateContext 関数を使用します。 最初の更新時にコンテキスト変数がまだ存在しない場合は、既定値が "空白" のコンテキスト変数が作成されます。
  • コンテキスト変数は、レコードを使用して作成および更新します。 他のプログラミング ツールでは、一般的に、"x = 1" のように、代入には "=" を使用します。 コンテキスト変数の場合は、代わりに { x: 1 } を使用します。 コンテキスト変数を使用する場合は、その名前を直接使用します。
  • Navigate 関数を使用すると、画面が表示されるときにコンテキスト変数も設定できます。 画面を一種のプロシージャまたはサブルーチンと考えた場合、これは他のプログラミング ツールのパラメーター渡しに似ています。
  • Navigate を除き、コンテキスト変数は、名前を取得する場所である単一の画面のコンテキストに制限されます。 このコンテキスト以外でコンテキスト変数を使用または設定することはできません。
  • コンテキスト変数では、文字列、数値、レコード、テーブルなど、任意の値を保持できます。
  • ユーザーがアプリを終了すると、そのコンテキスト変数はすべて失われます。

それでは、コンテキスト変数を使用して計算機を作り直してみましょう。

  1. TextInput1 という名前のテキスト入力コントロールと、Button1 および Button2 という名前の 2 つのボタンを追加します。

  2. Button1Text プロパティを "Add" に設定し、Button2Text プロパティを "Clear" に設定します。

  3. ユーザーが [Add] ボタンを選択するたびに累計を更新するために、OnSelect プロパティを次の数式に設定します。
    UpdateContext( { RunningTotal: RunningTotal + Text1 } ).

    ユーザーが初めて [Add] ボタンを選択し、UpdateContext が呼び出されたときに、既定値が "空白" の RunningTotal が作成されます。 加算では、この値が 0 として処理されます。

  4. ユーザーが [Clear] ボタンを選択するたびに累計を 0 に設定するために、OnSelect プロパティを次の数式に設定します。
    UpdateContext( { RunningTotal: 0 } )

    ここでも、UpdateContext を数式 UpdateContext( { RunningTotal: 0 } ) で使用します。

  5. テキスト ボックス コントロールを追加し、Text プロパティを RunningTotal に設定します。

    この数式は自動的に再計算され、ユーザーが選択したボタンに基づいて変更される RunningTotal の値が表示されます。

  6. アプリをプレビューします。前述のように計算機が完成しました。

コレクションの作成

(変数が作成された画面だけでなく) 任意の画面から変数を参照するには、コレクションを使用してグローバル変数を保持します。

コレクションのしくみは次のとおりです。

  • コレクションを作成および設定するには、ClearCollect 関数を使用します。 代わりに Collect 関数を使用できますが、実質的には、古い変数を置き換えるのではなく別の変数が必要になります。
  • コレクションはデータ ソースであるため、テーブルです。 コレクションの単一の値にアクセスするには、First 関数を使用し、結果のレコードから 1 つのフィールドを抽出します。 ClearCollect で単一の値を使用した場合、これは次の例のように Value フィールドになります。
    First( VariableName ).Value
  • すべての数式は、アプリの任意の画面からコレクションにアクセスできます。
  • ユーザーがアプリを終了すると、そのコレクションはすべて空になります。

それでは、コレクションを使用して計算機を作り直してみましょう。

  1. TextInput1 という名前のテキスト入力コントロールと、Button1 および Button2 という名前の 2 つのボタンを追加します。

  2. Button1Text プロパティを "Add" に設定し、Button2Text プロパティを "Clear" に設定します。

  3. ユーザーが [Add] ボタンを選択するたびに累計を更新するために、OnSelect プロパティを次の数式に設定します。
    ClearCollect( RunningTotal, First( RunningTotal ).Value + TextInput1 )

    ClearCollect を単一の値と共に使用することにより、単一の Value フィールドを持つコレクションにレコードが作成されます。 ユーザーが初めて [Add] ボタンを選択し、ClearCollect が呼び出されたときに、RunningTotalになります。 さらに、First によって "空白" が返されます。これは 0 として処理されます。

  4. ユーザーが [Clear] ボタンを選択するたびに累計を 0 に設定するために、OnSelect プロパティを次の数式に設定します。
    ClearCollect( RunningTotal, 0 )

    ここでも、ClearCollect を数式 ClearCollect( RunningTotal, 0 ) で使用します。

  5. 累計を表示するために、テキスト ボックス コントロールを追加し、Text プロパティを次の数式に設定します。
    First(RunningTotal).Value

    この数式により、RunningTotal コレクションの最初のレコードの Value フィールドが抽出されます。 このテキスト ボックスには、ユーザーが選択したボタンに基づいて変更される RunningTotal の値が自動的に表示されます。

  6. 計算機を実行するために、F5 キーを押してプレビューを開き、テキスト入力ボックスに数値を入力して、ボタンを選択します。

  7. 既定のワークスペースに戻るために、Esc キーを押します。

  8. コレクション内の値を確認するために、[ファイル] メニューの [コレクション] を選択します。