
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)の質問お願いについてご回答よろしくお願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
#2の回答者ですが、
VBAとはいうものの、何のVBAか分かりませんでしたから、あくまでも、Excelを想定していました。
>同項目が10個あり、延べ労働時間の合計を表示するところも作りました。(textbox6)
この件については、数とTextBoxの関係が、良く分からなかったせいもあるのですが、私の場合、それぞれの合計値を、モジュールスコープの変数を増やしておけば可能です。
私の場合は、TextBox4の入力で自動計算させるように出来ていますが、そうでない場合は、ボタンに切り替えればよいです。計算式は、TextBox4の中にあります。
>1行の計算が出来たのですが
>他9行の計算式は回答ただいた式をコピーして『textbox』数字を変更していけばよろしいのでしょうか?
私は、他人のコードの解説はしませんが、もし、「Excel」でしたら、一旦、ワークシート側のセルで計算させて、そのセルの計算値を、Textプロパティで拾い上げるようにしたほうが、複雑にならなくてよいかもしれません。確か、Excelでは、セルとリンクさせることが出来たと思います。
あくまでも、ひとつの提案です。
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
'//
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
この回答への補足
ご回答ありがとうございます。
すごい!時間計算できました。
1行の計算が出来たのですが
他9行の計算式は回答ただいた式をコピーして『textbox』数字を変更していけばよろしいのでしょうか?
あるいは範囲指定できるのでしょうか?
そして、その延べ労働時間欄の答えを合計するのはできますでしょうか?
よろしければご回答お願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル2019の関数を教えてください。 8 2022/12/16 12:45
- Excel(エクセル) エクセル 条件に合う日付に入力された時間数の合計したい 4 2022/06/17 22:18
- Excel(エクセル) エクセルで休憩時間を引く時と、引かない時の数式 3 2022/11/05 11:48
- Excel(エクセル) エクセルで休憩時間を引いての作業計画予定表の作成の仕方 2 2023/07/24 14:11
- Excel(エクセル) エクセルで勤務時間の計算をしています。 下記図でstartは勤務開始時間、endは勤務終了時間です。 5 2022/06/07 13:51
- Excel(エクセル) Excelのtextboxへの入力で小数点以下に0が続く場合でも正しく表示したい 3 2022/04/11 13:53
- Visual Basic(VBA) visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ 1 2023/02/08 00:18
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) エクセルの関数について 5 2023/01/26 15:26
- Excel(エクセル) エクセルシートの合計の変動 5 2022/04/05 15:56
このQ&Aを見た人はこんなQ&Aも見ています
-
vba 時間の引き算 例えば 15:00から16:15の間の時間は1時間15分ですが、vbaのコード
Visual Basic(VBA)
-
VBユーザーフォームで時間入力
Visual Basic(VBA)
-
ユーザーフォームのテキストボックスで時間計算
Visual Basic(VBA)
-
-
4
vbaの時間計算について
Excel(エクセル)
-
5
フォームテキストボックスの表示設定
Excel(エクセル)
-
6
VBAでの勤務時間計算
Visual Basic(VBA)
-
7
エクセルVBA ユーザーフォーム 複数のコンボボックス 同一リスト
Excel(エクセル)
-
8
excel vba 時間計算と条件分岐の質問
Visual Basic(VBA)
-
9
ユーザーフォーム時間表示
Excel(エクセル)
-
10
ユーザーフォーム上に現在日時と時刻を表示させていますがフォームを実行すると時間が更新されません。それ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA TREND関数について
-
65536は2の何乗なのでしょうか?
-
Visual C++でdebugとreleaseで...
-
matlabで複数条件のif文を行列...
-
スレッド処理からダイアログを...
-
ファミリーベーシックのPOKE&H...
-
排他的論理和 BCC(水平パリテ...
-
Javaでのある数の小数点乗に...
-
行き過ぎ量が計算値と実験した...
-
チェス 論理クイズ
-
VBAの再計算が反映されない件に...
-
FFTの計算結果について
-
ReportViewerのテキストボック...
-
プログラムの発散
-
加速度から変位の変換について
-
JAVAのプログランミング
-
Date型の範囲を超える数値について
-
fortranでのプログラムについて
-
VB6.0で逆ポーランド記法のソー...
-
エクセルマクロで以下の計算式...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
バッチファイルでウインドウを...
-
エクセルで特定のセルのみを任...
-
matlabで計算終了
-
モジュラス103の計算とは何でし...
-
変化させるセルが変化しない
-
数値計算の高速化 (cos, sin, exp)
-
CとFORTRANの計算速度はどちら...
-
モジュロ
-
スレッド処理からダイアログを...
-
時間(ミリ秒を含む)の引き算
-
VB6で正確なミリ秒を計測したい...
-
60進数の四則計算
-
PHPとJavaでSHA256の結果を同じ...
-
C言語についてです。 再帰を使...
-
なぜオーバーフローになるので...
-
VBA入力フォームで労働時間の計...
おすすめ情報