Microsoft Access 掲示板

時間の計算について教えてください

5 コメント
views
4 フォロー

時間の計算について教えてください
(見よう見まねで使用しているのでAccessは全く詳しくありません)

現在、従業員リストのフォームに時間を入れ、そこから雇用契約書をレポートで出力してます。

月始 短いテキスト 定型入力09\時99\分;;
月終 短いテキスト 定型入力09\時99\分;;

月休 短いテキスト 定型入力999\分;;_

これらが月~日まであります。
出力するだけならこの状態で問題なかったのですが、

実労働時間を計算したいと思い、悩んでいます。
おそらくテキストにしているというところが問題なのかな、と思う程度で、どうすればいいかわかりません。

月終-月始-月休=労働時間 ただし、夜勤の場合もあるので月終が月始より小さい数の場合もあります。

電卓で計算するなら[月終]+24-[月始]-([月休]/60)みたいな感じですが、
これをAccessで表示させたい場合、どのようにすれば良いでしょうか。

反映させる場所はテーブルでもフォームでも構いませんが
レポートに出力する必要はありません。

どうぞよろしくお願いします。

作成: 2024/03/21 (木) 12:13:20
通報 ...
1
hiroton 2024/03/21 (木) 13:29:17 0c567@f966d

数値に見えるテキストを計算させると数値として扱ってくれるのでそこは問題ないでしょう。ただし、時分をそのまま並べているのでそのまま数値計算させるわけにはいきません

入力不備を考慮して4桁(以上)に合わせる

[月始] & "0000"

時分を分け、分を時にする

時  :Left([月始] & "0000",2)
分->時:Mid([月始] & "0000",3,2)/60

[月終]が0時を超えてしまうようなときは24を超えた入力をするようにすればいいんですが(25時00分など)簡易的に計算するのであれば

([月終時]+24-[月始時]) Mod 24

で、できます。Mod演算子は余りを求める演算子で、負の値にならないよう24を加算しておいて、24をオーバーした分はMod演算子で捨てるようにしています

※簡易計算なので1日の労働時間が24時間以上になる場合は正確な数値になりません

これらを組み合わせると、

(Left([月終] & "0000",2)+Mid([月終] & "0000",3,2)/60)+24-(Left([月始] & "0000",2)+Mid([月始] & "0000",3,2)/60)) Mod 24-[月休]/60

で計算できます

3

わかりやすく解説していただいてありがとうございます。上記でエラーが出てしまったので
上記の式をチャットGPTに貼って相談したところ、

月時: IIf(TimeValue([月終])>TimeValue([月始]),((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))-[月休],((Hour(TimeValue([月終]))-Hour(TimeValue([月始])))60+Minute(TimeValue([月終]))-Minute(TimeValue([月始])))+IIf(TimeValue([月終])>TimeValue([月始]),0,24*60)-[月休])/60

こんなふうにすることで時間を表示させることが出来ました。

ところが、別の質問になってしまいますが、この結果をフォームに表示させようとすると
[Q実労働時間クエリ]![月時]

Name?というエラーになってしまいます。

何か考えられる原因等ありますでしょうか。

5
hiroton 2024/03/22 (金) 11:02:05 0858e@f966d >> 1

TimeValue 関数

その計算式でなぜうまくいくのかhirotonには理解できません

hirotonは段階を追って処理を提示していますが、どの部分でエラーになりますか?
クエリで各段階をそれぞれフィールドにして確認してみてください。解説の都合で[月終時][月始時]と適当に名前を作っていますのでうまいこと解釈していただくか、分からなければ質問してください


この結果をフォームに表示させようとすると
[Q実労働時間クエリ]![月時]

Name?というエラーになってしまいます。

フォームのレコードソース、表示させようとしているコントロールの種類(テキストボックスやコンボボックスなど)、そのコントロールのコントロールソースを確認してください

レコードソースに指定されているソースに[Q実労働時間クエリ]![月時]という名前のフィールドは含まれていますか?普通はこのような名前のフィールドはないと思います

2

月始 短いテキスト 定型入力09\時99\分;;
月終 短いテキスト 定型入力09\時99\分;;
月休 短いテキスト 定型入力999\分;;_

これのそれぞれの意味は、
月始 → 月曜日の開始時刻
月終 → 月曜日の終了時刻
月休 → 月曜日の休憩時間(分)
ということですよね。
それが、月曜から日曜まである。

このようなテーブル設計ではデータベースとしては使い物になりません。
テーブル設計の見直しから始めましょう。

とりあえず勤怠管理のテーブル設計のサンプルは下記などを参考に作成してみてください。

Access:勤怠管理のテーブル|社員マスターとクエリを作成

ただ、これを見ても、おそらく
なぜそのような設計のなるのか、
これをどのように使うのか、
さっぱりわからないかと思います。

その場合は、まずは入門書、入門サイトなどでAccessの基本から学習しなおした方が速いかもしれません。

ある程度のところまでできたら、その時点でわからない部分を再質問されるのがいいかと思います。

4

おっしゃる通りなんだと思います。
ただ、スタートがきちんと構築しよう!という取り組みではなく
頻々に入れ替わるパートさんの雇用契約書の作成を従業員リストから出来ないかなぁ~というところから始まったので
こんなふうに計算することも考えずにテキストを追加して、今になって「あ~計算も出来たら楽だ」と思った次第です。
なかなかじっくり取り組む時間が取れず、やっつけで作っては相談している、というのが現状です。

ただ、このような問題点が発生することはわかりましたので、次回このようなものを作るときは
今後どんな風に利用する可能性があるか、というのをしっかり考えて作らないと、と思いました。