未来の日付は入力禁止!Power Appsのカレンダーで選択可能日を制限する方法

経費精算で「2年後の日付」が入力されていたことがあります。操作ミスとはわかっていても、システムが弾いてくれれば防げた話です。

Power Appsの日付ピッカー(Date Picker)は、デフォルトでは過去・未来を問わず、あらゆる日付を選択できてしまいます。ちょっとした設定を追加するだけで、選択できる範囲をぐっと絞れます。

なぜ日付の誤入力が起きるのか

経費精算・勤怠申請・予定登録など、日付を扱うフォームはPower Appsの定番用途です。しかし現場では、スマホ操作中にうっかりスクロールしすぎて数ヶ月先を選んでしまったり、前月の申請を見ながら入力してそのまま日付を更新し忘れたりと、ありえない日付が登録されるトラブルが後を絶ちません。

データを集計する側は、Excelで月次集計をかけた際に「なぜか未来の行がある」という状況に直面し、その調査と修正に余計な時間を取られます。問題は入力者のミスだけでなく、そもそも選べてしまう設計にあります。

Power Appsのフォームコントロールの基本を理解していれば、日付ピッカーにも同じ考え方が使えます。コントロールのプロパティで制御するのが基本です。

モダン日付ピッカーのStartDate / EndDateプロパティ

Power Appsの日付ピッカーには2種類あります。クラシックとモダンです。現在新しく追加されるコントロールはモダンが主流であり、この記事ではモダン版を前提にします。

モダン日付ピッカーには、StartDateEndDateという2つのプロパティがあります。この2つを設定するだけで、カレンダー上で選択できる日付の範囲をコントロールが自動的に制限してくれます。バリデーション式を別途書く必要はありません。

設定方法は非常にシンプルです。

過去90日〜今日だけを選択可能にする設定

経費精算のような過去の日付のみのユースケースに向いた設定です。

  1. 画面にモダン日付ピッカーを追加します
  2. コントロールを選択した状態で、右ペインまたは数式バーから StartDate プロパティを選びます
  3. 次の式を入力します
DateAdd(Today(), -90)

続いて EndDate プロパティに以下を設定します。

Today()

これだけです。カレンダーを開くと、今日より先の日付はグレーアウトされてタップできない状態になります。90日より前の日付も同様です。バリデーション式を一行も書かずに、コントロール自体が入力範囲を守ってくれます。

未来の予定登録(今日〜1年後)を許可する設定

会議室予約や作業予定登録など、未来の日付を入力させたい場合は逆の設定にします。

  • StartDate:Today()(今日以前は選択不可)
  • EndDate:DateAdd(Today(), 365)(1年後以降は選択不可)

こちらも設定値を変えるだけで、同じ考え方が使えます。DateAdd関数の第二引数の数値を変えれば、任意の日数に調整できます。

StartDate / EndDate を設定しない場合の挙動

これらのプロパティを設定しない(またはBlankにした)場合、日付ピッカーは制限なしの状態になります。過去も未来も自由に選べてしまうため、申請系フォームには必ず設定する習慣をつけることをおすすめします。

クラシック版との違い:OnChangeバリデーションパターン

クラシック日付ピッカーにはStartDate/EndDateがありません。そのため、選択後に検知するアプローチが必要になります。

具体的には、コントロールの OnChange プロパティにIf関数を書き、条件を満たさない場合にエラー変数をTrueにします。

If(
    DateValue1.SelectedDate > Today(),
    Set(varDateError, true),
    Set(varDateError, false)
)

そして画面上のラベルコントロールに「未来の日付は選択できません」というメッセージを配置し、その Visible プロパティを varDateError に設定します。このラベルはエラーのある間だけ表示されます。

変数を使ったエラーフラグの管理については、グローバル変数とコンテキスト変数の使い分けガイドを参照してください。

ただし現実的には、クラシックコントロールを今から新規で使う機会は少なくなっています。既存アプリの改修でクラシックが残っている場合はOnChangeパターンで対応し、新規作成ならモダン版のStartDate/EndDateを使うのがよいです。

送信ボタンと連動させる

日付の範囲制限とあわせて、送信ボタンのDisplayModeも制御するとより堅牢になります。

クラシックコントロールを使ってOnChangeパターンで実装した場合、varDateError が true のときはボタンを無効化できます。

If(varDateError, DisplayMode.Disabled, DisplayMode.Edit)

モダン日付ピッカーの場合、StartDate/EndDateの範囲外は物理的に選べないため、原則として送信ボタンの追加制御は不要です。ただし、日付が未選択(Blank)のまま送信されるリスクは残ります。IsBlankでの必須チェックは別途行う必要があります。

必須チェックの組み合わせ方については、必須チェックとエラーメッセージの作り方で詳しく解説しています。

DateAdd関数の基本

この記事で繰り返し登場したDateAdd関数について、簡単に補足しておきます。

DateAdd(基準日, 加算する数値, 単位) という構文で、基準日に対して指定した期間を加減算した日付を返します。単位はデフォルトでは「日(Days)」です。月単位や年単位で制限したい場合は第3引数を指定します。

DateAdd(Today(), -3, TimeUnit.Months)  // 3ヶ月前
DateAdd(Today(), 1, TimeUnit.Years)    // 1年後

月末が存在しない日付(例:2月31日)は自動的に調整されます。経費申請なら「当月1日〜今日」、有給申請なら「今日〜3ヶ月後」のように、業務ルールに合わせて柔軟に設定できます。

入力ミス防止の考え方:「選ばせない」が最強

バリデーションの考え方として、エラーを検知して後から弾くより、そもそも選べない設計にするほうが強いです。モダン日付ピッカーのStartDate/EndDateはまさにその考え方を体現したプロパティです。

Power Apps入力ミス防止ガイドでは、こうした「入力させない」設計の全体像を整理しています。フォーマット制御・選択制御・UX向上・自動化の4アプローチから、現場に合う手段を選んでもらえればと思います。

コントロールのプロパティひとつ変えるだけで、誰も傷つかないフォームが作れます。地味ですが、こういうひと手間が積み重なって使いやすいアプリができていくものです。

Xでフォローしよう