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

0930と2215という2つの4桁のただの数字があります。
2215-0930=1285と言う答えになります。
が、この4桁の数字を時刻として
09:30と22:15の間は12時間45分と計算し、表示形式を12.75とする方法を知りたいです。これをアクセス上のデータで行いたいのですが、いい方法がありましたら教えて下さい。

A 回答 (5件)

アクセスのことは全然わからんのですが、


割り算の余りをもとめる、とか、
小数点以下を切り捨てた値を求める、という関数や、
変数などはありますか?
あれば、わりと簡単な計算でできます。

t1=930 (または、2215)
とすると、
h1 = 小数点以下切り捨て関数(t/100)
m1 = あまりを求める関数(t,100)
のような計算をすると、
hに9が、mに30が入ります。こうすると、
t1=h+m/60
でt1が9.5になります。
2215の方も同様の計算で t2=22.25 になります。
こうなれば、普通の引き算 t2-t1 で12.75が出せます。
    • good
    • 2

No.2さんWrote



> Private Function ....
>
これだと、別モジュールから呼び出せません。

> クエリ、VBAなどで使用できます
>
という趣旨なら、Publicスコープの方がよろしいかと・・・。
(2バイト文字の関数名というのも如何なものかと・・・)

> '時刻補正(次の日か?次の日だったら一日追加)
> If wEtime <= wStime Then wEtime = wEtime + 1

日付の情報がない限り、wEtime = wStime のときを同時刻と解釈してゼロを返すか、翌日と解釈して24(または翌々日以降と解釈して24の倍数)を返すか判断できないと思いますが、どうでしょうか?

No.3さん、端数処理で演算誤差が出るようで、

?fnc("2215", "0930") → 11.7666666666667

となります。
(「自信あり」とのことですので、私の方が間違えているのかもしれませんが・・・)

No.4さんWrote

> =Hour(TimeSerial(Int(2215 / 100) - Int(930 / 100), (2215 Mod 100) - (930 Mod 100), 0)) + Minute(TimeSerial(Int(2215 / 100) - Int(930 / 100), (2215 Mod 100) - (930 Mod 100), 0)) / 60

Intより\演算子の方がたぶんベターです。(この場合、オペランドが長整数を超えることはないはずなので)

= Hour(TimeSerial((2215 \ 100) - (930 \ 100), (2215 Mod 100) - (930 Mod 100), 0)) & ":" & Minute(TimeSerial(Int(2215 / 100) - Int(930 / 100), (2215 Mod 100) - (930 Mod 100), 0))
とすれば、"hh:nn"形式の文字列に変換する手間が省けると思います。

ちなみに、私なら、

Public Function GetTimeDiff(Stime As Integer, Etime As Integer) As Date
  GetTimeDiff = CDate(Format$(Etime, "@@:@@")) - CDate(Format$(Stime, "@@:@@"))
End Function

または、

Public Function GetTimeDiff(Stime As Integer, Etime As Integer) As String
  GetTimeDiff = Format$(CDate(Format$(Etime, "@@:@@")) - CDate(Format$(Stime, "@@:@@")), "hh:nn")
End Function

とします。
(処理速度面では難があるかもしれませんが、記述が簡明です)
    • good
    • 0

=Hour(TimeSerial(Int(2215 / 100) - Int(930 / 100), (2215 Mod 100) - (930 Mod 100), 0)) + Minute(TimeSerial(Int(2215 / 100) - Int(930 / 100), (2215 Mod 100) - (930 Mod 100), 0)) / 60



になると思います。(VBAを使うことの程でもないと思いますが・・・)
使用する状況が解らないので、数字をそのまま使いました。
    • good
    • 0

こんな感じの関数を使用してはどうでしょう。



Function fnc(t1 As Integer, t2 As Integer) As Double

Dim M As Integer
Dim H As Integer

H = Int(t1 / 100) - Int(t2 / 100)
M = (t1 - Int(t1 / 100) * 100) - (t2 - Int(t2 / 100) * 100)
If (M < 0) Then
M = M + 1
H = H - 1
End If
fnc = H + M / 60

End Function
    • good
    • 0

お疲れ様です



下記コードをモジュールに貼り付けます

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Function 経過時間算出(Stime As String, Etime As String) As Single

Dim wStime As Date
Dim wEtime As Date
Dim wMinutes As Long

'計算対象時刻取得
wStime = CDate(Mid(Stime, 1, 2) & ":" & Mid(Stime, 3, 2))
wEtime = CDate(Mid(Etime, 1, 2) & ":" & Mid(Etime, 3, 2))

'時刻補正(次の日か?次の日だったら一日追加)
If wEtime <= wStime Then wEtime = wEtime + 1

'差分の分算出
wMinutes = DateDiff("n", wStime, wEtime)

'経過時間の算出
経過時間算出 = (wMinutes \ 60) + ((wMinutes Mod 60) / 100)

End Function

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使い方は、
経過時間算出("2215","0930")

クエリ、VBAなどで使用できます
参考になれば...
    • good
    • 0

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

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