- ベストアンサー
アクセス上で4桁の数字を時刻として何時間経過したか計算する方法
0930と2215という2つの4桁のただの数字があります。 2215-0930=1285と言う答えになります。 が、この4桁の数字を時刻として 09:30と22:15の間は12時間45分と計算し、表示形式を12.75とする方法を知りたいです。これをアクセス上のデータで行いたいのですが、いい方法がありましたら教えて下さい。
- みんなの回答 (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が出せます。
その他の回答 (4)
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 とします。 (処理速度面では難があるかもしれませんが、記述が簡明です)
- ja7awu
- ベストアンサー率62% (292/464)
=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を使うことの程でもないと思いますが・・・) 使用する状況が解らないので、数字をそのまま使いました。
- tksoft
- ベストアンサー率36% (99/273)
こんな感じの関数を使用してはどうでしょう。 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
- how-do-you-do
- ベストアンサー率56% (59/104)
お疲れ様です 下記コードをモジュールに貼り付けます '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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などで使用できます 参考になれば...