• 締切済み

エクセルVBAの時間計算

Excel2000を使用しています. VBAで時間計算をしていまうが、日をまたぐ時間計算がうまくいきません. 例 dim a as date  ’入室時間 dim b sa date   ’退室時間 dim x as date  ’滞在時間 x= b - a で aが23:00 bが25:30 だと xが2:30 になりません. 日付データはありませんので、時間だけで計算したいのです.

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.5

>日付データはありませんので、時間だけで計算したいのです. これは乱暴なはなしですよね。翌々日の場合とか、朝8時に入室し、9時に退室する場合と、翌日あさ9時に退室する場合が区別できない。午前4時で全員退室の仮定をおき、0-4時は24時間足した時間から引き算するとかどうですか。 25:30と入れる(表現する)のも、一般になじみがないのでは。 エクセルVBAはセルの値を主に計算しますので、エクセルの時刻の表し方、扱い方にあわせて、VBAコードを組み立てないとしょうがないでしょう。 B11に23:30 B12に25:30:00 の場合 例えば25時30分はセルの値では、1.062500 になるから Sub test02() Range("B15") = Range("B12") - Range("B11") End Sub B15の値は0.083333333 時刻表示では=B15*24の2 のように考える。

すると、全ての回答が全文表示されます。
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.4

元のデータはどこに入力されているのでしょうか? VBAでは24時を越える時刻は許容されませんが ワークシート上なら25:30というのもOKです 内部的には翌日の1:30として格納されます

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 それは、代入値の入れ方の問題ですね。 なるべく、セルから入力して、それをDate型にしないで、Double型で扱うとうまくいくはずです。ただ、この場合、最初から、Rangeオブジェクトのプロパティを、Value2 にすると、楽に出来ます。 VBAで、日付や時間を、そのまま、Date型の変数に文字列代入というのは、ある程度の経験のある人ならしないはずです。コーディングだけだったら、日付型のリテラル値を使いますが、それも、今回は使えません。 それで、やむを得ず、Excelに備えられている Evaluate関数を使用してみました。VBなら、おそらく、一旦、「:」を区切り文字にして、時間と分を分離して行うことになるかと思います。最後まで、その解は、VBAの中では、中途半端な形のままで、文字列としてしか扱うことが出来ないように思います。出来れば、ワークシートの中で行ったほうがよいです。VBA上だけですと、これは、なかなか、難しい内容ですね。 ---------------------------------------------------------- Sub HoursColculate()   Dim input1 As String 'テキストボックスなどから   Dim input2 As String ' ""   '   Dim a As Double '入室時間   Dim b As Double '退室時間   Dim x As Double '滞在時間   '   Dim d As String      input1 = "23:00" '代入値   input2 = "25:30" '代入値      If IsDate(input1) Then     a = CDate(input1)   Else     a = Evaluate("=" & "(""" & input2 & """)*1")   End If   If IsDate(input2) Then     b = input2   Else     b = Evaluate("=" & "(""" & input2 & """)*1")   End If      If b >= a Then     x = b - a   Else     MsgBox "マイナスの計算できません": Exit Sub   'ただし、ここは、Abs にしても良い。   End If      If x < 1 Then     d = Format$(CDate(x), "hh:mm")   Else     d = CStr(Int(x * 24)) & ":" & Format$((x - Int(x * 24)) * 60, "00")     'ここの行で、文字列によって端数が切り捨てになっています。   End If      MsgBox d End Sub

すると、全ての回答が全文表示されます。
  • taka0028
  • ベストアンサー率33% (19/57)
回答No.2

#1の方のとおり日付をつけないとコンパイルエラーになりますね 23:59:59を超える場合には日付を+1して演算すればうまくいきます Dim a As Date '入室時間 Dim b As Date '退室時間 Dim x As Date '滞在時間 a = "1900/1/1 23:00" b = "1900/1/2 2:30" x = b - a

すると、全ての回答が全文表示されます。
回答No.1

エクセルでの時間計算は、すべての時間を数値に置き換えて計算されます。 で、25:30というのは、24時間を超えているので翌日の01:30を表すことにはならないと思います。日付もつけて時間計算すればうまくいくと思います。

すると、全ての回答が全文表示されます。

関連するQ&A