時間を加減算する
                                                        玄関へお回り下さい。
時間を通常のように演算する         (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


    
特に難しいことはしていないのでコードをよく見てもらえば理解できるか思います、その分あまりスマートなコードとは言えませんが。



2002/05/14