• 締切済み

VBA入力フォームで労働時間の計算をしたい

VBAで入力フォームを作りました。  1)開始時間(textbox1)・終了時間(textbox2)・休憩時間(textbox3)・従事人数(textbox4) の入力を行うと自動的に延べ労働時間(textbox5)計算し表示をしたいです。  【例:13:00(開始) 14:00(終了) 0:15(休憩15分) 5(従事人数) =3:45(textbox5)】  例の3:45という答えがでる計算式を教えていただけないでしょうか? また、上記の同項目が10個あり、延べ労働時間の合計を表示するところも作りました。(textbox6)  2)時間記入時13:00と入力が面倒なので『1300』というように『:』を省略したいです。    なお答えの欄は『:』の表記したいです。  3)また、計算終了後、表記入のボタンを押すと指定したセルに(textbox6)の答えが表示できるよう作成したいです。    0からの質問で恐縮ですが1)~3)の質問お願いについてご回答よろしくお願いいたします。

みんなの回答

回答No.3

#2の回答者ですが、 VBAとはいうものの、何のVBAか分かりませんでしたから、あくまでも、Excelを想定していました。 >同項目が10個あり、延べ労働時間の合計を表示するところも作りました。(textbox6) この件については、数とTextBoxの関係が、良く分からなかったせいもあるのですが、私の場合、それぞれの合計値を、モジュールスコープの変数を増やしておけば可能です。 私の場合は、TextBox4の入力で自動計算させるように出来ていますが、そうでない場合は、ボタンに切り替えればよいです。計算式は、TextBox4の中にあります。 >1行の計算が出来たのですが >他9行の計算式は回答ただいた式をコピーして『textbox』数字を変更していけばよろしいのでしょうか? 私は、他人のコードの解説はしませんが、もし、「Excel」でしたら、一旦、ワークシート側のセルで計算させて、そのセルの計算値を、Textプロパティで拾い上げるようにしたほうが、複雑にならなくてよいかもしれません。確か、Excelでは、セルとリンクさせることが出来たと思います。 あくまでも、ひとつの提案です。

timevalue
質問者

お礼

ご回答ありがとうございました。 いろいろと参考にさせて頂き理想としていた事ができました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

こんばんは。 その計算は、時間計算であっても、実際は24時間を越えていくものだとすれば、VBAには、[h]:mmというフォーマットがありませんから、一旦、入力された数字は、シリアル値にして計算せざるを得ませんね。 私の場合は、TextBox4 に数値を入れた時点で、計算をするようにしました。 1300 は、13:00 に変わりますが、13000 は、130:00 時間になってしまいます。 UserForm モジュールです。 '// Dim StartTime As Variant Dim FinTime As Variant Dim RestTime As Variant 'Dim Persons As Variant 'ボタンなどで計算する時は、これを活かす Dim TimeText As Variant Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)  StartTime = Time2Serial(TextBox1.Text)  TextBox1.Text = TimeText End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)  FinTime = Time2Serial(TextBox2.Text)  TextBox2.Text = TimeText End Sub Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)  RestTime = Time2Serial(TextBox3.Text)  TextBox3.Text = TimeText End Sub Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim buf As Variant Dim dum As Variant Dim i As Variant  i = Val(TextBox4.Text)  If StartTime > FinTime Then MsgBox "開始時間の方が後になっています。", 48: Exit Sub  buf = (FinTime - StartTime - RestTime) * i  dum = Time2Serial(buf) '特に出力する必要はない。  TextBox5.Text = TimeText End Sub Function Time2Serial(num As Variant)  Dim uNum As Variant  Dim lNum As Variant  Dim mTime As Double  num = Replace(num, ":", "", , , vbTextCompare) '間違って「:」を入れた時には取る  If num = "" Then Exit Function  If num - Int(num) = 0 Then   num = Format(num, "00:00")   uNum = Mid(num, 1, InStr(num, ":") - 1)   lNum = Mid(num, InStr(num, ":") + 1)      If lNum > 60 Then    MsgBox "時間値にエラーがあります。", 48    ActiveControl.Text = "" '入力しているTextBox のこと    Exit Function   End If  Else   uNum = Int(num * 24)   lNum = (num * 24 - Int(num * 24)) * 60  End If  mTime = uNum / 24 + lNum / (24 * 60)  If mTime < 10 ^ -6 Then   mTime = 0   TimeText = "Not Calculate, Too small" '微細な数値は出さない   Exit Function  Else  Time2Serial = mTime  TimeText = Format(uNum, "0") & ":" & Format(lNum, "00") '丸めている  End If End Function '//

全文を見る
すると、全ての回答が全文表示されます。
  • x-1919
  • ベストアンサー率52% (91/173)
回答No.1

エラー処理は何もしていません。 無駄も多いです。 一つぶんの延べ労働時間しか計算していませんし、セルへの転記もしていません。 ですので ":" の入力を省略する部分しか回答できていませんね。 《開始時刻と終了時刻》 n は、入力された文字列の右から 2文字 h は、入力された文字列の頭に "00" を付けたうえで右から 4文字を切り取り、それをリバースして右から 2文字を切り取り、再度リバース 123 → 頭に "00" を付ける 00123 → 右から 4文字を切り取る 0123 → リバースする 3210 → 右から 2文字分を切り取る 10 → リバースする 01 1123 → 頭に "00" を付ける 001123 → 右から 4文字を切り取る 1123 → リバースする 3211 → 右から 2文字分を切り取る 11 → リバースする 11 《休憩時間》 方法は開始時刻等と同じように読み取ったものを分に変換 《労働時間》 休憩した時間だけ終了時刻を戻したものと、開始時刻の差を分で計算 《延べ労働時間》 労働時間 (分) に人数を掛け、"h:nn" の形式に変換 インデントに全角スペースを使ってますのでご注意ください。 Private Sub CommandButton1_Click()  Dim startTime As Date ' 開始時刻  startTime = CreateTimeValue(Me.TextBox1.Text)  Dim endTime As Date ' 終了時刻  endTime = CreateTimeValue(Me.TextBox2.Text)  Dim breakTime As Long ' 休憩した時間  breakTime = Hour(CreateTimeValue(Me.TextBox3.Text)) * 60 + Minute(CreateTimeValue(Me.TextBox3.Text))  Dim laborTime As Long ' 一人あたりの有効労働時間  laborTime = DateDiff("n", startTime, DateAdd("n", breakTime * -1, endTime))  Dim quantity As Long ' 人数  quantity = Me.TextBox4.Text  Dim totalTime As Long ' 延べ労働時間 (分)  totalTime = laborTime * quantity  Dim totalTimeFormated As String ' 延べ労働時間 (h:nn)  totalTimeFormated = (totalTime \ 60) & ":" & Format((totalTime Mod 60), "00")  Me.TextBox5.Text = totalTimeFormated End Sub Private Function CreateTimeValue(aSource As String) As Date  Dim hourValue As String  Dim minuteValue As String    hourValue = StrReverse(Right(StrReverse(Right("00" & aSource, 4)), 2))  minuteValue = Right(aSource, 2)    CreateTimeValue = TimeSerial(hourValue, minuteValue, 0) End Function

timevalue
質問者

お礼

ご回答ありがとうございました。  いろいろと参考になりまして、理想に近づいた作業ができるようになりました。

timevalue
質問者

補足

ご回答ありがとうございます。 すごい!時間計算できました。 1行の計算が出来たのですが 他9行の計算式は回答ただいた式をコピーして『textbox』数字を変更していけばよろしいのでしょうか? あるいは範囲指定できるのでしょうか? そして、その延べ労働時間欄の答えを合計するのはできますでしょうか? よろしければご回答お願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 日報の時間計算を行う関数について

    勤務時間を管理の日報を作成しています。以下の条件をつけて出勤時間と退社時間を記入するだけで1日の総勤務時間を表示してくれる関数をご教示お願いします。 ・9:00出勤で18:00定時退社で15分単位で表示 ・セル(開始)は9:00、(終了)に18:00以降の時間を手入力 ・セル(工数)に関数で総勤務時間を計算 ・9:00から18:00までに1時間15分の休憩をとるため、自動的に差し引いて計算 ・残業は18:15からカウントされるため、18:30以降残業して退社した場合は15分差し引いて計算 ・残業最終時間0:00までとして計算 ・セル(開始)、(終了)に9:00~0:00の15分単位の時間以外を入力はない前提とします ・遅刻、早退による変則時間の入力はない前提とします 【例】 (開始)9:00、(終了)18:00の時は(工数)に7.75 (開始)9:00、(終了)18:15の時は(工数)に7.75 (開始)9:00、(終了)18:30の時は(工数)に8 (開始)9:00、(終了)0:00の時は(工数)に13.5 よろしくお願いします。

  • エクセルでの時間計算について

    時間計算について質問です。 図のような仕事上にかけた時間の計算をしたいのですが。終了時刻と休憩時刻で空白のセルがあるとマイナスになってしまします。 計算としてはC行の終了時刻からB列の開始時間を引き、休憩があればさらにマイナスで計算してみています。 終了時刻と休憩時刻で空白のセルがあるときには計算をせずすべてのセルが埋まったら計算結果を表示することは可能でしょうか? 現在ですと合計時間のところでマイナスになってしまい、すべて入力 がされていないと正確な数値になりません。 作業時間はその後の計算の都合上時間表示ではなく数字として表示させています。

  • EXCELでの時間計算を教えてください

    機械の稼働時間を計算する表を作っていますが、なかなか上手くいきません。下記の場合どうしたらよいでしょうか? 例えば、セルB3に開始時間9:00と入れセルB4に終了時間16:00と入れます、その時セルB5に稼働時間を表示させたいのですが、ポイントが2つあります。1つは、休憩時間が開始~終了時間内に含まれる時は、差し引くことです(10:00~10:05、12:00~12:45、15:00~15:10) もう一つは、それに依って出た答えを6:00(時:分)と表示するのではなく、360(分)で表示したいのです。 なるべく早いご回答をお願い致します。

  • Excel:勤務時間の計算がうまくいかない。

    No.1468024の質問をした者です。 勤務表を作成しています。(Excel2002を使用) 終了時刻(D列)ー開始時刻(C列)ー休憩時間(E列)=当日の勤務時間を計算しています。 No.1468024の質問でアドバイスをいただき、以下のような計算式を記述しました。 <例> =AND(C13*D13)*(MIN(IF(AND(D13>="12:00"*1,D13<="13:00"*1),"13:00",D13),"17:40")-MAX(IF(AND(C13>="12:00"*1,C13<="13:00"*1),"12:00",C13),"09:00")-E13+FLOOR(MAX(D13,"18:00")-"17:59:59","0:15")) ほぼうまくいくのですが、開始時刻9:00終了時刻12:00とした場合、勤務時間4:00となり、間違ってしまいます。(正しくは勤務時間3:00。また開始時刻9:00終了時刻が12時から13時までの間の時刻で入力された場合も勤務時間3:00と出力したいです。) 休憩時間セルに以下のような計算式を書いています。 <例> =IF(COUNT(C13:D13)<2,0,IF(D13-"12:00"*1<=0,0,IF(C13-"12:00"*1>=0,0,IF(D13<"18:00"*1,"1:00","1:20")))) 休憩時間は12時から13時までの1時間。 終了時刻が17:40以降なら20分休憩時間が加算されます。 開始、終了が入力されていないと0:00表示。 言葉足らずでしたら、進んで補足させていただきますので、よろしくお願いします。

  • エクセル時間計算

    初めまして。よろしくお願い致します。 勤務時間表を作成しているのですが、うまくいきません。 開始時間 休憩開始 休憩終了 終了時間 実働時間 9:30       12:00    12:30    18:30      ?? この実働時間を簡単に計算できれば手間がなくなるのですが。 また、休憩が2回の場合もありまして、 開始時間 休憩開始 休憩終了 休憩開始 休憩終了 終了時間 実働時間 9:30      12:00    12:30     18:00   18:30     22:30      ?? これも、すっきり計算したく思っております。 欲を言えば、実働は、30分は0.5時間と出したいので、上のパターンですと、実働が8.5と出て欲しいです。 それともう一つなのですが、 日付を入れると、曜日も修正してくれる、もしくは一番上の曜日を入れると、下が自動的に変更されるやり方は無いでしょうか? すいません、お手数ですが、よろしくお願い致します。

  • エクセルVBA(2007)での時間計算について

    エクセルVBA(2007)での時間計算について お聞きします。 勤怠集計表をVBAで作成しています。 ボタンを押すと各社員の勤務時間の計算を自動で行うマクロを作成していますが、 勤務時間の計算で困っています。 (1)5:00~22:00での勤務時間、(2)22:00~の勤務時間を出力します。 出社時間・休憩開始時間・休憩終了時間・退社時間の項目があります。 例えば、上記の項目順で、10:00・12:35・13:25・0:30の場合、深夜時間での計算がうまくいきません。 休憩時間を引くと(1)は11:10時間、(2)は2:30時間になると思いますが、計算はどの様にすれば良いでしょうか? 教えて下さい。

  • エクセルで勤怠時間(一部分の)計算方法

    エクセルで社員の勤怠時間の計算を行いたいのですが 始業から終業までの、全ての時間ではなく 始業から終業までの間で行っている、一部の時間(開始時間~終了時間)だけを取り出し計算し さらにそれを、日中時間・残業時間・深夜残業時間に振り分けを行いたいです。 始業時間は、バラバラで午前の人もいれば午後の人もいます。 また、始業=開始でない場合もあります。 色々と類似質問を参照し、式を入れているのですが振り分けがうまくいきません 以下に振り分けの際の条件と例を記載します。 C1:始業時間(手入力) D1:終業時間(C1+TIME(9,0,0)) E1:開始時間(手入力) F1:終了時間(手入力) G1,H1,I1:各時間帯から控除する休憩時間(手入力) J1:日中時間(始業時間~終業時間内の、8時間までの開始時間~終了時間) ※ここの式 K1:残業時間(22時までの終業時間を超過した、開始時間~終了時間) ※ここの式 L1:深夜残業時間(22時以降の終業時間を超過した、開始時間~終了時間) ※ここの式 例) (1)始業/9:00 終業/18:00 開始/13:00 終了/23:00 休憩1/0:30 休憩2/0:15 休憩3/0:00 結果→日中/4:30 残業/3:45 深夜残業/1:00 (2)始業/13:00 終業/22:00 開始/13:00 終了/24:00 休憩1/1:00 休憩2/0:00 休憩3/0:15 結果→日中/8:00 残業/0:00 深夜残業/1:45 お知恵をお貸し下さい

  • Excel 日付をまたぐ労働時間の計算方法

    今回、労働時間の計算方法とその合計時間をExcelで作成したいと思ったのですが 合計時間が表示されません。 教えていただけたら嬉しいです。 お願いします。 A2セル 日付        2017/11/1 B2セル 開始時間      8:00 C2セル 終了日付及び時間  2017/11/2 10:00 D2セル 休憩時間      6:00 E2セル 労働時間      =C2-B2+IF(B2>=C2,1)-D2               20時間の計算となります。 上記の表を作成し日々の労働時間の合計をSUMを使って計算すると全然違う数字になります。 今月の労働合計時間を表すにはどのようにすればいいでしょうか? 合計時間を表記するセルには 書式設定→ユーザー定義→[h]:mm を用いて表記しています。 どなたか詳しい方よりご教授いただければ幸いです。 宜しくお願い致します

  • 労働時間の計算

    労働時間を計算する方法を教えてください。 労働時間を30分単位で計算しています。例えば、5時間30分だとすれば5.30の表示となります。この人たちが2人いれば11時間となり11.00となるのですが計算では10.60となってしまいます。11.00の様にするにはどうしたら良いのでしょうか?

  • エクセルで勤怠の残業手当を計算したいのですが...

     エクセルにて勤怠表を作成しようと思っております。各セルに開始時間、終了時間、拘束時間、休憩時間、実働時間、残業時間、残業手当が表示されるようにしてあります。開始、終了、休憩は手入力でそれ以外は計算式が入っています。  そこで質問なのですが、例えば開始時間8:30、終了時間18:00、休憩時間1:00、通常労働時間8:00とすると残業時間が0:30になります。残業手当は30分毎に500円つけたいので残業手当のセルにROUNDDOWNを使っていて、この場合本来500円と表示されるところ0円となってしまいます。仮に残業時間が0:31となるように入力すると500円と表示されますが、残業時間がちょうど0:30だと0円になってしまいます。ちなみに計算式は=ROUNDDON(I2/"0:30",0)*500です。I2セルは0:30となっております。  ご回答よろしくお願いいたします。