- ベストアンサー
現在の時間を5分単位で切り捨てで表示したい
会社で退社時間を記した書類を出すのですが、 退社時間を5分単位切り捨てで表示するにはどうしたらいいですか? やりたいことは 例えば、終了時間が17:30だとしたら 現在時間をNOW()で表示させて、17:30より前だったら、17:30を表示して 17:30を超えていたら5分単位で切り捨てして現在の時間を表示したいのです。 例えば、17:59ならば、17:55になります。 A1にNOW()を入れて、 A2にIF(A1<17:30、17:30,FLOOR(A1,"0:05"))ではエラーがでます。 どうしたらいいですか? 表示形式の問題でしょうか。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>A1にNOW()を入れて、 >A2にIF(A1<17:30、17:30,FLOOR(A1,"0:05"))ではエラーがでます。 はい、エラーになります。 原因は 17:30 です。 17:30 → "17:30" でエラーは回避できますが目的に合いません。 >どうしたらいいですか? "17:30"は 1900/1/0 17:30 として評価されます。 A1の値は 2013/9/4 16:30 のようになりますのでA1と"17:30"を比較すると常に"17:30"の方が小さくなります。 A1の値から整数部(日付部分)を除去して比較しないと目的に合いません。 MOD関数で小数部(時刻部分)で比較します。 =IF(MOD(A1,1)<"17:30",INT(A1)+"17:30",FLOOR(A1,"0:05"))
その他の回答 (6)
- bunjii
- ベストアンサー率43% (3589/8249)
回答No.6の訂正です。 IF関数の論理式に誤りがありました。 誤 =IF(MOD(A1,1)<"17:30",INT(A1)+"17:30",FLOOR(A1,"0:05")) 正 =IF(MOD(A1,1)<0+"17:30",INT(A1)+"17:30",FLOOR(A1,"0:05")) 時刻のシリアル値と文字列を直接比較すると正しい判定になりませんでした。 MOD(A1,1) と比較対象は 0+"17:30" とするか TIME(17,30,0) としなければなりません。 動作確認が不十分であったことをお詫びいたします。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
現在時刻のデータ作製の方法ですが、もしも社員一人ひとりに異なる時刻を異なる行などに記入し、それを記録として残しておくのが目的だとすると、ショートカットキー Ctrl+: で現在の時刻が記入できますね。こうして記入すると、関数ではないので、再計算などでも書き換わったりしないというメリットがありますね。 A1 17:59 …… NOW 関数あるいは Ctrl+: あるいは数字をタイプして作製 B1 =max("17:30",floor(a1,"0:05")) ……記入したセルの書式を「時刻」などに指定 なお B1 の数式においては、No.3 さんが教えてくださっているような「"17:30"*1」という処理は不要です。比較演算子(「=」、「<」など)と並べて書くときは、この処理が必要になります。
- keithin
- ベストアンサー率66% (5278/7941)
>17:30より前だったら、17:30を表示して >17:30を超えていたら5分単位で切り捨てして現在の時間を表示したい =MAX("17:30",FLOOR(MOD(NOW(),1),"0:5")) とかで。 勿論この計算でも17:30じゃダメです。 こういうやり口がもしも納得いかないなら、素直にTIME関数とかTIMEVALUE関数をご利用になるのも良いでしょう。 NOW関数の値は「年月日時分秒」ですから、ただの17時30分と比較しては当然いつでも大きくなります。 上述のようにして時分秒だけ切り取るとか、あるいはNOW()-TODAY()みたいなのもありです。
- tsubuyuki
- ベストアンサー率45% (699/1545)
> A2にIF(A1<17:30、17:30,FLOOR(A1,"0:05"))ではエラーがでます。 > 表示形式の問題でしょうか。 いえ、表示形式の問題ではなく、書き方の問題です。 一般的にエクセルで式中に「17:30」と入れてしまうと、 これは「17行目から30行目」の意味にとられがちです。 確認のため、適当なセルに「=17:30」と入力するときっと「#VALUE」が返ります。 同様に適当なセルに「="17:30"*1」として、表示形式を「時刻」にすると エラーは発生せず、正しく「17:30:00」が返ってきます。 このように、式中で「時刻」を扱うときには、引用符""で括って「時刻文字列」とし、 何らかの手段でシリアル値にしてやる必要があります。 ※上記では「1をかけて」シリアル値に直してやっています。 今回の式の例でも同様に、エラーを回避するには =IF(A1<"17:30"*1,"17:30"*1,FLOOR(A1,"0:05")) として、「時刻を表す文字列に1をかけて」シリアル値にしてやる必要があります。 とは言え、上記だと返り値が文字列になってしまいます。 更に加えて言うのであれば、 > A1にNOW()を入れて、 ですから、A2は常に「当日の17:30」との比較にしてやらないと正しい結果は返りません。 なのでもう一工夫して =IF(A1<TODAY()+"17:30",TODAY()+"17:30",FLOOR(A1,"0:05")) としてやると、当日の17:30と比較して、当日の時刻を返してくれます。 「日付を表す整数をTODAY関数で取り出し、時刻を表す文字列「"17:30"」を強引に足して」 「日付+時刻を表すシリアル値」に直して比較してやっています。 A1セルがNOW関数じゃなく、時刻のみを入力する方式なのであれば、 上の単純な式(「*1」を使った式)でも対応可能です。 参考までにどうぞ。 追記) 「時刻」と「時間」は厳密には違う意味を持つ言葉です。 まぁ、字をよく読めばきっとわかるとは思いますが、念のため。
- m_and_dmp
- ベストアンサー率54% (992/1825)
NO.1です。 基本的には貴殿の考えで良いようです。 A2にIF(A1<17:30、17:30,FLOOR(A1,"0:05")) を FLOOR(A1,"0:05") とすれば5分切り捨てになりますので、 A1<17:30がいけないのではないでしょうか、 時間で17:30 は、17.5/24なので、 A1にはNOW()ではなく、時間だけが入っているとして、 IF(A1<17.5/24、17.5/24,FLOOR(A1,"0:05")) とすると、期待したとおりの結果になります。 しかし、NOW()の場合は、2013年9月3日12:00 として、時間だけではなく1900年ごろから数えた日数が入っていますので、41,520.5000のような数字になります。時間だけになるように整数部分を引き算する手順[たとえば、X-Int(X) ]を追加するとうまくいくでしょう。 FLOOR関数を使って正解がでるように頑張ってください。
- m_and_dmp
- ベストアンサー率54% (992/1825)
A1にNOW() A2に =ROUNDDOWN(A1*24*60/5,0)/24/60*5