2019.01.15
2019.07.01
サラリーマンのころ、アルバイトの稼働時間や給料などをExcelを使って計算していたのですが、同じようなデータ入力が複数回あり効率化できないものかと考えていました。
すでにアルバイトのスケジュール管理していたAccessのシステムがあったので、そのシステムとデータを共有して給料計算をシステム化しようと考え、作業に入ったときでした。
作業は、順調に進んでいましたが、勤務時間を計算するところで高い壁にぶつかってしまいました。
業務開始時刻と業務終了時刻の差を1日の勤務時間として1か月分の勤務時間を計算したところ、どう見ても間違っています。なぜだろう・・・
理由がわからなくてネットで検索したところ、Accessは時間の概念がなく、時刻として理解しているようでした。
つまり、時間を合計して24:00になると00:00となってしまいます。
Excelは問題なく簡単に時間計算できるのにAccessでは、ひと工夫必要なようです。
【AD】24時間以上の表示をどのように処理するかネットで検索してみました。
時間計算の問題を解決するには、2つの方法があります。
Excelと連携させて時間計算をさせる。
Accessで時間を分単位に変換して計算させる。
Excelとの連携は、AccessからExcelへデータ出力して、Excelで時間計算処理と支払金額を計算させるようなイメージなります。
これは、Excel側で自動化のプログラムを作らなければいけません。
そのあとの帳票出力などの処理を考えれば、Accessで完結させた方がよさそうです。
処理方法は、クエリを使って合計時間計算とその結果を表示するものやVBAで独自の関数を作って表示するものなどいろいろあります。
ここでは、VBAで記述された独自の関数「HoursAndMinutes()」を使って、24時間以上の時間表示に対応できる方法を紹介します。
設定方法は、つぎのコードを「標準モジュール」プロシージャに作成します。
「モジュール」はいくつか種類がありますが、「標準モジュール」は、フォーム、レポート、クエリの演算フィールド、マクロなど、同じAccessのファイル内で呼び出して使えるコードを記述するところです。
HoursAndMinutes()関数のコード
Option Compare Database
Option Explicit
Public Function HoursAndMinutes(interval As Variant) As String
'***********************************************************************
' Function HoursAndMinutes(interval As Variant) As String
' Returns time interval formatted as a hours:minutes string
'***********************************************************************
Dim totalminutes As Long, totalseconds As Long
Dim hours As Long, minutes As Long, seconds As Long
If IsNull(interval) = True Then Exit Function
hours = Int(CSng(interval * 24))
totalminutes = Int(CSng(interval * 1440)) ' 1440 = 24 hrs * 60 mins
minutes = totalminutes Mod 60
totalseconds = Int(CSng(interval * 86400)) ' 86400 = 1440 * 60 secs
seconds = totalseconds Mod 60
If seconds > 30 Then minutes = minutes + 1 ' round up the minutes and
If minutes > 59 Then hours = hours + 1: minutes = 0 ' adjust hours
HoursAndMinutes = hours & ":" & Format(minutes, "00")
End Function
帳票に「勤務時間内」と「勤務時間外」の勤務時間数を表示させます。
毎日の時間数は24時間を超えることはないので、DateDiff関数を使ってそれぞれの時間帯の勤務時間数を計算します。
HoursAndMinutesとSum関数を使って、各時間帯の勤務時間数を求めそれぞれの時間数を表示させます。
例)HoursAndMinutes(Sum([勤務時間内])
注意 便利な関数ではありますが、残念ながら、表示される時間は数値でないため、表示された時間を使って計算することはできません。
【AD】