時間を加減算する |
時間を通常のように演算する (063) | |
単純な時間計算なら Private Sub Command1_Click() Dim dtmData1 As Date Dim dtmData2 As Date dtmData1 = CDate("10:25") dtmData2 = CDate("15:40") 'CInt では数値がまるめられるので Text1.Text = Format$(Int(CSng(dtmData1 + dtmData2)) * 24 + _ Hour(dtmData1 + dtmData2), "00\:") & _ Format$(dtmData1 + dtmData2, "nn") End Sub で出来るのですが?日付データを扱っているので積算には向かないようです。 このようにVB5になってもあまり便利な関数はないみたいです? 24時間以内での演算はできるのですが、月の残業時間の集計等にはもうひとつ使いづらい。 そこで独自の関数を作ってみました。 hh1に最初の時間をmm1に最初の分をss1に最初の秒を入力します hh2に次の時間をmm2に次の分をss2に次の秒を入力します enzanには足算するか、引算するかを入力します 返り値は文字列で "14:12:20" のように表示します。 又、 hh mm ss の別々にも求められます。 フォームに下記のように各コントロールを貼り付け以下のコードを貼り付けて下さい。 Option Explicit 'SampleNo=063 WindowsXP VB6.0(SP5) 2002.05.14
Dim hh As Long Dim mm As Long Dim ss As Long Private Function Jikan(ByRef hh1 As Long, ByRef mm1 As Long, _ ByRef ss1 As Long, ByRef hh2 As Long, _ ByRef mm2 As Long, ByRef ss2 As Long, _ ByVal enzan As Long) As String Dim byo1 As Long, byo2 As Long, byo3 As Long Dim h1 As Long, m1 As Long, s1 As Long, nn As Long byo1 = (hh1 * 3600) + (mm1 * 60) + ss1 byo2 = (hh2 * 3600) + (mm2 * 60) + ss2 If enzan = 1 Then '1の場合のみ引き算 byo3 = byo1 - byo2 Else byo3 = byo1 + byo2 End If h1 = byo3 \ 3600 m1 = byo3 Mod 3600: nn = m1 m1 = nn \ 60 s1 = nn Mod 60 hh = h1: mm = m1: ss = s1 Jikan = h1 & ":" & Format$(m1, "00") & ":" & Format$(s1, "00") End Function Private Sub Check1_Click() If Check1.Value = vbChecked Then Text3.Visible = False Label3.Visible = False Check1.Caption = "秒の計算をする" Else Text3.Visible = True Label3.Visible = True Check1.Caption = "秒の計算を省く" End If Text1.SetFocus End Sub Private Sub Command1_Click() On Error Resume Next Dim Nowhh As Long, Nowmm As Long Dim Nowss As Long, enzan As Long Dim ret As String If Option1.Value = True Then enzan = 0 Else enzan = 1 End If Nowhh = CLng(Text1.Text) Nowmm = CLng(Text2.Text) Nowss = CLng(Text3.Text) ret = Jikan(hh, mm, ss, Nowhh, Nowmm, Nowss, enzan) Text4.Text = ret Text1.Text = "" Text2.Text = "" Text3.Text = "" Text1.SetFocus End Sub Private Sub Command2_Click() hh = 0 mm = 0 ss = 0 Text4.Text = "" Text1.SetFocus End Sub Private Sub Form_Activate() Text1.SetFocus End Sub Private Sub Form_Unload(Cancel As Integer) Unload Me End Sub Private Sub Option1_Click() Text1.SetFocus End Sub Private Sub Option2_Click() Text1.SetFocus End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) '0〜9の数値と- と制御キーだけ入力OK If KeyAscii >= 32 And KeyAscii < 45 Or KeyAscii > 57 Or _ KeyAscii = 46 Or KeyAscii = 47 Then Beep 'エラー音 KeyAscii = 0 '入力キーを無効にする End If If KeyAscii = vbKeyReturn Then KeyAscii = 0 Text1.Enabled = False Text1.Enabled = True End If End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) If KeyAscii >= 32 And KeyAscii < 45 Or KeyAscii > 57 Or _ KeyAscii = 46 Or KeyAscii = 47 Then Beep 'エラー音 KeyAscii = 0 '入力キーを無効にする End If If KeyAscii = vbKeyReturn Then KeyAscii = 0 Text2.Enabled = False Text2.Enabled = True End If End Sub Private Sub Text3_KeyPress(KeyAscii As Integer) If KeyAscii >= 32 And KeyAscii < 45 Or KeyAscii > 57 Or _ KeyAscii = 46 Or KeyAscii = 47 Then Beep 'エラー音 KeyAscii = 0 '入力キーを無効にする End If If KeyAscii = vbKeyReturn Then KeyAscii = 0 Text3.Enabled = False Text3.Enabled = True End If End Sub |
|
特に難しいことはしていないのでコードをよく見てもらえば理解できるか思います、その分あまりスマートなコードとは言えませんが。 |