
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELなどで「返す」という表現
-
電卓でmodの計算
-
CCurの引値を文字列にする時と...
-
相性占いのソース
-
VBAで関数をつくる
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
モジュラス103の計算とは何でし...
-
ファミリーベーシックのPOKE&H...
-
Java 電卓の連続計算
-
フォームのテキストコントロー...
-
傾いた四角形内の範囲の条件式
-
matlabで計算終了
-
エクセルVBA 他の仕事を止...
-
40桁の
-
なぜオーバーフローになるので...
-
matlabでの長時間の計算について
-
PHPとJavaでSHA256の結果を同じ...
-
表計算上の式がVBA実行中に、メ...
-
CとFORTRANの計算速度はどちら...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
変化させるセルが変化しない
-
EXCELなどで「返す」という表現
-
VBAの再計算が反映されない件に...
-
VBAで関数をつくる
-
matlabで計算終了
-
排他的論理和 BCC(水平パリテ...
-
モジュラス103の計算とは何でし...
-
引き放し法による除算アルゴリ...
-
バッチファイルでウインドウを...
-
スレッド処理からダイアログを...
-
数値計算の高速化 (cos, sin, exp)
-
エクセルで特定のセルのみを任...
-
モジュロ
-
関数を使わないで日付の計算を...
-
階乗のマクロ
-
時間(ミリ秒を含む)の引き算
-
なぜオーバーフローになるので...
-
論理演算子.NOT.の使い方
-
PHPとJavaでSHA256の結果を同じ...
おすすめ情報