質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

915閲覧

VBAでExit Doの使い方が知りたい

AMK

総合スコア765

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/06/08 06:59

お世話になります

時間の計算でハマってしまったのでご協力をお願いします。

困っていること

ルールは
4時間を超えた場合は30分の休憩を1回
6時間-8時間の場合は45分休憩

例えば、8時間丁度なら45分休憩
8時間1分ならば30分が2回で1時間休憩

上記のルールで作成する予定です
(まだ 6時間の判定とかはできていません)

D7=8:00
E7=16:30
稼働時間:8時間30分
の時に
休憩は30分だけでよいのに2回ループして
1時間になってしまう。

試したこと

最後から3番目の行の
If data = t4 Then Exit Do を追加してループを強制的に抜けさせようと試みましたが機能しませんでした。

知りたいこと

If data = t4 Then Exit Doを機能させる方法
又は
そもそも、そのやり方じゃなくて
もっと良いやり方が有るなど、有りましたらご教示よろしくお願いいたします。

以下コード

汚いコードで申し訳ないです

VBA

1Function YEX_QK() 2Dim QK As Date 3Dim QK_COUNT As Integer 4Dim data As Date 5Dim t03 As Date 6Dim t4 As Date 7Dim t6 As Date 8Dim t8 As Date 9Dim YEX_QK2 As Date 10t03 = TimeValue("0:30:00") 11t4 = TimeValue("4:00:00") 12t6 = TimeValue("6:00:00") 13t8 = TimeValue("8:00:00") 14 15data = ActiveSheet.Range("e7") - ActiveSheet.Range("d7") 16MsgBox data 17Do While data > t4 18 data = data - t4 19 data = data - t03 20 QK = QK + t03 21 MsgBox "data=" & data & vbCrLf & "QK=" & QK 22'残りぴったり4時間ならループ脱出 23 If data = t4 Then Exit Do 24Loop 25 26End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/06/08 07:22

YEX_QK関数は、E7-D7の時間を稼働時間とみなし、その稼働時間に見合った休憩時間を返却する関数ということでよいでしょうか? 0~4時間未満は0分 4~6時間未満は30分 6~8時間未満は45分 8時間以上は60分 ということですか?
AMK

2020/06/08 07:25

はい、その通りです
AMK

2020/06/08 07:31

あ、8時間以上と言うより 4時間毎に30分休憩なので 8:00から4時間稼働で12:00 そこから30分休憩で 12:30スタートで更に4時間稼働で16:30 なのですが上記の場合は、休憩は1回で30分だけです。 16:31分だと4時間を超えてしまうので30分休憩を取るルールです。
stdio

2020/06/08 07:32

労働基準法の休憩時間によりますと、「労働時間が6時間を超える場合は45分以上、8時間を超える場合は1時間以上」とあるので、6時間働き、休憩時間が60分でもOKなような気がしますが、その辺は設計に含めないということでしょうか?
AMK

2020/06/08 07:42

ルール的にはOKですが、休憩を多く引いてしまうと給料がへっちゃうので^^; 厳密な計算で行きたいと思います。
YT0014

2020/06/08 07:46

最初のdataの計算時、DateDiff()で、分数を取得するようにしたら、以後の処理は整数演算のみになるかと。
AMK

2020/06/08 08:18

data = DateDiff("n", ActiveSheet.Range("d7"), ActiveSheet.Range("e7")) こういう事でしょうか??? やってみましたが、1901/5/24と言う表示が出てきました。
YT0014

2020/06/08 08:28

それは、510(分)をDate型に変換したからです。 素直にInteger型で受け取ってください。 ついでに言うと、プログラミングの場合、時刻と時間は峻別する必要がありますので、ご留意ください。 Date型は日付時刻型、セルに入力されているのは時刻、稼働時間や休憩時間、4時間毎などは、全て時間です。 これらを混在して処理している為、誤りが発生しています。
AMK

2020/06/08 08:34

なるほど!! 奥が深いですね・・・・
guest

回答2

0

ループで求める必要はなく、If文のみでよいと思います。

VBA

1Function YEX_QK() As Date 2 3 Dim data As Date 4 Dim t4 As Date 5 Dim t6 As Date 6 Dim t8 As Date 7 t4 = TimeValue("4:00:00") 8 t6 = TimeValue("6:00:00") 9 t8 = TimeValue("8:00:00") 10 11 data = ActiveSheet.Range("e7") - ActiveSheet.Range("d7") 12 If data < t4 Then 13 YEX_QK = TimeValue("0:00:00") 14 ElseIf data < t6 Then 15 YEX_QK = TimeValue("0:30:00") 16 ElseIf data < t8 Then 17 YEX_QK = TimeValue("0:45:00") 18 Else 19 YEX_QK = TimeValue("1:00:00") 20 End If 21 22End Function

投稿2020/06/08 07:29

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AMK

2020/06/08 07:54

回答ありがとうございます。 4時間ごとに30分休憩なのでIFだけでは、難しいです
ttyp03

2020/06/08 08:13

どうしてでしょうか? 一日当たりの稼働時間の上限は決まっているはずなので、必要な分増やせばいいと思いますが。 ループで回して処理すると想定外の不具合を埋め込む可能性もあるので、If文で固定処理化したほうがよいと私は思います。
AMK

2020/06/08 08:33

たしかに、この方法も言われてみればそうですね でも今回は、ループさせたかったので^^; (スミマセンわがままで)
guest

0

自己解決

自己解決ではないですが・・・・

YT0014様の回答により解決出来ました!!
BAに選択する方法が解らないのでコチラに記入させていただきます。

VBA

1Function YEX_QK() 2Dim QK As Integer 3Dim QK2 As Integer 4Dim data As Integer 5Dim t03 As Integer 6Dim t4 As Integer 7Dim t6 As Integer 8Dim t8 As Integer 9Dim YEX_QK2 As Date 10t03 = 30 '30分 11t4 = 240 '4時間 12t6 = 360 '6時間 13t8 = 480 '8時間 14 15'分に変換 16data = DateDiff("n", ActiveSheet.Range("d7"), ActiveSheet.Range("e7")) 17 18'判定ループ 19Do While data > t4 20 data = data - t4 21 data = data - t03 22 QK = QK + t03 23 MsgBox "data=" & data & vbCrLf & "QK=" & QK 24'残りぴったり4時間ならループ脱出 25 If data = t4 Then 26 Exit Do 27 End If 28Loop 29

投稿2020/06/08 08:47

AMK

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2020/06/08 08:50

ぴったり4時間ならループ脱出は不要なはずなので、除外した状態で動作を確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問