Microsoft Access 掲示板

カレンダーをキー移動した際の症状について / 3

4 コメント
views
4 フォロー
3

まず、FirstDay変数には、カレンダーの先頭の日付の一つ前の日付か格納されます。
1900年1月のカレンダーだと、1/1は月曜なので、その前日の日曜は、1899/12/31 になりこれが先頭になります。
FirstDayには、1899/12/30 が格納されます。

修正前の

   If FirstDay > 0 Then
        Me("D" & vDate - FirstDay).BackStyle = 0 '透明
    End If

のコードの意味は、FirstDay に日付が代入されているかどうかをチェックしています。
つまり、カレンダーフォーム起動直後で、まだ、FirstDayに何も代入されていない場合はなにもせずに、
日付が代入されていたら選択日付のラベルの背景色を透明に戻す、
という処理をしています。

VBAの Date型の初期値(宣言してから何も代入されていないときの値)は #1899/12/30# でこれは内部的には 0 です。FirstDay > 0 でなければ、FirstDayは初期値のままでフォーム起動直後と判断していました。

ところが、1900年1月のカレンダーだと FirstDay には、1899/12/30 が代入されてしまいます。つまり、初期値と同じ値になります。このため、カレンダーの先頭日付か代入されているのに、初期値のままと判断してなにもしないことになり、後の処理で矛盾が発生してしまい動作がおかしくなりました。

修正後は、
FirstDay は Variant型で宣言しました。Variant型は初期値(代入前)は Empty値という特殊な値になります。また、どのようなデータ型でも代入できます。もちろんDate型の値も代入できます。IsEmpty関数でEmpty値かどうか判定できます。IsEmpty(FirstDay) が True なら確実に、初期値のまま(代入されていない)という判定ができます。

通報 ...
  • 4
    ゲッキョク駐車場 2020/05/28 (木) 08:55:15 cb55f@f6500 >> 3

    丁寧な解説ありがとうございます!
    Date型や、variant型を特によく理解せずに使ってたので、すごく助かりました!😆
    また、躓きましたら、助けを求めるかもしれません。
    その時はよろしくお願いいたします!