プロが教える店舗&オフィスのセキュリティ対策術

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 になりません.
日付データはありませんので、時間だけで計算したいのです.

A 回答 (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 のように考える。
    • good
    • 0

元のデータはどこに入力されているのでしょうか?



VBAでは24時を越える時刻は許容されませんが
ワークシート上なら25:30というのもOKです
内部的には翌日の1:30として格納されます
    • good
    • 1

こんにちは。



それは、代入値の入れ方の問題ですね。
なるべく、セルから入力して、それを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
    • good
    • 0

#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
    • good
    • 0

エクセルでの時間計算は、すべての時間を数値に置き換えて計算されます。


で、25:30というのは、24時間を超えているので翌日の01:30を表すことにはならないと思います。日付もつけて時間計算すればうまくいくと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています