[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームで時間計算』(よしひろ)
ユーザーフォームにてテキストボックス9つ作成しました。 textbox1=sh(時) textbox2=sm(分) textbox3=ss(秒) textbox4=s1000(1/1000秒) textbox5=fh(時) textbox6=fm(分) textbox7=ss(秒) textbox8=f1000(1/1000秒)
textbox9=time
テキストボックス1〜4は開始時刻、5〜8は終了時刻としました。 それで、個々の数字を入力し、その時間をtextbox9に表示させたいのです。
例) textbox1=8 textbox2=0 textbox3=0 textbox4=0 textbox5=8 textbox6=0 textbox7=20 textbox8=999
8:00:00.000〜8:00:20.999の差が20.999とテキストボックスに 表示されるようにしたいのです。
time.Value = (fh * 60 * 60 + (fs + (fm * 60)) + (f1000 / 1000)) - (sh * 60 + (ss + (sm * 60)) + (s1000 / 1000))
と記述すると、「28340.999」表示されてしまいます。
どなたかご教授願います。
textbox5 は fh * 60 * 60 としているのに、textbox1 は sh * 60 としていますね。 (みやほりん)(-_∂)b
こんにちは。かみちゃん です。
> 8:00:00.000〜8:00:20.999の差が20.999とテキストボックスに > 表示されるようにしたいのです。
TextBoxの表示方法は、合っていると思いますが、計算方法がまずいように思います。 すでに、みやほりんさんからアドバイスが出ていますが、それも加味して、以下のようなコードを 試してみてください。
Sub Sample() Dim fh,fs,fm,f1000 Dim sh,ss,sm,s1000 Dim dtTime
sh = "8" ss = "0" sm = "0" s1000 = "0" fh = "8" fs = "0" fm = "20" f1000 = "999"
dtTime = (fh * 60 * 60 + (fs + (fm * 60)) + (f1000 / 1000)) - (sh * 60 * 60 + (ss + (sm * 60)) + (s1000 / 1000)) dtTime = WorksheetFunction.Round(dtTime - Int(dtTime / 1) + Int(dtTime / 1) / 60, 3) MsgBox dtTime End Sub
(かみちゃん) 2009-01-12 11:08
※11:09一部修正しました。
みやほりん さん、かみちゃん さん 返信どうもありがとうございました。 数式の記述ミスを訂正し、以下の記述にて思っていたことができました。 time = Round((fh * 60 * 60 + (fs + (fm * 60)) + (f1000 / 1000)) - (sh * 60 * 60 + (ss + (sm * 60)) + (s1000 / 1000)), 3) ありがとうございました。(よしひろ)
こんにちは。かみちゃん です。
> 以下の記述にて思っていたことができました。
そのコードですと、20.999 ではなく、1200.999 になりますが、そういうことでよかったのですね?
(かみちゃん) 2009-01-12 11:41
>そういうことでよかったのですね? この場合、ご提示の変数代入の問題ですね。 fs = "0" [秒を示す変数] fm = "20" [分を示す変数] 次のような物も有効かと思われます。 MsgBox Format((TimeSerial(fh, fm, fs) - TimeSerial(sh, sm, ss)) * 86400 + (f1000 - s1000) / 1000, "0.000") また、またはオブジェクト型の変数名と推測される「time」は VBAの予約語(Time関数、Timeステートメント)と重複しますので、 変更されたほうがよろしいでしょう。 (動作するかもしれませんが、後々、紛らわしくなる場合がある) (みやほりん)(-_∂)b
こんにちは。かみちゃん です。
>>そういうことでよかったのですね? > >この場合、ご提示の変数代入の問題ですね。
みやほりんさん、ご指摘ありがとうございます。 その通りでした。
よしひろさん、失礼しました。
(かみちゃん) 2009-01-12 12:17
解決したと思っていましたが、また問題が・・・ 秒で試していたので気づかなかったのですが、1分を超えて計算させると、秒で表示されます。 2分30秒=150 これを分表示させる(2:30.000)にするにはどのように記述したらよろしいのでしょうか? よろしくお願いいたします。
こんにちは。かみちゃん です。
> 1分を超えて計算させると、秒で表示されます。 > 2分30秒=150 > これを分表示させる(2:30.000)にするには
みやほりんさんの記述をお借りすると、 以下のような感じでできると思います。
MsgBox Format((TimeSerial(fh, fm, fs) - TimeSerial(sh, sm, ss)), "hh:mm:ss") & _ Format((f1000 - s1000) / 1000, ".000")
これをまた、計算の根拠に使うならば、少し工夫がいるかもしれません。
(かみちゃん) 2009-01-12 15:13
秒までと、1/1000秒を文字列でくっつけるのなら 繰り下がる時の考慮が必要になってくると思います。 MsgBox Format((TimeSerial(fh, fm, fs + (s1000 > f1000) * 1) - TimeSerial(sh, sm, ss)), "hh:mm:ss") & _ Format((f1000 - s1000) / 1000 - (s1000 > f1000) * 1, ".000")
(HANA)
こんにちは。かみちゃん です。
▼HANAさん
> 秒までと、1/1000秒を文字列でくっつけるのなら > 繰り下がる時の考慮が必要になってくると思います。
本当ですね。ご指摘ありがとうございます。 でも、秒までと1/1000秒を文字列でくっつける方法しか思いつきませんでした。
なお、この方法ですと、 変数の型宣言を明示しておかないと、 00:02:30-.002 というような結果になる場合がありますね。
その場合は、 MsgBox Format((TimeSerial(fh, fm, fs + (Val(s1000) > Val(f1000)) * 1) - TimeSerial(sh, sm, ss)), "hh:mm:ss") & _ Format((Val(f1000) - Val(s1000)) / 1000 - (Val(s1000) > Val(f1000)) * 1, ".000")
としたほうがいいのかもしれませんが、変数の型宣言をきちんとするほうが得策ですね。
また、もっとスマートな方法があるかもしれません。
(かみちゃん) 2009-01-12 16:11
除雪にてしばらく留守にしておりました。かみちゃんさん、HANAさん、ありがとうございます。 さて、構文ですが、テキストボックスに表示はむずかしいのでしょうか? かみちゃんさんの記述でメッセージボックスを表示させることはできました。 そこで、別の案で、メッセージボックスを表示させたあと、メッセージボックスの「OK」を押したら、セルの A1に値を入力するということは可能でしょうか? マクロの記録ではできなかったので、どう記入してよいか分かりません。 どうか、よろしくお願いいたします。
最初のご相談で下記のようにご自身で書かれています。 >time.Value = ・・・・ >と記述すると、「28340.999」表示されてしまいます。 もともとは間違った値であっても表示させることは出来ていたわけですよね? その上で >どう記入してよいか分かりません。 ということであれば、基礎力不足が懸念されます。 オブジェクトのプロパティに値を代入する、というステートメントで できると思いますが。 [オブジェクト式].[プロパティ] = [値] (みやほりん)(-_∂)b
難しく考えすぎていたようです。なんとか出来ました。これを応用して頑張ってみます。 ありがとうございました。(よしひろ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.