Accessお手本データベースのホームへ戻る

スタッフのスケジュールを管理するお手本データベース

 

3-5-1 スタッフのスケジュールを管理するサンプルデータベース

 

このサンプルデータベースは、スタッフのスケジュールを管理することができます。スタッフのコンボボックスから、担当者を選択すると当月のカレンダーが表示されます。デフォルトとして、スケジュール表には当日のスケジュールが表示されます。カレンダーの日付をクリックすると、その日のスケジュールが表示されます。スケジュール表には、30分単位で予定を入力することができます。例えば、午前9時から午前10時までのスケジュールを入力するとは、マウスを午前9時の時刻に移動して左ボタンをクリックします。このとき、9:00~9:30の時間帯が青色に変わります。次に、マウスを午前10時の時刻に移動して右ボタンをクリックします。これで、9:00~10:00までの時間帯が青色に変わります。更に、青色の時間帯にマウスを移動して左ボタンをクリックすると、時間帯が赤色に変わり作業内容を入力するサブフォームが表示されます。作業内容のには、作業区分と作業内容を入力します。既に登録したスケジュールを取り消すには、青色の時間帯にマウスを移動してシフトキーを押しながら、左ボタンをクリックします。

 

サンプルデータベース(CH3-5.mdb)では、以下のノウハウを習得することができます。

 

◆ フォームにカレンダーの機能を付加する方法

◆ フォームからマウスで時間帯を選択する方法

◆ サブフォームを実行時に表示させる方法

◆ メイン/サブフォーム間で情報を交換する方法

◆ フォームに作成したコントロールのイベント処理をクラスモジュールで集中管理する方法

 

   サンプルデータベースに必要なテーブルを用意するには

 

1 Access を起動して作業フォルダに、新規データベースCH3-5.mdbを作成します。

 

2 データベースウィンドウからテーブルをクリックしたら、新規作成のボタンをクリックします。テーブルの新規作成ダイアログが表示されたら、一覧からデザインビューを選択してOKボタンをクリックします。テーブルのデザインビューが表示されたら、表3-5-1に示すtblScheduleテーブルのフィールドを入力します。尚、下線が引いてあるフィールド名は、主キーを意味します。テーブルをtblScheduleの名称で保存して閉じます。同様の手順で、tblStafftblWorkTypeのテーブルを作成して保存します。

 

3-5-1 tblScheduleテーブルの構造

テーブル名

説   明

作成日

最終更新日

tblSchedule

スケジュールテーブル

 

 

No

フィールド名

データ型

サイズ

説    明

1

社員ID

数値型

4

サイズ:長整数型

2

作業日

日付/時刻型

8

書式:日付(S)

3

開始時間

日付/時刻型

8

書式:時刻(S)

4

終了時間

日付/時刻型

8

書式:時刻(S)

5

作業ID

数値型

4

サイズ:長整数型

6

作業内容

メモ型

0

 

 

3-5-2 tblStaffテーブルの構造

テーブル名

説   明

作成日

最終更新日

tblStaff

スタッフテーブル

 

 

No

フィールド名

データ型

サイズ

説    明

1

社員ID

数値型

4

サイズ:長整数型

2

フリガナ

テキスト型

80

サイズ:80

3

氏名

テキスト型

40

サイズ:40

 

3-5-3 tblWorkTypeテーブルの構造

テーブル名

説   明

作成日

最終更新日

tblWorkType

作業区分テーブル

 

 

No

フィールド名

データ型

サイズ

説    明

2

作業ID

数値型

4

サイズ:長整数型

3

作業区分名

テキスト型

50

サイズ:50

 

3 tblStaffテーブルをビューモードで開いたら、サンプルデータを入力して保存します。

 

3-5-2 tblStaffテーブルのサンプルデータを入力して保存

 

4 tblWorkTypeテーブルをビューモードで開いたら、サンプルデータを入力して保存します。

 

3-5-3 tblWorkTypeテーブルのサンプルデータを入力して保存

 

5 テーブルの準備ができたらAccessを終了させます。

 

 

   カレンダーを表示するサブフォームを作成するには

 

1 Access を起動したら作業フォルダに作成したCH3-5.mdbを開きます。

 

2 データベースウィンドウのフォームをクリックしたら、一覧からデザインビューでフォームを作成するをダブルクリックします。フォームのデザインビューが表示されたら、メニューからツールボックスのアイコンをクリックして、ツールボックスを表示させます。ツールボックスからコントロールの選択のアイコンをクリックして、コントロールの一覧からカレンダーコントロール X.Xを選択してフォーム左上に貼り付けます。コントロールの一覧に、カレンダーコントロール X.Xが表示されないときは、Access 2000/2002/2003/2007CD-ROMからインストールしてください。ActiveXコントロールのプロパティを表示させたら、コントロール名をctlCalendarに書き替えます。

 

3-5-4 ActiveXコントロールの一覧からカレンダーコントロール X.Xを選択

 

3-5-5 ActiveXカレンダーコントロールをフォームに貼り付けた例

 

3 カレンダーコントロールをダブルクリックして、Calendarのプロパティを表示させます。表示オプションのタイトルのチェックを外して、タイトルを非表示にします。OKボタンをクリックしてプロパティを閉じます。

 

3-5-6 Calendarのプロパティ

 

4 メニューからコードのアイコンをクリックして、フォームモジュールを表示させます。CH3-5.mdbを開いたら、sfrCalendarのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト3-5-1を参照してください。

 

5 フォームをsfrCalendarの名称で保存して閉じます。

 

 

Sub Form_Load()イベントの処理

このイベントは、フォームが開かれてデータがロードされたときに実行されます。このイベントでは、ActiveXカレンダーコントロールにデフォルトとしてシステム日付を設定します。また、サブプロシージャctlCalendar_AfterUpdateを呼び出して、メインフォームのSelectedDateプロパティにActiveXカレンダーの日付を設定します。

 

 

Sub ctlCalendar_AfterUpdate()イベントの処理

このイベントは、ActiveXカレンダーの日付をクリックしたときに実行されます。このイベントでは、sfrCalendarがサブフォームとして開かれているとき、ActiveXカレンダーで選択した日付をメインフォームのSelectedDateプロパティに設定します。SelectedDateプロパティは、メインフォームに追加したアプリ独自のプロパティです。

 

If IsSubForm() Then

               Me.Parent.SelectedDate = Me.ctlCalendar

End If

 

Function IsSubForm()関数の処理

この関数は、現在開かれているフォームがサブフォームかどうか調べます。戻り値として、サブフォームのときはTrue、サブフォームでないときはFalseを返します。

 

リスト3-5-1 sfrCalendarのフォームモジュール

Option Compare Database

Option Explicit

 

Private Sub ctlCalendar_AfterUpdate()

  If IsSubForm() Then

    Me.Parent.SelectedDate = Me.ctlCalendar

  End If

End Sub

 

Private Sub Form_Load()

  Me.ctlCalendar = Date

  ctlCalendar_AfterUpdate

End Sub

 

Private Function IsSubForm()

  Dim strName As String

  On Error Resume Next

  strName = Me.Parent.Name

  IsSubForm = (Err.Number = 0)

  Err.Clear

End Function

 

 

   時刻表を表示するサブフォームを作成するには

 

1 Access を起動したら作業フォルダに作成した、CH3-5.mdbを開きます。

 

2 データベースウィンドウのフォームをクリックしたら、一覧からデザインビューでフォームを作成するをダブルクリックします。フォームのデザインビューが表示されたら、以下の手順で図1-21-7のような時刻表を作成します。

 

ツールボックスからラベルのアイコンをクリックして0:0024:00までのラベルを作成します。ツールボックスから四角形のアイコンをクリックして、0:0024:00までのラベルに重ねます。四角形のプロパティを表示させて、背景色を濃灰色に設定します。

 

ツールボックスから直線のアイコンをクリックして、0:0024:00まで水平線を2本引きます。ツールボックスから直線のアイコンをクリックして、30分間隔で垂直線を引きます。垂直線のプロパティを表示させて分単位(0:30,1:30,2:30,3:30・・・・)の線を点線にします。ツールボックスから四角形のアイコンをクリックして、30分単位に四角形を作成します。ここで作成した30分単位の四角形のコントロール名は、”Bar”hhmmを付加した名称に書き替えます。例えば、09:0009:30のコントロール名は、Bar0900Bar0930のようになります。

 

ツールボックスから四角形のアイコンをクリックして、0:009:009:0018:0018:0024:00の3個の四角形を作成します。四角形のプロパティを表示させたら、時間帯別に異なる背景色を設定します。

 

 

3-5-4  sfrTimeChartに作成したコントロールのプロパティ

コントロールの種類

プロパティ

ラベルn(0:0024:00

標題

0:0024:00

四角形1(時刻のラベルに重ねる)

背景色

9868950

四角形2(0:0009:00の範囲)

背景色

10666239

四角形3(9:0018:00の範囲)

背景色

13557503

四角形4(18:0024:00の範囲)

背景色

10666239

直線1(0:0024:00までの水平線上段)

境界線スタイル

実線

直線2(0:0024:00までの水平線下段)

境界線スタイル

実線

直線n(30分間隔の垂直線)

境界線スタイル

分間隔:点線1

時間隔:実線

 

 

3-5-7 サブフォームに時刻表を作成した例

 

3-5-8 サブフォーム時刻表の分解図

 

3 メニューからコードのアイコンをクリックしてフォームモジュールを表示させます。CH3-5.mdbを開いたら、sfrTimeChartのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト3-5-2を参照してください。CH3-5.mdbからモジュールbasMyLibとクラスモジュールclsTimeChartをインポートします。

 

4 サブフォームをsfrTimeChartの名称で保存して閉じます。

 

 

Sub Form_Open()イベントの処理

このイベントは、サブフォームが開かれたときに実行されます。このイベントでは、時刻表のクラスモジュールclsTimeChartのインスタンスを生成してオブジェクト変数mclsTMにポインタを保存します。clsTimeChartRegisterControlsメソッドを実行してサブフォームsfrTimeChartを登録します。sfrTimeChartの予定時刻をクリックしたときのイベント処理は、clsTimeChartで集中管理します。clsTimeChartのソースコードの説明は、紙面の都合上省略します。興味のある方は、CH3-5.mdbを参照してください。

 

 

Sub DrawChart()メソッド

このメソッドは、メインフォームfrmScheduleSub DrawTimeChartから呼ばれます。このメソッドは、tblScheduleテーブルから特定の作業日のスケジュールデータを読み込んで、時刻表にスケジュールを表示します。OpenRecordsetメソッドでは、tblScheduleテーブルから特定の作業日のレコードセットを作成します。Do Until .EOF…Loopでは、先頭から最終レコードまで順番にスケジュールデータを読み込みます。読み込んだデータを、clsTimeChartDrawChartメソッドの引数に指定して、作業時間帯(開始時間/終了時間で範囲指定)を青色で表示します。

 

  Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

  With rs

    Do Until .EOF

      mclsTM.DrawChart Format(!開始時間, "hh:mm"), _

        Format(!終了時間, "hh:mm"), conBlue

      .MoveNext

    Loop

    .Close

  End With

 

リスト3-5-2  sfrTimeChartのフォームモジュール

Option Compare Database

Option Explicit

 

Private mclsTM As clsTimeChart

Private Const conRed = 255

Private Const conBlue = 16744448

Private Const conDefault = 16777215

 

' ------------------------------------------------------

' Form specific methods

' ------------------------------------------------------

Public Sub DrawChart(lngStaffID As Long, dtmDate As Date)

  Dim strSQL As String

  Dim rs As DAO.Recordset

 

  strSQL = "SELECT tblSchedule.開始時間, tblSchedule.終了時間" _

    & " FROM tblSchedule" _

    & " WHERE (((tblSchedule.社員ID)=" & lngStaffID & ") AND " _

    & " ((tblSchedule.作業日)=#" _

    & Format(dtmDate, "mm/dd/yyyy") & "#));"

  Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

  With rs

    Do Until .EOF

      mclsTM.DrawChart Format(!開始時間, "hh:mm"), _

        Format(!終了時間, "hh:mm"), conBlue

      .MoveNext

    Loop

    .Close

  End With

  Set rs = Nothing

End Sub

 

' ---------------------------------------

' Event Procedures

' ---------------------------------------

Private Sub Form_Open(Cancel As Integer)

  Set mclsTM = New clsTimeChart

  mclsTM.RegisterControls Me

End Sub

 

 

   作業内容を入力するサブフォームを作成するには

 

1 Access を起動したら作業フォルダに作成した、CH3-5.mdbを開きます。

 

2 データベースウィンドウからフォームをクリックしたら、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、一覧からデザインビュを選択します。基になるテーブル/クエリのコンボボックスからtblScheduleテーブルを選択したらOKボタンをクリックします。

 

3 フォームのデザインビューが表示されたら、ツールボックスからコンボボックスのアイコンをクリックして、フォーム左上に作業IDのコンボボックスを作成します。このコンボボックスには、tblWorkTypeテーブルの作業IDと作業区分名を指定しますが、作業IDの列幅を0cmに設定して非表示にします。ツールボックスからラベルのアイコンをクリックして、コンボボックスの右に配置します。このラベルの標題には実行時、作業日と作業時間を設定します。メニューからフィールドリストのアイコンをクリックして、tblScheduleテーブルのフィールドリストを表示させます。フィールドリストから、作業内容のフィールドをドラッグして作業IDのコンボボックスの下に配置します。フォームに作成したコントロールのプロパティを表3-5-5のように設定します。

 

3-5-5  sfrDescriptionに作成したコントロールのプロパティ

コントロールの種類

プロパティ

コンボボックス

名前

cboWorkID

コントロールソース

作業ID

値集合タイプ

テーブル/クエリ

値集合ソース

SELECT tblWorkType.作業ID, tblWorkType.作業区分名

FROM tblWorkType

ORDER BY tblWorkType.作業ID;

連結列

列数

列幅

0cm;2.5cm

ラベル

名前

lblDateTime

背景色

14680063

テキストボックス

コントロールソース

作業内容

 

 

3-5-9 sfrDescriptionにコンボボックス、ラベル、テキストボックスを作成した例

 

4 メニューからコードのアイコンをクリックして、フォームモジュールを表示させます。CH3-5.mdbを開いたら、sfrDescriptionのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト3-5-3を参照してください。

 

5 フォームをsfrDescriptionの名称で保存したら、Accessを終了させます。

 

 

Sub Form_Open()イベントの処理

このイベントは、フォームが開かれたときに実行されます。このイベントでは、tblScheduleテーブルから特定のスタッフID、作業日、作業時間のデータを読み込んでフォーム上に表示します。尚、このフォームのレコードセットは、実行時ダイナミックに作成します。メモリ変数strSQLには、フォームで使用するレコードセットのSQLを作成します。このSQLには、WHERE句で社員ID作業日開始時間を指定してフィルタ条件を設定します。フィルタ条件に設定する値は、メインフォームのプロパティから取得します。

 

lngStaffID = Me.Parent.Staffid

dtmDate = Me.Parent.SelectedDate

              strTime = Me.Parent.SelectedTime

 

OpenRecordsetメソッドでレコードセットを開いたら、レコードセットが空かどうか調べます。空(未入力)のときは、AddNewメソッドで新規レコードを追加します。メモリ変数rsに格納されているレコードセットオブジェクトを、フォームのRecordsetプロパティに設定してレコードセットをダイナミックに切り替えます。

 

 Set .Recordset = rs

 

ラベルの標題に、作業日、曜日、作業開始時間、作業終了時間を設定したら、フォームの可視(Visible)プロパティをTrueに設定して表示します。

 

重要:サブプロシージャの最後にある、レコードセットを閉じるステートメントはコメントにしています。OnOpenイベントで開いたレコードセットを閉じると、フォームのレコードセットも閉じられてしまいます。

 

 

リスト3-5-3 sfrDescriptionのフォームモジュール

Option Compare Database

Option Explicit

 

' ----------------------------------------

' Event Procedures

' ----------------------------------------

Private Sub Form_Open(Cancel As Integer)

  Dim strSQL As String

  Dim strSQL2 As String

  Dim db As DAO.Database

  Dim rs As DAO.Recordset

 

  Dim lngStaffID As Long

  Dim dtmDate As Date

  Dim strTime As String ' hh:mm hh:mm

  Dim strStartTime As String

  Dim strEndTime As String

 

  If Not IsSubForm() Then

    Exit Sub

  End If

 

  lngStaffID = Me.Parent.Staffid

  dtmDate = Me.Parent.SelectedDate

  strTime = Me.Parent.SelectedTime

  strStartTime = Left(strTime, 5) ' hh:mm

  strEndTime = Right(strTime, 5)  ' hh:mm

 

  strSQL = "SELECT tblSchedule.社員ID, tblSchedule.作業日," _

    & " tblSchedule.開始時間, tblSchedule.終了時間," _

    & " tblSchedule.作業ID, tblSchedule.作業内容" _

    & " FROM tblSchedule" _

    & " WHERE (((tblSchedule.社員ID)=" & lngStaffID & ") AND " _

    & " ((tblSchedule.作業日)=#" & Format(dtmDate, "mm/dd/yyyy") _

    & "#) AND " _

    & " ((tblSchedule.開始時間)=#" & strStartTime & "#));"

  ' MsgBox strSQL

  Set db = CurrentDb

  Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)

  With rs

    If .EOF Or .BOF Then

      .AddNew

        !社員ID = lngStaffID

        !作業日 = dtmDate

        !開始時間 = strStartTime

        !終了時間 = strEndTime

      .Update

      .MoveFirst

    End If

  End With

 

  With Me

    .Visible = False

    Set .Recordset = rs

    .lblDateTime.Caption = Format([作業日], "md") _

      & "(" & Format([作業日], "aaa") & ")  " _

      & Format([開始時間], "hh:mm") & " " _

      & Format([終了時間], "hh:mm")

    .Visible = True

  End With 

  ‘ rs.Close

  ‘ db.Close

  Set rs = Nothing

  Set db = Nothing

 

End Sub

 

' --------------------------------------

' Local Procedures

' --------------------------------------

Private Function IsSubForm()

  Dim strName As String

  On Error Resume Next

  strName = Me.Parent.Name

  IsSubForm = (Err.Number = 0)

  Err.Clear

End Function

 

● メインフォームにサブフォームを配置して連動させるには

 

1 Access を起動したら作業フォルダに作成した、CH3-5.mdbを開きます。

 

2 データベースウィンドウからフォームをクリックしたら、一覧からデザインビューでフォームを作成するをダブルクリックします。

 

3 フォームのデザインビューが表示されたら、ツールボックスからコンボボックスのアイコンをクリックして、フォームの上位左にスタッフのコンボボックスを作成します。このコンボボックスには、tblStaffテーブルの社員IDと氏名を指定しますが、社員IDの列幅を0cmに設定して非表示にします。データベースウィンドウからsfrCalendarのアイコンをドラッグして、コンボボックスの下にカレンダーのサブフォームを配置します。サブフォームのプロパティを表示させたら、コントロール名をCalendarに書き替えます。それから、ソースオブジェクトを空にしてサブフォームがロードされないようにします。サブフォームは、実行時ダイナミックにロードします。

 

データベースウィンドウからsfrTimeChartのアイコンをドラッグして、カレンダーの下に時刻表のサブフォームを配置します。サブフォームのプロパティを表示させたら、コントロール名をTimeChartに書き替えます。ソースオブジェクトを空にして、サブフォームがロードされないようにします。

 

ツールボックスからラベルのアイコンをクリックしたら、時刻表の右上に作業日と作業時間を表示するラベルを作成します。

 

データベースウィンドウからsfrDescriptionのアイコンをドラッグして、コンボボックスの右に配置します。サブフォームのプロパティを表示させたら、コントロール名をDescriptionに書き替えます。ソースオブジェクトを空にしてサブフォームがロードされないようにします。

 

ツールボックスからラベルのアイコンをクリックしたら、フォーム最下位に配置します。ラベルの標題には、表3-5-6に示すような説明を入力します。

 

3-5-6 frmScheduleに作成したコントロールのプロパティ

コントロールの種類

プロパティ

コンボボックス

名前

cboStaffID

値集合タイプ

テーブル/クエリ

値集合ソース

SELECT tblStaff.社員ID, tblStaff.氏名

FROM tblStaff

ORDER BY tblStaff.社員ID;

連結列

列数

列幅

0cm;2.5cm

サブフォーム1

名前

Calendar

ソースオブジェクト

実行時設定

サブフォーム2

名前

TimeChart

ソースオブジェクト

実行時設定

サブフォーム3

名前

Description

ソースオブジェクト

実行時設定

ラベル1

名前

lblSelDate

標題

実行時作業日を設定

ラベル2

名前

lblSelTime

標題

実行時作業時間を設定

ラベル3

名前

lblHelp

標題

 

予定時間(開始/終了)の設定方法:

・開始時間選択 => 開始時間にマウスを移動して左ボタンクリック(青色に変化)

・終了時間選択 => 終了時間にマウスを移動して右ボタンクリック(青色に変化)

・作業内容入力 => 青色の時間帯をマウスの左ボタンでクリック(赤色に変化) => 作業区分と作業内容入力

・予定の取り消し=> 取り消しする時間帯(青色)にマウスを移動してシフトキーを押しながら左ボタンをクリック(白色に変化)

 

 

 

3-5-10 メインフォームsfrScheduleに3個のサブフォームを配置した例

 

4 メニューからコードのアイコンをクリックしてフォームモジュールを表示します。CH3-5.mdbを開いたら、frmScheduleのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト3-5-4を参照してください。

 

5 フォームをビューモードで開いたら、スタッフのコンボボックスから担当者をクリックします。カレンダーのサブフォームが表示されますので、作業日をクリックします。時刻表のサブフォームの開始時刻にマウスを移動して左ボタンをクリックします。終了時刻にマウスを移動して右ボタンをクリックします。作業時間帯が青色で表示されたら、マウスを移動して左ボタンをクリックします。作業内容を入力するサブフォームが表示されますので、作業IDと作業内容を入力します。以下、同様の手順でスケジュールを入力したら、カレンダーから作業日をクリックして登録したスケジュールが正常に表示されるか確認します。

 

6 正常に動作することを確認したら、メインフォームをfrmScheduleの名称で保存して、Accessを終了します。

 

3-5-11 サンプルデータベースのモジュールフロー

 

Sub cboStaffID_AfterUpdate()イベントの処理

このイベントは、スタッフIDのコンボボックスから担当者をクリックしたときに実行されます。このイベントでは、コンボボックスから選択したスタッフIDを、StaffIDプロパティに設定します。サブフォームのソースオブジェクトを更新して、サブフォームsfrCalendarをロードします。最後に、DrawTimeChartを呼び出して時刻表のサブフォームをロードします。

 

Me.Calendar.SourceObject = "sfrCalendar"

 

 

Sub DrawTimeChart()の処理

このサブプロシージャでは、サブフォームsfrTimeChartをロードしてスケジュールを表示します。StaffIDプロパティとSelectedDateプロパティに値が設定されているとき、時刻表サブフォームのソースオブジェクトを更新して、サブフォームsfrTimeChartをロードします。

Me.TimeChart.SourceObject = "sfrTimeChart"

 

サブフォームsfrTimeChartをロードしたら、サブフォームのDrawChartメソッドを実行して作業時間帯を青色に変えます。

 

 

Property Get/Let SelectedDate()

アプリ独自のプロパティで、作業日付を参照/設定します。Getは、プロパティを参照することを意味します。Letは、プロパティを設定(更新)することを意味します。

 

 

Property Get/Let SelectedTime()

アプリ独自のプロパティで、作業時間を参照/設定します。Getは、プロパティを参照することを意味します。Letは、プロパティを設定(更新)することを意味します。作業時間のプロパティには、開始時間と終了時間が(HH:MMHH:MM)の形式で格納されています。

 

 

Property Get/Let Staffid()

アプリ独自のプロパティで、スタッフIDを参照/設定します。Getは、プロパティを参照することを意味します。Letは、プロパティを設定(更新)することを意味します。

 

リスト3-5-5 frmScheduleのフォームモジュール

Option Compare Database

Option Explicit

 

Private mlngStaffID As Long

Private mdtmSelectedDate As Date

Private mstrSelectedTime As String  ' hh:mm hh:mm

 

'------------------------------------------------

' Main form specific properties

'------------------------------------------------

Public Property Get SelectedDate() As Date

  SelectedDate = mdtmSelectedDate

End Property

 

Public Property Let SelectedDate(dtmDate As Date)

  mdtmSelectedDate = dtmDate

  Me.lblSelDate.Caption = Format(dtmDate, "md") _

    & "(" & Format(dtmDate, "aaa") & ")"

  Call DrawTimeChart

End Property

 

Public Property Get SelectedTime() As String

  SelectedTime = mstrSelectedTime ' hh:mm hh:mm

End Property

 

Public Property Let SelectedTime(strTime As String)

  mstrSelectedTime = strTime

  Me.lblSelTime.Caption = strTime

End Property

 

Public Property Get Staffid() As Long

  Staffid = mlngStaffID

End Property

 

Public Property Let Staffid(lngStaffID As Long)

  mlngStaffID = lngStaffID

End Property

 

' ----------------------------------------

' Event procedures

' ----------------------------------------

 

Private Sub Form_Open(Cancel As Integer)

  SetAppTitle_FS ("Time Scheduler (C) " _

    & Year(Date) & " by Akio Kasai")

End Sub

 

Private Sub cboStaffID_AfterUpdate()

  Staffid = Me.cboStaffID.Value

  Me.Calendar.SourceObject = "sfrCalendar"

  Call DrawTimeChart

End Sub

 

' ----------------------------------------

' Local Procedures

' ----------------------------------------

Private Sub DrawTimeChart()

  If Nz(Me.Staffid, 0) <> 0 _

    And Len(Nz(Me.SelectedDate, "")) <> 0 Then

    Me.TimeChart.SourceObject = "sfrTimeChart"

    Me.TimeChart.Form.DrawChart Me.Staffid, Me.SelectedDate

    Me.Description.SourceObject = vbNullString

  End If

End Sub

 

 

Tip

時刻表からマウスで時刻を選択するには(その2):

 

サンプルデータベースでは、時刻表からマウスで時刻をクリックしたとき、四角形のコントロールのOnMouseDownイベントを利用して青色に変更しています。clsTimeChartで、四角形のOnMouseDownイベントを取得するには、WithEventに四角形のコントロールを登録します。更に、四角形のOnMouseDownイベントに"[Event Procedure]"を埋め込みます。OnMouseDownイベントが発生したときは、Sub mBoxHHMM_MouseDownに制御が渡ります。この方式は、時刻表のようにコントロールの数が多いときはメンテナンス上問題があります。

 

Private WithEvents mBox0900 As Rectangle

Private WithEvents mBox0930 As Rectangle

 

Set mBox0900 = frm("Bar0900")

mBox0900.OnMouseDown = "[Event Procedure]"

 

Set mBox0930 = frm("Bar0930")

mBox0930.OnMouseDown = "[Event Procedure]"

 

Private Sub mBox0900_MouseDown(Button As Integer, _

  Shift As Integer, X As Single, Y As Single)

  EventHandler "0900-0930", Button, Shift

End Sub

 

Private Sub mBox0930_MouseDown(Button As Integer, _

  Shift As Integer, X As Single, Y As Single)

  EventHandler "0930-1000", Button, Shift

End Sub

 

 

クラスモジュールを使用しないで、四角形のイベントを取得するにはOnClickのイベントに、関数を埋め込む方法があります。フォームに四角形のコントロールを作成したら、プロパティを表示させて、クリック時のイベントに=SelectTime(“0900”)のような関数を埋め込みます。SelectTime()関数の引数には、時刻(hhmm)を指定します。尚、コントロール名は、box0900のようにします。フォームをビューモードで表示したら、四角形を2~3度クリックして見てください。背景色が青è灰色è青の順に切り替わります。

 

Public Function SelectTime(strTime As String)

  Me("box" & strTime).BackColor = Me("box" & strTime).BackColor Xor &H3F40C0 

End Function

 

 

注)Xorを2回実行すると最初の値に戻ります。

  1回目:C0C0C0 Xor 3F40C0 = FF8000

    2回目:FF8000 Xor 3F40C0 = C0C0C0

 

 

 

ダウンロード (CH3-5.lzh)
Accessお手本データベースのホームへ戻る