dポイントプレゼントキャンペーン実施中!

お世話になっております。
Windows 7
Access 2007

Private Sub 完了時間_AfterUpdate()
Dim StartTime, EndTime, Kugiri, tuujou, Soukinmu, shinyakugiri, SinyaTime As Long
tuujou = 8: '通常勤務時間 8時間
Kugiri = 5: '区切り時間 午前5時
shinyakugiri = 22: '深夜区切り 22時


'処理がわかりやすくするために時刻(m日)を数値(n時間)に変換
StartTime = Me.開始時間 * 24
EndTime = Me.完了時間 * 24

'完了時間が 0時以上 5時以下 の場合、24時間足す。
If EndTime >= 0 And EndTime <= Kugiri Then
EndTime = EndTime + 24
End If
'深夜計算
SinyaTime = EndTime - shinyakugiri - Me.休憩
If SinyaTime > 0 Then
Me.深夜 = SinyaTime
Else
Me.深夜 = 0
End If

'総勤務時間算出
Soukinmu = EndTime - StartTime - Me.休憩

'(Me.sinyaは前の処理で、深夜にかかっていない場合0なので、適切に計算される)
Soukinmu = Soukinmu - Me.深夜

'総勤務時間が通常勤務時間以下の場合、
'残業時間は0、勤務時間は総勤務時間。

'総勤務時間が通常勤務時間より大きい場合、
'残業時間=総勤務時間-通常勤務時間 勤務時間=通常勤務時間

If Soukinmu <= tuujou Then
Me.残業 = 0
Me.勤務時間 = Soukinmu
Else
Me.残業 = Soukinmu - tuujou
Me.勤務時間 = tuujou
End If

'工数算出
'If EndTime <= 17 Then
If Soukinmu <= tuujou Then
工数 = 勤務時間 / tuujou
Me.勤務時間 = Soukinmu
Else
工数 = tuujou / 8
End If


End Sub

このコーナーで教えていただいた日報の時間計算ですが、とてもうまく計算できました。ですが、問題発生したため、修正が必要ですけどどいう風に変更すればいいか分からなくてまた質問させていただきます。
言葉でうまく説明出来ないので、例を挙げます。
2011/12/09 Aさんの場合
工事番号 日付 名前 開始   終了   勤務時間 残業
0001   12/9 A   8:00 17:00   8
0002   12/9 A   17:00  20:00         3
そんな感じで日報に表示させたいですが現在の日報はこんな感じです。
工事番号 日付 社員ID 名前 開始   終了   勤務時間 残業
0001   12/9  1    A   8:00 17:00   8
0002   12/9  1    A   17:00  20:00  3

今のコードなら修正できるでしょうか?
素人の考えですが、社員IDと日付が同じなら勤務時間の集計で残業時間になるということですがどこに何を書けば全然わかなかったです。

どなたか教えていただけませんか?

よろしくお願い致します。


      

A 回答 (2件)

前回のQAがわからないので経緯はわかりませんが、


今回要求された内容とはあっていないプログラムになっているので
根本的に無理があるのでは?

だいたい、今回の話では

工事番号 日付 社員ID 名前 開始   終了   勤務時間 残業
0001   12/9  1    A   8:00 17:00   8
0002   12/9  1    A   17:00  20:00  3

工事番号 日付 名前 開始   終了   勤務時間 残業
0001   12/9 A   8:00 17:00   8
0002   12/9 A   17:00  20:00         3
こうだしたい。ということですが、

工事番号 日付 名前 開始   終了   勤務時間 残業
0003   12/8 A   8:00  15:00   6
0004   12/8 A  15:00  20:00   5
はどうだすの?(絶対にありえないなら問題ないですが)
>素人の考えですが、社員IDと日付が同じなら勤務時間の集計で残業時間になるということですが
からは、
工事番号 日付 名前 開始   終了   勤務時間 残業
0003   12/8 A   8:00  15:00   6
0004   12/8 A  15:00  20:00        5
としたいということに読み取れますが、
工事番号 日付 名前 開始   終了   勤務時間 残業
0003   12/8 A   8:00  15:00   6
0004   12/8 A  15:00  20:00   2    3
が正しいでしょう。

ま、考え方としては、
日付 名前 開始   終了   勤務時間 残業  深夜時間
12/8 A   8:00  20:00   8  3  0
をまず求める。

工事番号 日付 名前 開始   終了   勤務時間 残業
0003   12/8 A   8:00  15:00
0004   12/8 A  15:00  20:00
を日付、開始の小さい順番に1件ずつ読み込む。
まず1件目、時間計算をして、
工事番号 日付 名前 開始   終了   勤務時間 残業
0003   12/8 A   8:00  15:00 6
とし、
日付 名前 開始   終了   勤務時間 残業  深夜時間
12/8 A   8:00  20:00   8  3  0

日付 名前 開始   終了   勤務時間 深夜時間
12/8 A   8:00  20:00   2  3  0
とする
2件目、時間計算をして、
工事番号 日付 名前 開始   終了   勤務時間 残業
0004   12/8 A  15:00  20:00 5
となるが
日付 名前 開始   終了   勤務時間 深夜時間
12/8 A   8:00  20:00   2  3  0
から勤務時間を引くとマイナスなので、こちらの2を勤務時間にいれる。
工事番号 日付 名前 開始   終了   勤務時間 残業
0004   12/8 A  15:00  20:00 2 3
さらに、残業時間を引くとマイナスにはならないのでこれでOK。
マイナスになるようなら残業時間、深夜時間について同様の処理を行う。
という方法がいいように思われますが、テーブルも増えますし、
勤務時間計算のロジックはそのまま使えるでしょうけれども、他の部分は、
既存のプログラムとは、まったく別のプログラムになるでしょう。

★今回の対象となる件数が少ないのであれば、
工事番号 日付 社員ID 名前 開始   終了   勤務時間 残業
のテーブルから、
日付 社員ID 件数(count(*))
を求めて件数が2以上の日付、社員IDに対して手修正したほうがてっとりばやいのでは?
    • good
    • 0
この回答へのお礼

ご回答していただき、ありがとうございます。

>工事番号 日付 名前 開始   終了   勤務時間 残業
>0003   12/8 A   8:00  15:00   6
>0004   12/8 A  15:00  20:00   5
>はどうだすの?(絶対にありえないなら問題ないですが)
このような計算は絶対ないです。

回答内容を参考させていただきます。
何とかやってみます。
ありがとうございました。

お礼日時:2011/12/12 09:33

プログラムをする立場の人じゃなくて、完全にお客さんだね。


無料でプログラム作って(修正して)下さいって言うだけ。

学生が勉強してるだけならまだ許せるけど、
社会人が自分の業務で使って利益出してるなら、
他人のふんどしで相撲とって賞金もらっているようなもの。

浮いたお金や時間で勉強して少しでも努力と成果が
見えれば、回答者の助言がちょっとした日本の技術発展に
繋がったのかという気にもなるけど、これっぽっちも
理解して無いなら回答者が他人の仕事を代わりにやらされた
ってだけじゃん。
自分の仕事を自分の力で解決する対価として給料もらって
るんじゃないの?他人に仕事を押し付けて給料は自分のもの?

口を開けば「分かりません。できません。」で
ソース上に
> Me.残業 = Soukinmu - tuujou
すでに残業時間の計算らしきものがあるのに
> 素人の考えですが、社員IDと日付が同じなら勤務時間の
> 集計で残業時間になるということですが
・・・全然内容を理解しようとしてないという事?

あきれた。

ま、他の人の参考にして欲しい情報は
> Dim StartTime, EndTime, Kugiri, tuujou, Soukinmu, shinyakugiri, SinyaTime As Long
VB6.0 以前と VBA でこの宣言方法はだめだろうということ。
Long は SinyaTime だけにしか適用されないはず。

VB なら GetType で型確認できるんだけど、VBA ならブレークポイント
置いて変数にカーソル合わせて、SinyaTime の初期値は 0 だけど、
他の変数が Empty で表示されたら想定外でしょ?って事かな。

回答が全く無いと削除される可能性が高くなるから書くけど、
提示のコードと出力結果の繋がりが無い。もう1処理あるはず。
出力処理が丸々抜けてる。
リンクもないし過去の回答を知らないけど、わざわざ残業時間を
総勤務時間から引いて計算しているんだから、残業時間のデータも
そのまま出力処理で判断できるはず。つまりはもうすでに残業時間
とわかっているデータの出力位置だけ変えればできてしまう可能性大。
    • good
    • 0
この回答へのお礼

早速ご回答ありがとうございます。
勉強になりました。

お礼日時:2011/12/12 09:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!