
いつもお世話になっております。
ユーザーフォームに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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) vba 「Nextに対するForが見当たりません」のエラーが発生する原因 1 2022/10/21 15:46
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
このQ&Aを見た人はこんなQ&Aも見ています
-
VBユーザーフォームで時間入力
Visual Basic(VBA)
-
フォームテキストボックスの表示設定
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
-
4
VBA入力フォームで労働時間の計算をしたい
Visual Basic(VBA)
-
5
vba 時間の引き算 例えば 15:00から16:15の間の時間は1時間15分ですが、vbaのコード
Visual Basic(VBA)
-
6
エクセルVBAのフォームで日時を入力しやすくしたい
Excel(エクセル)
-
7
ユーザーフォーム上に現在日時と時刻を表示させていますがフォームを実行すると時間が更新されません。それ
Visual Basic(VBA)
-
8
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
9
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
10
excelVBA コンボボックスに時刻で表示したい
Excel(エクセル)
-
11
UserForm1.Showでエラーになります。
工学
-
12
ユーザーフォーム時間表示
Excel(エクセル)
-
13
ユーザーフォームに今の時間を表示
Access(アクセス)
-
14
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
15
ユーザーフォームのラベルに時間を表示させてずっと時間がちゃんと動くような方法はありますか?コード書い
Visual Basic(VBA)
-
16
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
17
TextBoxから数字が文字として入力される?
Visual Basic(VBA)
-
18
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
19
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
20
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAのリストボックスの値...
-
ComboBoxとListBoxとの連動
-
VBA ドロップダウンリストを残...
-
変数に代入してある数値を表示...
-
ListBoxでオートフィルター表示
-
PysimpleGUIでデータベースを作る
-
sin(π)が0にならないです
-
値を返さないコード パス
-
VB.NET 自作プロパティが変更さ...
-
エクセルvbaで、別シートの最下...
-
VBA実行後に元のセルに戻りたい
-
Excel2003 複数セル1列の入力済...
-
ExcelVBAを使って、値...
-
PHP8でWarning:Undefined varia...
-
UNICODE文字が含まれているかの...
-
VBA ユーザーフォーム ボタンク...
-
ドロップダウンリストの初期表...
-
Excel VBA 計算式を代入するには?
-
InputBoxから論理式を得てIF文...
-
エクセルVBAで結合セルの真ん中...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
VBA ドロップダウンリストを残...
-
VB.NETでコンボボックスの1行目...
-
Excel VBAのリストボックスの値...
-
C#の質問です
-
VB初心者。小数点以下の表示で...
-
変数に代入してある数値を表示...
-
値を返さないコード パス
-
マクロで奇数と偶数の値を2か所...
-
DataGridView1のcellで計算
-
vb6のVSFlexGridで選択行、列の...
-
PL/SQLでのTO_DATEの時間取得に...
-
setcookieで「path」に複数の値...
-
変数名の取得
-
ACCESS VBA 画像ファ...
-
vbscriptを使いexcelを参照して...
-
Excel VBA 複数選択したリスト...
-
【C++/CLI.NET】コンボボックス...
-
シーケンサで最小値を保持する
-
マクロ 特定のセル値のみクリ...
おすすめ情報
お世話になります。
先に文字列に変換 → 小数点変換 → TimeValue に変換ですか?
fujillinさんこんばんわ!
ご親切な返答有難う御座います。
こんなに難しいのですね。
25:00 → 1日 + 1:00は理解できていましたが
str2date = DateSerial(1900, 1, d - 1) +TimeSerial(Int(t(0)), Int(t(1)), 0)はもう少し
勉強不足です。
有難う御座いました。