
いつもお世話になっております。
ユーザーフォームにTextBox5が開始時間、TextBox6が終了時間で
TextBox7 = TextBox6 -TextBox5
と計算がしたいのですがうまくいきません。
例1)
開始時間が16:30 終了時間が23:00 の場合はうまくいきます。
通常 TextBox7 = 5:30
深夜 TextBox27 = 1:00
例2)
開始時間が16:30 終了時間が24:00 がうまくいかない。エラーになります。
Sub test2()
Dim T1 As Date
Dim T2 As Date
Dim T3 As Date
Dim ST As Date
Dim ZAN As Date
T1 = TimeValue(UserForm1.TextBox5.Value)
T2 = TimeValue(UserForm1.TextBox6.Value) ← ★ここでエラー型が違います。
ST = TimeValue("22:00")
If T2 > ST Then
T3 = ST - T1
ZAN = T2 - ST
UserForm1.TextBox7 = T3
UserForm1.TextBox27 = ZAN
UserForm1.CheckBox5 = True
Else
T3 = T2 - T1
UserForm1.TextBox7 = T3
End If
End Sub
どうかご教授をお願い致します。
No.3ベストアンサー
- 回答日時:
こんばんは
エラーの原因は既出の通りと思います。
24時より大きな時間を扱いたいのであれば、Time形式ではなくDate形式にして計算する必要があると思われます。
現状のままでなんとかなさりたいのであれば、(簡単なもので良ければ)以下の変換関数を利用することで、Date型として値を解釈するようになります。
使い方は、入力値を引数として与えればよいです。
例えば、ご提示の
>T1 = TimeValue(UserForm1.TextBox5.Value)
の代わりに、
T1 = str2date(UserForm1.TextBox5.Value)
のようにすれば、24時間以上の値も解釈するようになります。
なるべくエラーが発生しないように、解釈不能な入力値は「0」として解釈するようにしてあります。
例えば、
5 → 0:05
9: → 9:00
AA:10 → 0:10
25:00 → 1日 + 1:00
などになりますが、24時間形式の入力決め打ちとしていますので
10:30PM → 10:00
となりますのでご注意ください。(30PM は解釈不能と判断)
やっていることは左程難しいことではないので、ご覧になればわかるかと思います。
もしも、もっときちんと解釈したいようであれば、正規表現などを利用して入力値を解析すると良いでしょう。
また、ご提示のコードの他の部分で使っている
>ST = TimeValue("22:00")
などとの整合を保つために、関数 str2date の返す値は「1900/1/0 0:00:00」を規準とする経過時間にしてあります。
(↑ おかしな日付ですけれど、エクセルの仕様なのでそれに合わせてあります)
以下、ご参考にでもなれば。
Function str2date(ByRef s As String) As Date
Dim t, d
d = 0
t = Split(Replace(s & " ", "-", ""), ":")
If UBound(t) < 1 Then t = Split("0:" & t(0), ":")
If Not IsNumeric(t(0)) Then t(0) = 0
If Not IsNumeric(t(1)) Then t(1) = 0
If t(0) > 23 Then
d = Int(t(0) / 24)
t(0) = t(0) Mod 24
End If
str2date = DateSerial(1900, 1, d - 1) + _
TimeSerial(Int(t(0)), Int(t(1)), 0)
End Function
注) 「25:30」等を解釈できますが、上限を設けていませんので「200:30」などの入力であっても解釈してしまいますのでご留意ください。(→ 8日と8:30)
No.2
- 回答日時:
>23:59:59 (午後 11 時 59 分 59 秒) まで
「24:00」以上の値を入力する予定であるなら、設計の見直しが必要です。
あと、「シリアル値」の理解も必要だと思います。
No.1
- 回答日時:
文字列で表された時刻を小数に変換します。
この小数は 0 ~ 0.99988426 の範囲内の値であり、0:00:0 (午前 00 時) から 23:59:59 (午後 11 時 59 分 59 秒) までの時刻を表します。https://support.microsoft.com/ja-jp/office/timev …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VBユーザーフォームで時間入力
Visual Basic(VBA)
-
ユーザーフォーム時間表示
Excel(エクセル)
-
ユーザーフォームに今の時間を表示
Access(アクセス)
-
4
フォームテキストボックスの表示設定
Excel(エクセル)
-
5
VBA入力フォームで労働時間の計算をしたい
Visual Basic(VBA)
-
6
時間をvbaでセルに1:00と入力する場合
Excel(エクセル)
-
7
エクセルVBA ユーザーフォームのTextBoxを日付にしたい
Excel(エクセル)
-
8
excelVBA コンボボックスに時刻で表示したい
Excel(エクセル)
-
9
ユーザーフォームのコピー?
Excel(エクセル)
-
10
Excel vba でユーザーフォームのテキストに15分刻み
Excel(エクセル)
-
11
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
12
EXCEL VBAで、日付の後に曜日を追加する方法について
Excel(エクセル)
-
13
UserForm1.Showでエラーになります。
工学
-
14
Excel VBA でテキストボックスの値をセルA列から検索
その他(プログラミング・Web制作)
-
15
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
16
ユーザーフォーム内のテキストボックス内の書式設定
Excel(エクセル)
-
17
VBAで時間の型と計算方法教えてください
Excel(エクセル)
-
18
エクセルVBAのフォームで日時を入力しやすくしたい
Excel(エクセル)
-
19
Excel VBA で時間計算の表示 Formatについて
Visual Basic(VBA)
-
20
Excel VBA で時刻の24時間表示がわかりません
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
VB.NETでアクティブなformを知...
-
5
ComboBoxの初期値をコピーする方法
-
6
C#の質問です
-
7
RGB値をL*a*b*に変換したい
-
8
ExcelでGaussian fittingをした...
-
9
OpenCVにおいてのYCrCb値の求め方
-
10
VBで電卓のメモリー機能はどの...
-
11
オブジェクト型の変数同士の値...
-
12
エクセルVBAでコンボボックスの...
-
13
VBA 小数点の割り算
-
14
変数名の取得
-
15
VB.NETでコンボボックスの1行目...
-
16
形式(値だけ)を選択して貼り...
-
17
ユーザーフォームのテキストボ...
-
18
代入したのに値が更新されない...
-
19
DateLastModifiedのフォーマット
-
20
c++のタイマーについて
おすすめ情報
公式facebook
公式twitter
お世話になります。
先に文字列に変換 → 小数点変換 → TimeValue に変換ですか?
fujillinさんこんばんわ!
ご親切な返答有難う御座います。
こんなに難しいのですね。
25:00 → 1日 + 1:00は理解できていましたが
str2date = DateSerial(1900, 1, d - 1) +TimeSerial(Int(t(0)), Int(t(1)), 0)はもう少し
勉強不足です。
有難う御座いました。