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

タイムカードを入力するお手本データベース

 

3-4-1 タイムカードを入力するサンプルデータベース

 

このサンプルデータベースは、一ヶ月分のデータを自動作成してデータシート上に表示します。出勤時刻、退勤時刻、休憩時間を入力するだけで、就労時間と残業時間を自動計算します。サブフォームのフッターには、就労時間と残業時間の合計時間が表示されます。休祭日のときは、その行が赤色で表示されます。このサンプルデータは、社内カレンダーを用意していますので会社独自の休業日も設定することができます。出勤時刻、退勤時刻、休憩時間を入力するとき、ポップアップウィンドウを表示させてマウスで時刻(HH:MM)をクリックすることができます。また、データシート上のフィールドをExcelのワークシートのように、上下の矢印キーで移動することができます。

 

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

 

◆ データシート上に一ヶ月分のデータを表示させる方法

◆ 休祭日の行を赤色で表示させる方法

◆ 時刻を入力するポップアップウィンドウを表示させる方法

◆ 出勤時刻、退勤時刻、休憩時間から実労働時間と残業時間を自動計算する方法

  (勤務時間が午前0時を超える場合もOKです)

◆ データシート上のフィールドを上下の矢印キーで移動する方法

 

   サンプルデータベースに必要なテーブルを作成

 

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

 

2 データベースウィンドウからテーブルをクリックして、新規作成ボタンをクリックします。テーブルの新規作成ダイアログが表示されたら、デザインビューを選択してOKボタンをクリックします。テーブルが表示されたら、フィールド名にHoliday, Descriptionを入力します。データ型とサイズは、表3-4-1のように設定します。尚、説明欄に書式が記入されているフィールドには、書式も設定します。Holidayの下線は、主キーを設定していることを意味します。主キーを設定するには、Holidayフィールドを選択して、メニューから主キーのアイコンをクリックします。テーブルをtblHolidaysの名称で保存します。同様の手順で、tblStaff, tblWorkOrder, tblWorkOrderDetailsを作成します。

 

3-4-1 テーブルtblHolidaysの構造

テーブル名

説   明

作成日

最終更新日

tblHolidays

 社内カレンダー

 

 

No

フィールド名

データ型

サイズ

説    明

1

Holiday

日付/時刻型

8

書式:日付(S)

2

Description

テキスト型

50

 

 

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

テーブル名

説   明

作成日

最終更新日

tblStaff

 スタップマスタ

 

 

No

フィールド名

データ型

サイズ

説    明

1

StaffID

オートナンバー

4

 

2

StaffName

テキスト型

50

 

 

3-4-3 テーブル tblWorkOrderの構造

テーブル名

説   明

作成日

最終更新日

tblWorkOrder

 作業票

 

 

No

フィールド名

データ型

サイズ

説    明

1

WoID

オートナンバー

4

 

2

StaffID

数値型(長整数型)

4

 

 

3-4-4 テーブル tblWorkOrderDetailsの構造

テーブル名

説   明

作成日

最終更新日

tblWorkOrderDetails

 作業明細

 

 

No

フィールド名

データ型

サイズ

説    明

1

WoID

数値型(長整数型)

4

作業票ID

2

WoRow

オートナンバー

4

作業票明細ID

3

作業日付

日付/時刻型

8

書式:yyyy/mm/dd

5

出勤時刻

日付/時刻型

8

書式:時刻(S)

6

退勤時刻

日付/時刻型

8

書式:時刻(S)

7

休憩時間

日付/時刻型

8

書式:時刻(S)

8

就労時間

通貨型

8

精度を高めるために通貨型とする

9

残業時間

通貨型

8

精度を高めるために通貨型とする

10

休祭日

Yes/No

1

フラグ(Yes:休日|祭日 No:平日)

 

 

3 テーブル tblHolidaysを開いて、祭日と会社独自の休業日を入力します。

 

3-4-2 tblHolidaysを開いて祭日、会社休業日を入力

 

4 テーブル tblStaffを開いて4人分のスタッフを入力します。スタッフIDは、オートナンバー型ですから自動採番されます。

 

3-4-3 tblStaffを開いて4人分のスタッフを入力

 

5 メニューからツール、リレーションシップをクリックしてリレーションシップのウィンドウを表示させたら、tblStaff tblWorkOrder StaffIDでリレーションを設定します。次に、tblWorkOrdertblWorkOrderDetailsWoIDでリレーションを設定します。

 

3-4-3-1 tblStaff, tblWorkOrder, tblWorkOrderDetailsにリレーションを設定する

 

6 リレーションシップを保存したら、Access を終了させます。

 

Tip

テーブル tblWorkOrderDetailsの就労時間と残業時間は、本来数値型の単精度浮動小数点型を使用すべきなのですが、精度を高めるために通貨型にしています。


 

   時刻を入力するポップアップフォームを作成するには

 

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

 

2 データベースウィンドウからフォームをクリックして、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューを選択してOKをクリックします。フォームのデザインビューが表示されたら、ツールボックスからオプショングループのアイコンをクリックして時間(HH)(MM)のオプショングループを作成します。尚、オプショングループを作成するときは、ツールボックスのコントロールウィザードは無効にしてください。オプショングループを作成したら、ツールボックスからトグルボタンのアイコンをクリックして時間のオプショングループに1時~24時まで24個のトグルボタンを作成します。トグルボタンのオプション値には、1~24を設定します。分のオプショングループには、0分、5分、10分、・・・・55分のように5分間隔で12個のトグルボタンを作成します。トグルボタンのオプション値にも同様の値を設定します。


 

3-4-5 オプショングループのプロパティ

コントロールの種類

プロパティ

オプショングループ1

名前

grpHrs

 

トグルボタン

標題/オプション値

tglHr1

1

tglHr2

2

tglHr3

3

・・・・・

 

tglHr24

24

 

 

オプショングループ2

名前

grpMins

 

トグルボタン

標題/オプション値

tglMin0

0

tglMin5

5

tglMin10

10

・・・・

 

tglMin55

55

 

 

 

3-4-4 時間と分のオプショングループにトグルボタンを作成した例

 

3 オプショングループの下にOKCancelのコマンドボタンを作成したら、コントロール名を、cmdOKcmdCancelに書き替えます。オプショングループとコマンドボタンを四角形のコントロールを作成して囲みます。四角形のプロパティを表示させて、立体表示を影付き、境界線スタイルを実線、境界線色を10485760、境界線幅を3ポイントに設定します。次に、詳細セクションのプロパティを表示させたら、背景色を16762766に設定します。最後に、フォームのプロパティを表示させたらポップアップを“はい”、作業ウィンドウ固定を“はい”、スクロールバーを“なし”、レコードセレクタ、移動ボタン、区切り線、サイズ自動修正、自動中央寄せ、コントロールボックスを“いいえ”、境界線スタイルを“なし”に設定します。フォームのサイズが、図3-4-5のようになるように調整します。フォームをビューモードで開いたときは、マウスを四角形の上に移動して右ボタンをクリックしてショートカットメニューを表示させて、フォームデザインをクリックしてデザインモードに切り替えます。

 

3-4-6 その他のコントロールトールのプロパティ

コントロールの種類

プロパティ

コマンドボタン1

名前

cmdOK

コマンドボタン2

名前

cmdCancel

四角形

立体表示

影付き

境界線スタイル

実線

境界線色

10485760

境界線幅

3ポイント

詳細セクション

背景色

106762766

フォーム

ポップアップ

はい

作業ウィンドウ固定

はい

スクロールバー

いいえ

レコードセレクタ

いいえ

移動ボタン

いいえ

区切り線

いいえ

サイズ自動修正

いいえ

自動中央寄せ

いいえ

境界線スタイル

なし

コントロールボックス

いいえ

 

 

3-4-5 フォームのサイズを調整

 

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

 

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

 

 

Sub Form_Load()イベントの処理

このイベントは、フォームが開かれてデータをロードしたときに実行されます。このイベントでは、モジュールbasTimeTableに登録されているSetDefaultTime_FSを呼んで、ポップアップウィンドウのデフォルトの時刻を設定します。SetDefaultTime_FSには、引数としてポップアップウィンドウのフォーム(Me)を指定します。

 

 

Sub grpHrs_DblClick()イベントの処理

このイベントは、時間のトグルボタンをダブルクリックで確定したときに実行されます。このイベントでは、モジュール basTimeTableに登録されているSetTime_FSを呼びます。SetTime_FSでは、ダブルクリックした時刻(HH:MM)をテキストボックスに設定してポップアップウィンドウを閉じます。

 

 

Sub grpMins_DblClick()イベントの処理

このイベントは、分のトグルボタンをダブルクリックで確定したときに実行されます。このイベントでは、ダブルクリックした時刻(HH:MM)をテキストボックスに設定してポップアップウィンドウを閉じます。

 

 

Sub cmdOK_Click()イベントの処理

このイベントは、OKボタンをクリックしたときに実行されます。このイベントでは、トグルボタンをクリックして選択した時刻(HH:MM)をテキストボックスにを設定してポップアップウィンドウを閉じます。

 

 

Sub cmdCancel_Click()イベントの処理

このイベントは、Cancelボタンをクリックしたときに実行されます。このイベントでは、時刻の選択を中止して、ポップアップウィンドウを閉じます。

 

 

リスト3-4-1 frmTimeTableのフォームモジュール

Option Compare Database

Option Explicit

 

Private Sub cmdOK_Click()

  Call SetTime_FS(Me, True)

End Sub

 

Private Sub cmdCancel_Click()

  Call SetTime_FS(Me, False)

End Sub

 

Private Sub Form_Load()

  Call SetDefaultTime_FS(Me)

End Sub

 

Private Sub grpHrs_DblClick(Cancel As Integer)

  Call SetTime_FS(Me, True)

End Sub

 

Private Sub grpMins_DblClick(Cancel As Integer)

  Call SetTime_FS(Me, True)

End Sub

 

 

Sub PopUpTime_FSの処理について

このサブプロシージャは、時刻のテキストボックスにマウスを移動して右ボタンをクリックしたときに呼ばれます。このプロシージャでは、ポップアップウィンドウを表示する位置を計算してフォームを開きます。PopupTime_FSには、引数として時刻を設定するテキストボックスを指定します。Windows API GetSystemMetricsGetCursorPosを呼び出してスクリーンの解像度とカーソル位置を取得して、メモリ変数 sngMoveX, sngMoveYにポップアップウィンドウの表示位置をセットします。DoCmdOpenFormメソッドで、ポップアップウィンドウを開いたら、DoCmdMoveSizeメソッドでテキストボックスの近くに移動します。

 

リスト3-4-2 basTimeTableSub PopUpTime_FS

Public Sub PopUpTime_FS(txt As TextBox)

 

  Dim pAPI As POINTAPI

  Dim sngMoveX As Single

  Dim sngMoveY As Single

  Dim sngScrH As Single

  Dim sngScrW As Single

  Dim sngTxtH As Single

  Dim sngTxtW As Single

 

  Set mfrm = txt.Parent

  Set mtxt = txt

 

  ' スクリーンの解像度取得

  sngScrH = GetSystemMetrics(1)

  sngScrW = GetSystemMetrics(0)

 

  sngScrH = sngScrH / conFactor

  sngScrW = sngScrW / conFactor

 

  GetCursorPos pAPI

     

  With txt

    sngTxtH = .Top / conFactor

    sngTxtW = .Left / conFactor

  End With

 

  ' ポップアップフォームを表示する位置を計算

  If Abs((sngScrH - (pAPI.Y / conFactor))) < sngTxtH Then

    sngMoveY = (pAPI.Y * conFactor) + (2 * sngTxtH)

  Else

    sngMoveY = (pAPI.Y * conFactor) - (sngTxtH * 10.25)

  End If

     

  If Abs((sngScrW - (pAPI.X / conFactor))) < sngTxtW Then

    sngMoveX = (pAPI.X * conFactor) + sngTxtW

  Else

    sngMoveX = (pAPI.X * conFactor) - (sngTxtW * 6)

  End If

 

  DoCmd.OpenForm conFormName

  DoCmd.MoveSize Right:=sngMoveX, Down:=sngMoveY

 

End Sub

 

 

Sub SetDefaultTime_FS()の処理について

このサブプロシージャは、ポップアップウィンドウのOnLoadイベントから呼ばれます。このプロシージャには、引数としてポップアップウィンドウのフォームを指定します。SetDefaultTime_FSは、メモリ変数mtxtに格納されているテキストボックスの値を調べて、空のときは現在の時刻をデフォルトとして表示します。テキストボックスに時刻が格納されているときは、その時刻をデフォルトとして表示します。時間と分のオプショングループに値を設定するとき、ElapsedTime_FS()関数を呼んで時刻(HH:MM)から時間(HH)と分(MM)を分離します。例えば、ElapsedTime_FS(#10:15:20#).Hoursのように記述すると、10(時)が返されます。また、ElapsedTime_FS(#10:15:20#).Minutes のように記述すると、15(分)が返されます。ElapsedTime_FS()関数は、モジュールbasMyLibに登録されていますので参照してください。のオプショングループに値を設定するとき、ElapsedTime_FS(varTime).Minutesで取得した分(MM)を5分単位にまるめています。

 

 

リスト3-4-2 basTimeTableSub SetDefaultTime_FS

Public Sub SetDefaultTime_FS(frm As Form)

  Dim varTime As Variant

 

  On Error Resume Next

  If IsNull(mtxt.Value) Then

    varTime = Time()

  Else

    varTime = mtxt.Value

  End If

  frm("grpHrs") = ElapsedTime_FS(varTime).Hours

  frm("grpMins") = Int(ElapsedTime_FS(varTime).Minutes / 5) * 5

End Sub

 

 

Sub SetTime_FS()の処理について

このサブプロシージャは、ポップアップウィンドウからOKボタン、Cancelボタンをクリックしたときに呼ばれます。また、ポップアップウィンドウから時間と分のトグルボタンをダブルクリックして確定したときも呼ばれます。このプロシージャには、引数としてポップアップウィンドウのフォームと更新フラグを指定します。SetTime_FSでは、引数の更新フラグを調べてTrueのとき、メモリ変数mtxtに格納されているテキストボックスに時刻(HH:MM)を設定します。最後に、DoCmdCloseメソッドでポップアップウィンドウを閉じて終了します。

 

 

リスト3-4-3 basTimeTableSub SetTime_FS

Public Sub SetTime_FS(frm As Form, fUpdate)

  On Error Resume Next

  If fUpdate Then

    mtxt.Value = Format(frm("grpHrs"), "00") _

      & ":" & Format(frm("grpMins"), "00")

  End If

  DoCmd.Close acForm, conFormName

End Sub

 

 

   タイムカードを入力するメイン/サブフォームを作成するには

 

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

 

2 データベースウィンドウからクエリをクリックしたら、新規作成のボタンをクリックします。クエリの新規作成のダイアログが表示されたら、デザインビューを選択してOKをクリックします。テーブルの表示ダイアログが表示されたら、テーブルタブをクリックしてtblWorkOrderを選択して追加ボタンをクリックします。閉じるのボタンをクリックしてダイアログを閉じます。クエリのデザインビューが表示されたら、テーブルからWoIDをダブルクリックしてQBEフィールドに移動します。WoIDの表示のチェックをクリックして非表示にしたら、並べ替えのコンボボックスをクリックして“昇順”をクリックします。クエリをqryWorkOrderの名称で保存して閉じます。同様の手順で、tblWorkOrderDetailsのクエリを作成してqryWorkOrderDetailsの名称で保存します。

 

3-4-6 tblWorkOrderのクエリ作成

 

3-4-7 tblWorkOrderDetailsのクエリ作成

 

3 データベースウィンドウからフォームをクリックして新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、一覧からフォームウィザードを選択します。基になるテーブル/クエリのコンボボックスから”qryWorkOrderを選択してOKボタンをクリックします。ウィザードの指示に従って、図3-4-8のようなメインフォームを作成します。作業票IDとスタッフIDのプロパティは、表3-4-7のように設定します。

 

3-4-7 作業票IDとスタッフIDのプロパティ

コントロールの種類

プロパティ

テキストボックス

名前

WoID

タブストップ

いいえ

編集ロック

はい

背景色

16777088

コンボボックス

名前

cboSaffID

値集合タイプ

テーブル/クエリ

値集合ソース

SELECT tblStaff.StaffID, tblStaff.StaffName

FROM tblStaff

ORDER BY tblStaff.StaffID;

連結列

列数

列幅

0cm; 2cm

 

 

3-4-8 タイムカードを入力するメインフォーム作成

 

4 メインフォームをfrmWorkOrderの名称で保存して閉じます。

 

5 データベースウィンドウの新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、一覧からフォームウィザードを選択します。基になるテーブル/クエリのコンボボックスからqryWorkOrderDetailsを選択したら、OKボタンをクリックします。作業日付のテキストボックスを選択したら、マウスの右ボタンをクリックしてショートカットメニューをクリックします。メニューからコピーを選択したら、作業日付と出勤時刻の間に貼り付けます。同様の手順で、就労時間と残業時間のテキストボックスをコピーしたらフォームフッターに貼り付けます。休祭日のラベルは、不要ですからフォームヘッダーから削除します。フォームに作成したラベル/テキストボックスのコントロールのプロパティを表3-4-8のように設定します。

 

3-4-8 サブフォームに作成したコントロールのプロパティ

コントロールの種類

プロパティ

ラベル1

標題

月日

テキストボックス1

名前

作業日付

書式

mm/dd

コントロールソース

作業日付

タブストップ

いいえ

編集ロック

はい

ラベル2

標題

テキストボックス2

名前

曜日

書式

aaa

コントロールソース

作業日付

タブストップ

いいえ

編集ロック

はい

ラベル3

標題

出勤

テキストボックス3

名前

出勤時刻

書式

09\:99;0;_

コントロールソース

出勤時刻

ラベル4

標題

退勤

テキストボックス4

名前

退勤時刻

書式

09\:99;0;_

コントロールソース

退勤時刻

ラベル5

標題

休憩

テキストボックス5

名前

休憩時間

書式

09\:99;0;_

コントロールソース

休憩時間

ラベル6

標題

就労

テキストボックス6

名前

就労時間

書式

数値

小数点以下表示桁数

コントロールソース

就労時間

タブストップ

いいえ

編集ロック

はい

ラベル7

標題

残業

テキストボックス7

名前

休憩時間

書式

数値

小数点以下表示桁数

コントロールソース

休憩時間

タブストップ

いいえ

編集ロック

はい

チェックボックス

名前

休祭日

コントロールソース

休祭日

可視

いいえ

テキストボックス8

名前

就労時間合計

コントロールソース

=Sum([就労時間])

書式

数値

小数点以下表示桁数

タブストップ

いいえ

編集ロック

はい

テキストボックス9

名前

残業時間合計

コントロールソース

=Sum([残業時間])

書式

数値

小数点以下表示桁数

タブストップ

いいえ

編集ロック

はい

 

3-4-9 サブフォームに明細行と合計欄のコントロールを作成した例

 

6 サブフォームの明細行に条件付書式を設定して、休祭日のとき赤色で表示されるようにします。明細行の作業日付、曜日、出勤時刻、退勤時刻、就労時間、残業時間のコントロールを選択したら、メニューから書式条件付書式をクリックして条件付書式設定のダイアログを表示します。条件(1)のコンボボックスからをクリックして条件式に[休祭日]を入力します。フォント/前景色のアイコンの▼をクリックして一覧から赤色をクリックします。OKボタンをクリックしてダイアログを閉じます。

 

3-4-10 サブフォームの明細行に条件付書式を設定して休祭日のとき赤色で表示されるようにする

 

7 メニューからコードのアイコンをクリックしてフォームモジュールを表示させます。CH3-4.mdbを開いて、サブフォームsfrWorkOrderDetailsのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードはリスト3-4-5を参照してください。サブフォームを”sfrWorkOrderDetailsの名称で保存して閉じます。

 

8 メインフォーム frmWorkOrderをデザインモードで開いたら、データベースウィンドウからサブフォームsfrWorkOrderDetailsのアイコンをドラッグしてメインフォームに貼り付けます。サブフォームに8行の明細が表示されるようにサイズを調整します。メニューからコードのアイコンをクリックしてフォームモジュールを表示させたら、CH3-4.mdbを開いて、frmWorkOrderのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト3-4-4を参照してください。

 

9 メインフォームをビューモードで開いたら、スタッフIDのコンボボックスから平成 春子をクリックします。サブフォームに、一ヶ月分のデータが表示されます。休祭日の明細行は、赤色で表示されます。出勤時刻、退勤時刻、休憩時間、就労時間、残業時間には、デフォルト値が表示されます。但し、休祭日には、デフォルト値は表示されません。デフォルト値を変更するときは、時刻のテキストボックスにマウスを移動して右ボタンをクリックします。時刻表のポップアップウィンドウが表示されたら、時間をクリックしてOKボタンをクリックして確定します。テキストボックスには、ポップアップウィンドウで選択した時刻が表示されます。デフォルト値は、直接キーボードから入力して変更することもできます。この場合、表示計算ソフトのように矢印キーでテキストボックスを前後左右に自由に移動することができます。就労時間と残業時間は、自動計算して表示します。

 

3-4-12 タイムカード入力フォームを表示させた例、平日の行にはデフォルト値が表示されます

 

3-4-13 時刻表のポップアップウィンドウを表示させた例

 

10 結果を確認したら、メインフォーム frmWorkOrderを保存してAccess を終了させます。

 

Tip

複数のコントロールを選択するには:

 

フォーム上に作成された複数のコントロールを選択するには、シフトキーを押しながらマウスをコントロールをクリックします。この他に、マウスの左ボタンをクリックしながら移動させて複数のコントロールを囲って選択する方法があります。

 

 

Sub Form_Load()イベント処理について

このイベントは、メインフォームが開かれてデータがロードされたときに実行されます。このイベントでは、テーブルtblHolidaysを開いてレコードセットをPublic変数 grsHolidaysに設定します。grsHolidaysは、basMyLibで宣言されています。ここで開いたレコードセットは、basMyLibに登録されているIsHoliday_FS()関数で使用します。

 

 

Sub Form_Unload()イベント処理について

このイベントは、フォームが閉じられる直前に実行されます。このイベントでは、Publicメモリ変数grsHolidaysに、レコードセットのオブジェクトが設定されているか調べます。レコードセットのオブジェクトが設定されているときは、Closeメソッドで閉じてから、メモリ変数にNothingを設定してオブジェクトを解放します。

 

 

Sub cboStaffID_AfterUpdate()イベント処理

このイベントは、スタッフIDのコンボボックスが更新されたときに実行されます。このイベントでは、サブフォームにフォーカスを移動させて、サブフォームのOnEnterイベントを発生させます。

 

 

Sub sfrWorkOrderDetails_Enter()イベント処理について

このイベントは、サブフォームがフォーカスを取得したときに実行されます。このイベントでは、サブフォームの一ヶ月分のレコードを作成してデータシート上に表示します。OpenRecordsetメソッドでtblWorkOrderDetailsをダイナセットとして開きます。For dtmDate = FirstDayofMonth_FS() To LastDayofMonth_FS()…Nextでは、一ヶ月分のレコードを追加します。basMyLIbに登録されている、FirstDayofMonth_FS(), LastDayofMonth_FS()関数では、当月の初日と最終日を取得します。basMyLibに登録されているIsHoliday_FS()関数では、引数で指定された作業日が休祭日かどうか調べます。平日の場合は、出勤時刻、退勤時刻、休憩時間、就労時間、残業時間にデフォルト値を設定してレコードを追加します。一ヶ月分のレコードを追加したら、Closeメソッドでレコードセットを閉じて、 rsNothingを設定してレコードセットのオブジェクトを解放します。最後に、サブフォームを再クエリして追加した一ヶ月分のデータを表示します。

 

リスト3-4-4 frmWorkOrderのフォームモジュール

ption Compare Database

Option Explicit

 

Private Sub Form_Load()

  Set grsHolidays = _

    CurrentDb.OpenRecordset("tblHolidays", dbOpenSnapshot)

End Sub

 

Private Sub Form_Open(Cancel As Integer)

  Call SetAppTitle_FS("Time Control (C) " _

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

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

  If Not grsHolidays Is Nothing Then

    grsHolidays.Close

    Set grsHolidays = Nothing

  End If

End Sub

 

Private Sub sfrWorkOrderDetails_Enter()

  Dim rs As DAO.Recordset

  Dim dtmDate As Date

  Dim fHoliday As Boolean

 

  If IsNull(Me.WoID) Then

    Exit Sub

  End If

 

  Set rs = CurrentDb.OpenRecordset("tblWorkOrderDetails", _

    dbOpenDynaset)

  With rs

    .FindFirst "WoID=" & Me.WoID

    If .NoMatch Then

      For dtmDate = FirstDayofMonth_FS() To LastDayofMonth_FS()

        fHoliday = IsHoliday_FS(grsHolidays, dtmDate)

        .AddNew

        !WoID = Me.WoID

        !作業日付 = dtmDate

        If Not fHoliday Then

          !出勤時刻 = #9:00:00 AM#

          !退勤時刻 = #6:00:00 PM#

          !休憩時間 = #1:00:00 AM#

          !就労時間 = 8#

          !残業時間 = 0#

        End If

        !休祭日 = fHoliday

        .Update

      Next dtmDate

    End If

    .Close

  End With

  Set rs = Nothing

  Me.sfrWorkOrderDetails.Requery

End Sub

 

Private Sub cboStaffID_AfterUpdate()

  Me.sfrWorkOrderDetails.SetFocus

End Sub

 

 

 

Sub Form_BeforeUpdate()イベント処理について

このイベントは、サブフォームの明細行(出勤時刻、退勤時刻、休憩時間)が更新されたときに実行されます。このイベントでは、Sub ReCalHoursを呼び出して、就労時間と残業時間を再計算します。

 

 

Sub ReCalcHours()処理について

このサブプロシージャは、サブフォームのOnBeforeUpdateイベントから呼ばれます。このプロシージャでは、basMyLibに登録されているElapsedHours_FS(), ElapsedTime2_FS()関数を使用して就労時間と残業時間を自動計算します。ElapsedTime2_FS()関数は、引数1と引数2の差を計算して結果を返します。この関数は、勤務時間が深夜(午前0時)を超える場合も使用することができます。例1は、午前9:00から午後18:00まで勤務した場合の時間(HH:MM)です。例2は、午前9:00から翌日の午前3:00まで勤務した場合の時間(HH:MM)です。

 

例1: ? ElapsedTime2_FS(#09:00#, #18:00#) è 09:00

例2: ? ElapsedTime2_FS(#09:00#, #03:00#) è 18:00

 

ElapsedHours_FS()関数には、引数として計算式と分単位を指定します。この関数は、引数で指定された式を計算して時刻を時間(99.99)に変換して返します。例1は、実労時間が9時間15分ですが30分単位にまるめられて9.00が返されます。例2は、15分単位にまるめられて9.25(9時間と1/4時間)が返されます。

 

例1:? ElapsedHours_FS(#09:15#,30) ‘ è 9.00

例2:? ElapsedHours_FS(#09:15#,15) ‘ è 9.25

 

 

Sub Form_KeyDown()イベント処理について

このイベントは、フォーム上にキーボードからキーを入力したときに実行されます。このイベントでは、Select Case KeyCode…End Selectで上下の矢印キー(↑↓)が投下されたか調べて、矢印キーに対応する方向にカーソルを移動します。↑矢印のときは、DoCmdGotoRecord メソッドにacPreviousの引数を指定して前方方向にカーソルを移動します。↓矢印のときは、DoCmdGotoRecordメソッドにacNextの引数を指定して後方方向にカーソルを移動します。

 

 

Sub 出勤時刻_MouseDown()/退勤時刻_MouseDown()/休憩時間_MouseDown()イベント処理について

これらのイベントは、マウスをテキストボックスに移動してボタンをクリックしたときに実行されます。これらのイベントでは、引数 Buttonを調べてマウスの右ボタン(acRightButton)がクリックされたとき、Sub PopupTime_FSを呼び出して時刻表のポップアップウィンドウを表示させます。PopupTime_FSには、引数として時刻を入力するテキストボックスを指定します。

 

 

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

Option Compare Database

Option Explicit

 

Private Sub Form_BeforeUpdate(Cancel As Integer)

  Call ReCalcHours

End Sub

 

Private Sub Form_KeyDown(KeyCode As Integer, _

  Shift As Integer)

  On Error GoTo Err_Form_KeyDown

  Select Case KeyCode

    Case vbKeyDown

      DoCmd.GoToRecord Record:=acNext

    Case vbKeyUp

      DoCmd.GoToRecord Record:=acPrevious

    Case Else

      ' Do nothing at all!

  End Select

 

Exit_Form_KeyDown:

  Exit Sub

 

Err_Form_KeyDown:

  With Err

    If .Number = 2105 Then

      KeyCode = 0

    Else

      MsgBox .Description & " (" & .Number & ")"

    End If

    .Clear

  End With

  Resume Exit_Form_KeyDown

End Sub

 

Private Sub 休憩時間_MouseDown(Button As Integer, _

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

  If Button = acRightButton Then

    Call PopUpTime_FS(Me.休憩時間)

  End If

End Sub

 

Private Sub 出勤時刻_MouseDown(Button As Integer, _

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

  If Button = acRightButton Then

    Call PopUpTime_FS(Me.出勤時刻)

  End If

End Sub

 

Private Sub 退勤時刻_MouseDown(Button As Integer, _

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

  If Button = acRightButton Then

    Call PopUpTime_FS(Me.退勤時刻)

  End If

End Sub

 

Private Sub ReCalcHours()

  就労時間 = ElapsedHours_FS( _

    TimeValue(ElapsedTime2_FS(出勤時刻, 退勤時刻)) _

    - 休憩時間, 15)

  残業時間 = IIf(就労時間 > 8, 就労時間 - 8, 0)

End Sub

 

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