- ベストアンサー
ACCESS2010 クエリ 24時間以上表示
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
【バグ発見】1レコード目の合計値が違っていました。 ウン、間違いなしと思ったが・・・。1レコード目の合計値が違っていました。そこで、経過した時間そのものを調べるやり方に・・・。 Public Function FormatTime(ByVal intTime As Date) As String Dim T As Integer T = DateDiff("n", "00:00:00", intTime) FormatTime = Format(T \ 60, "0:") + Format(T Mod 60, "00") End Function これで、3レコードの合計値に限っては正しく表示するようになりました。
その他の回答 (6)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足の補足】XferDate()で使っているCutStr()。 Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足】縦横集計および合計の求め方。 添付図のような縦横集計および合計計算は必ず発生します。まず、例の場合の各プロパティの設定を示します。 プレス縦計.コントロールソース:=FormatTime(Sum(XferDate([プレス]))) 総合計.コントロールソース:=FormatTime(Sum(XferDate([行合計]))) 要は、文字列であれDate型であれDate型に変換して演算して目的を達成しています。もちろん、 プレス縦計.コントロールソース:=FormatTime(Sum(([プレス])) と、不必要な変換はしなくても構いません。添付図のテストでは、次のXferDate()の引数に日付・時刻型をセットしても問題なく動作を確認するために敢えて一度変換しています。 Public Function XferDate(ByVal strTime As String) As Date XferDate = (CutStr(strTime, ":", 1) * 1) / 24 + (CutStr(strTime, ":", 2) * 1) / 1440 End Function
- imogasi
- ベストアンサー率27% (4737/17069)
古いころの質問回答ですが http://okwave.jp/qa/q858042.html にある通り、アクセスでは、 (1)複数レコード分を合計したときに24時間を超える、とか (2)1人分だが続きの1単位などで(たとえば超過勤務で)30時間など、24時間を超える入力をする などの場合、時間数のままで(1日(数日)に繰り上げずに)時間のままで表示する書式は用意されていないようです。エクセルの[h]:mmに当たるようなものがない。 上記質問のころから、いまはバージョンが上がっても、その後、改善されていないようです。開発したMSの必要性の認識が不足している。 全レコードで、時間と分を分けた2フィールドにする手はあるが、分の部分の合計などで、1(数)時間への繰上りは望むのですよね。すると行き詰まる。 VBAでも、自製の書式といっても、許される書式の中での範囲内だけのようで、テーブルやフォームの書式のレイヤー的なものがあると思うのですが、そこに私たちユーザーが、直接思う通りの表示をする方法(API利用か?)は、解説を見たことがない。そこまでユーザーにいじらせないのだろう。 文字列で考える方法はあるが、その後計算には使えない。 参考 http://stabucky.com/wp/archives/3203 https://support.microsoft.com/ja-jp/kb/210276/ja 「アクセス 24時間以上表示」でGoogleで照会すれば、参考記事がたくさんある。
お礼
返事遅くなってしまってすみません アクセスも、[h]:mmがあればいいのですがね 2016では 改善されるのですかね?
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足】なぜ、最初のFormatTime()は計算をミスったのか? それは、 H = TimeValue * 24 で切り上げたからです。 Public Function FormatTime(ByVal TimeValue As Date) As String Dim H As Integer Dim S As Integer H = Fix(TimeValue * 24) S = TimeValue * 24 * 60 FormatTime2 = Format(H, "0:") + Format(S Mod 60, "00") End Function と、時間を切り上げさせなければ正しい値になります。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
1、Accessの日付・時刻型は1日が1に相当する。 2、つまり、一日は1*24=24時間。 3、つまり、一日は1*24*60=1440秒。 この約束事に従えば、FormatTime()は次のように書けます。 Public Function FormatTime(ByVal Time As Date) As String Dim H As Integer Dim S As Integer H = Time * 24 S = Time * 24 * 60 FormatTime = Format(H, "0:") + Format(S Mod 60, "00") End Function 添付のクエリの実行図のSQL文は次の通りです。 SELECT 時間.*, FormatTime([プレス]+[板金]+[組立]) AS 合計, * FROM 時間; PS、近頃ミスが多いのでよくチェックされ自己責任で・・・。
お礼
返事遅くなってしまってすみません 今、やってみたら、見事に表示しました なんども、コメントをいただいてありがとうございます また、わからないことあったら、教えてくださいね ありがとうございます