マイカレンダー
マイカレンダーの仕様(1)年月を表示し、手入力による変更を可能とする (2)前月、次月へ移動するボタンを設ける (3)タイトルの曜日は日曜日から開始する (4)タイトルの日曜日、日曜の日の文字は赤にする (5)本日の背景色は緑色にする (6)起動時は本日の年月度とする
この仕様に基づて、カレンダーを作成してみます。参考にして下さい。
【1】DBの作成
1.1 ACCESSを起動して新規DBを作成します。
1.2「テーブル1」が表示されますが 削除します。
今作成しようとするカレンダーでは、テーブルは使いません。
この時の「テーブル1」は表示されているだけですので
「閉じる」で消去されます。
1.3 フォームデザイン から
フォームを作成します。
1.4「ページヘッダー/フッター」を追加します。
今回は、年度と曜日はヘッダー領域、日付は詳細領域に作成
していますので、フッターを消しています。
フォームの一番下にカーソルを合わせて十字のマークが出たら
そのまま上にあげると消えます。
また、フォームの横幅も適当なサイズに 調整してください。
1.5 一旦名前を付けて保存します。
「Calendar」としました。 フォームに追加登録されましたので、 つぎからはデザインビューで編集します。
1.6 作成されたDBのオプションを調整します。
主メニューのファイル → オプション → 現在のデータベースを開き
「フォームの表示」に、起動した時最初に開くフォームを指定します。今は「Calendar」です。
「閉じるときに最適化」のチェックをいれます。
今はとりあえずこれだけで「OK」ボタンを押下して終了してください。
【2】フォームの作成
2.1 フォームデザインタブを開けます。
使用できるコントロールが表示されます。
今回は テキスト、ラベル、コマンドを使用します。
今はコントロールウィザードは OFF(四角の枠がない状態)
にして下さい。
テキストは、ヘッダーの年と月の表示と入力
ラベルは、ヘッダーの年、月、タイトル曜日、詳細の日付の表示
コマンドボタンは、ヘッダーの前月、次月への移動の指示 に使用します。
2.2 テキストボックスの作成
テキストをクリックすると、+記号についたカーソルに形状が変わりますので、配置したい場所で四角形に描写するか、左クリックで放して下さい。テキストボックスと同時にそのテキストのラベルも作成されますので、適当な場所に移動させて、大きさも調整してください。
テキストを移動させるとラベルも一緒に動いてしまいます。別々に移動させたい場合は、左上の黒い四角の上に
カーソルを乗せ 左クリックでそのまま動かしてください。
年の入力用のテキストボックスのプロパティとラベルのプロパティを下記のように編集します。
テキストの名前は 「txyy」、書式は数値で小数点以下の桁数はゼロ、
ラベルの標題は「年」です。
同様に月の入力用のテキストボックスを作成し、テキストのプロパティとラベルのプロパティを編集します。
テキストの名前は「txmm」、書式は数値で小数点以下の桁数はゼロ、
ラベルの標題は「月」です。
入力規則に「txmm」の場合は、月なので、>=1 and <=12 と設定しています。
入力値が、1以上かつ12 以下でなければAccessはエラーメッセージを出してくれます。
「txyy」の場合はゼロ以上、あるいは適当な下限値を設定してください。
2.3 コマンドボタンの作成 フォームメニューからコマンドボタンをクリックして、配置したい場所に作成します。
ボタンの名前も標題も「コマンド0」です。
標題を文字で「前月へ」と修正してもいいのですが、今回はピクチャを設定しています。
ピクチャビルダー(…)を開いて、一覧表の中から「前へ」を選択すると上記のような絵が登録されます。
ボタンの名前を「mae」に変更します。
同様に、次月度へ移行を指示するボタンを作成します。ピクチャは「次へ」を選択します。
名前は「tugi」にしました。
2.4 ラベルの作成 (1)ヘッダー領域
フォームメニューからラベルをクリックして、配置したい場所に作成します。
プロパティで修正しなくても、そのまま「年」と入力するとラベルの表題として登録されます。
同様に「月」を作成します。
背景色は白、前景色は黒です。(初期値です)
標題の曜日「日」~「土」までを作成します。
曜日の背景色を灰色、
「月」~「土」の前景色は青色、
「日」の前景色は赤に設定しています。
前景色のフィールドをクリックすると(…)が出ますので、色パターンから修正してください。
2.5 ラベルの作成 (1)詳細領域
1日から最大31日までの日付用のラベルを作成します。 1日が土曜日の場合は、第1週の日曜日から金曜日
までは空白になりますので、マックス37個の枠が必要となります。
かなり面倒な作業になりますが、コピーしてから整列させると少しは楽です。
Shiftキーを押しながらクリックで選択するか、グリッドから一括で選択してから、主メニューの配置を
開きます。「サイズ/間隔」で大きさを、「配置」で位置をそろえることができます。
ラベルの名前を、第1週の日曜日を「d01」、月曜日を「d02」とし 順に「d37」まで作成し、
標題は空白にして下さい。
年月度から1日の曜日を算出して、その位置のラベルの標題に1、そこから順に日付を入れていくように
プログラミングしています。
例えば、2025年2月の場合 1日が土曜日なので「d01」から「d06」までは空白、「d07」が1、
順にカウントアップして 「d34」が28で末日となり「d35」「d36」「d37」は空白となります。
【3】イベントの処理
3.1 起動時の処理 (Form_Loadイベントの作成)
フォームのイベントタブから、「読み込み時」にイベントプロシジャーを選択して(…)をクリックします。
Visual Basicの画面に切り替わります。
イベント処理のサブ名と「End sub」が用意されますので、この間に処理すべきコードを書きます。
起動時は当年月度のカレンダーを作成します。フォームのテキストボックスには年と月を保存します。
<コード>
<説明> ➀「Option Explicit」 使用する変数(ワーク)を明示的に定義することを宣言しています。 宣言しなければ定義しなくてもエラーにははなりませんが、通常は宣言します。 プログラムミスを発見しやすくなるからです。 ➁「Dim 名前 as 型」 変数を定義します。as 以降の文字で型を定義しています。 Controlはラベル等のコントロール、Dateは日付です。 型は他にも沢山ありますが出てきたときに説明します。 この場所で定義するとこのモジュール内(今はフォーム)で有効となります。 プロシジャー(サブ)内で定義するとそのプロシジャー内でのみ有効です。 ➂ today=Format(Now(),"yyyy/mm/dd") 「Now()」は本日、「Format」で "yyyy/mm/dd" の形式(西暦年月日)に編集して保存しています。 「Me.txyy」= Year(today) 「Me.」はこのコントロールを指します。年のテキストボックスに「today」の年を保存しています。 「Me.txmm」は同様に「today」の月を保存しています。 ➃ Call CalDisp カレンダーに展開するサブを呼び出しています。(サブのコードは後述) ➄ Me.Refresh 画面の再表示。
3.2 「前月へ」押下時の処理 (クリックイベントの作成)
現在フォームに表示されている年月の、前月度のカレンダーを表示します。
<コード>
<説明> ➀「txyy」と「txmm」から月初(1日)の年月日の形を作り出しています。 ア)Right$(Str$(10000+Me.txyy),4) 年を4桁の文字列に変換し右から4文字取り出しています。 Str$はカッコ内の数値を文字列に変換、Right$はカッコ内の文字列を右から指定文字数分を 取り出す関数です。 txyy=2025 だとすると、10000+2025 を文字列に変換すると 12025となりますが前に符号が付き ▢12025となります。(正の場合は空白)よって、右から4文字の2025を取り出しています。 イ)Right$(Str$(100+Me.txmm),2) 同様に月を2桁の文字列に変換しています。 ウ)CDate(4桁の年 + "/" + 2桁の月 + "/01") カッコ内の文字列を日付に変換しています。カッコ内は日付の形式にする必要があります。 Access は、変換時に不適切な日付(例えば、2月30日)の場合はエラーを返してくれます。 カレンダーに展開するサブ(CalDisp)ではこの機能を利用して、日付のチェックをしています。 エ)「+ "/"」:プラス記号は文字を連結します。文字は""で囲みます。 ➁ DateAdd("m",-1,wkdate) 「wkdate」の月("m")の値を -1 する。つまり前月の年月度を計算します。 1月なら前年12月を返してくれます。 ➂ 「wkdate」の年を「txyy」、月を「txmm」に保存し「CalDisp」サブを呼び出しています。
3.3 「次月へ」押下時の処理 (クリックイベントの作成)
「2.前月へ」と同様です。「wkdate」 の計算式のみ修正します。
wkdate = DateAdd(“m”, +1, wkdate)
月を +1 して次月度を計算。12月であれば翌年1月と計算してくれます。
3.4 年の入力後の処理 (Exit イベントの作成)
「フォーカス喪失時」にイベントプロシージャーを選択してクリックします。
どのイベントを利用するかは難しいのですが、今回は、カーソルが他のコントロールに移動した時に発生
する「フォーカス喪失時」を選択しました。
年の値が更新されてか否かにかかわらず、年月日を再計算し直します。
3.5 月の入力後の処理 (Exit イベントの作成)
「4.年の入力」と全く同じです。 「フォーカス喪失時」イベントを使います。
3.6 共通処理の作成(その1) 年月の再計算を共通サブにする。
<コード>
<説明> ➀ ➀~➃までのイベント処理を共通サブ「再表示」を呼び出すように修正しています。 カッコの中は引数と言いますが、呼び出したサブルーチに値を持たせることができます。 この例では、「前月へ」は 1,「次月へ」は 2,「年の入力」は 3,「月の入力」も 3 です。 この引数を再表示サブでは「sts」で受けています。 ➄ 「wkdate」を[txyy][txmm]から月初(1日)の日付を再計算。 ➅「Select 文」で、引数の値によって処理を場合分けします。 Case 1 :「前月へ」なので、前月の年月度を計算 Case 2 :「次月へ」なので、次月の年月度を計算 Case Else :この例では 3 になりますが何も処理がありません。 Case 3 として「年の入力」「月の入力」の場合、と分けても構いませんが、1行目で「wkdate」が 計算済なので、やはり書くべきコードがありませんので「Else文」にまとめました。 「Else文」を書かないと、場合分けが不十分であった時などには下に流れてしまうことがありますので なるべく書く方がいいかと思います。 ➆ 新しく計算された年、月をフォームに再表示して、「CalDisp」を呼び出しています。
3.7 共通処理の作成(その2) カレンダーに展開
<コード>
<説明> ➀ このプロシジャー(CalDispサブ)内で使用する変数を定義しています。 Integer:整数 -32768 ~ 32767 の範囲の数値(2バイト(16ビット)で表現できる数値) String * 2: 文字の宣言。数字は文字数 ➁ 日付用の 37個のラベルの標題を空白、背景色を白にします。(初期設定です) ア)For ix1=1 to 37 ~ Next この間の処理を、ix1 を 1から 1ずつカウントアップし 37 になるまで繰り返します。 イ)Set LabelName=Controls("d"+Right$(Str$(100+ix1),2)) 「d01」~「d37」と作り出された値をコントロールとしてLabelNameにセットします。 ix1=1の場合は、「d01」と「LabelName」は同じコントロールを指すことになります。 ウ)LabelName.Caption=" " ラベルの標題(Caption)を空白にします。 エ)LabelName.BackColor=16777215 ラベルの背景色(BackColor)を白にします。 色コードは、16進数6桁で頭から2文字ずつ、赤、緑、青で表します。 白色は16進数では &HFFFFFF、10進数では 255*256*256+255*256+255=16777215 です。 ➂ 「txyy」「txmm」の年月から月初(1日)の曜日を求めます。 stdate=CDate(wkyy+"/"+wkmm+ "/01") (wkyy,wkmmは文字列) stweek=Weekday(stdate) 月初の曜日の番号を取得します。日曜日は 1、順に土曜日は 7 です。 ➃ On Error GoTo CalDisp_err ~ CalDisp_err:Resume re この後に続くステップでエラーが発生した場合には、CalDisp_errにジャンプするようにしています。 ジャンプ先ではエラー処理を行います。今は「Resume」で「re」に戻しています。 「:」はプログラムのラベルです。 ➄ 日付をラベルの標題に入登録していきます。本日と同じ日になった場合は背景色を緑にします。 ア)For IX1 = 1 to 31 ~ Next 1日から31日までの処理を繰り返します。 イ) wkdd = ix1 + stweek - 1 stweek には 1日の曜日番号を保存していました。 つまり 1日のラベル名は d+stweek で、標題は 1 です。 今、iX1 は 1から開始していますので、「wkdd」はマイナス 1 と計算しています。 ウ)wkdate=CDate(wkyy + "/" + wkmm + "/" + Right$(Str$(ix1 + 100),2) 「wkdate」を ix1 を日とした日付の形式にして、CDateで日付に変換しています。 カッコ内の文字列が日付として不適切な場合には、CalDisp_errにジャンプします。 ➃の On Error はこの CDate の判定結果を利用するためです。 正しい日付の場合はそのまま次のステップに進みます。 エ)「wkdate」と「today」が同じであれば、つまり本日であれば背景色を緑にします。 if Year(wkdate) = Year(today) and Month(wkdate) = Month(today) then if ix1 = Day(today) then LabeName.BackColor = 65024 (&H00FF00) end if end if Yearで年を、Monthで月を比較し、ともに等しければ、更に日を ix1 と比較しています。 オ)LabelName.Caption = ix1 ラベルの標題に ix1 を登録します。 カ)「re」: for 文の最後 「Next」のラベルです。 CalDisp_err の場合、ここに戻すためにラベルを付けています。 CDateでエラーになった場合は、そこから31までエラーになり続けます。 Next文に戻らず Exit してもいいのですが、今は for文を完結するようにしました。 「
【4】実行
4.1 実行
オブジェクト一覧から「開く」を押下するか、
「フォームビュー」をクリックすると実行します。
初期状態だと右のようになります。
テーブルを使用していませんので
レコードセレクタ(1レコードの範囲)
移動ボタン(レコードの移動・検索)
は不要です。
また、フォームデザインの枠の中に
埋め込まれた状態で大変不自由です。
フォームのプロパティを修正します。
4.2 フォームのプロパティの修正
➀ レコードセレクタ:いいえ
➁ 移動ボタン:いいえ
➂ 区切り線:いいえ 「はい」にすると、ページヘッダーと詳細の間に横線が入ります。
➃ 閉じるボタン:はい 他に閉じる機能を用意していませんので必要です。
➄ 最小化/最大化ボタンはどちらでもいいかと思います。
➅ ポップアップ:はい フォーム画面を自由に動かすことができるようになります。
最後までご覧くださりありがとうございました。お役に立てれば幸いです。