[[20101119085442]] 『時間の表示について』(みく) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『時間の表示について』(みく)

 すいません 教えて下さい。
 セルに、ある時刻が入っています。
 「09:01:56」というように入っていて表示は「09:01」となっています。
 これを四捨五入みたいな感じで「09:02」に表示させる事は可能でしょうか。
 またこの時刻の入っているセルをコピーして貼り付ける作業をするのですが
 その時にセル自体の値を四捨五入させてしまった値を貼り付ける方法はありますでしょうか。
 よろしくお願いします。

何処のセルに「09:01:56」の時刻が在って、何処のセルに「09:02」を出力するのが解らないので?。
取り合えず、A1のセルに「09:01:56」と入力すれば、其のセルの値を「09:02」に変更します
入力するセルの在るシートのシートモジュールに以下を記述して下さい

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim vntValue As Variant
    Dim lngValue As Long

    With Target
        'A1以外はSubを抜ける
        If Not (.Column = 1 And .Row = 1 And .Count = 1) Then
            Exit Sub
        End If
        '値を変数に代入
        vntValue = .Value
    End With

    '値が倍精度時数なら
    If VarType(vntValue) = vbDouble Then
        '小数点以下を取得
        vntValue = vntValue - Fix(vntValue)
        '少数点以下が有れば
        If vntValue > 0 Then
            '分に変換して四捨五入
            lngValue = Int(vntValue * 24 * 60 + 0.5)
            'イベントを停止
            Application.EnableEvents = False
            '時刻(シリアル値)に変換して、元のセルに戻す
            Target.Value = TimeSerial((lngValue \ 60), (lngValue Mod 60), 0)
            'イベントの再開
            Application.EnableEvents = True
        End If
    End If

End Sub

(Bun)


間違いではないのですが?。以下でも善いです

        If vntValue > 0 Then
            '分に変換して四捨五入
'            lngValue = Int(vntValue * 24 * 60 + 0.5)
            lngValue = vntValue * 24 * 60 '★変更
            'イベントを停止

(Bun)


 表示形式では無理でしょうね。

   時間  実際の内容(シリアル値)
 1:01:00 0.042361111
 1:01:10 0.042476852
 1:01:20 0.042592593
 1:01:30 0.042708333
 1:01:40 0.042824074
 1:01:50 0.042939815
 1:02:00 0.043055556
 1:02:10 0.043171296
 1:02:20 0.043287037
 1:02:30 0.043402778
 1:02:40 0.043518519
 1:02:50 0.043634259
 1:03:00 0.04375

 別のセルに
 =CEILING(A1,0.00069)
 なんてのはダメ?
 ↑
 もっと良い数式があると思いますが。
 秒の四捨五入ってどうやるのか知らないけど。
 BJ

 関数でやるなら

 =ROUND(A1*24*60,0)/(24*60)

 でも善いと思いますが?
 変換誤差が出ると怖いので

 =TIME(INT(ROUND(A1*24*60,0)/60),MOD(ROUND(A1*24*60,0),60),0)

 とすれば善いかも?

 (Bun)


 =time(hour(a1),minute(a1),round(second(a1),-1))

 これでは? 因みにこれは、秒の1桁目を四捨五入ですけど・・・。

 ichinose@仕事中(見積り作成中)


 みなさん ありがとうございます。
 急に用事ができまして外出してました。まだどれも確認してないのです。
 来週早々には確認したいと思います。
 ありがとうございました。

 (みく)


 時刻の四捨五入については、みなさんのおけげで出来る事ができました。
 もう少し教えて欲しいのですが。
 例えば、Bunさんの「=ROUND(A1*24*60,0)/(24*60)」 を使った場合ですが、
 A1に「09:01:56」という時刻が入っていて、B1に「=ROUND(A1*24*60,0)/(24*60)」 の式を
 入れると表示的には、「09:02」となっています。
 それを「コピー」してC1に「形式選択して貼り付け」で「値」とした場合
 C1には「09:02:00」という値が入りますよね。この値を「09:02」とする事は可能でしょうか。
 表示を「09:02」にする事はセルの書式設定で可能なのですが、セル自体の値を「09:02」に
 したいのです。秒の単位を「00」としないでカットして「09:02」だけにしたいのです。
 どうでしょうか。できないでしょうか。
 よろしくお願いします。

 (みく)

 EXCEL はもともと時間を1日(24時間)を1とする実数で持っています。
 ですから 9:02 であろうと、9:02:00 であろうと内部的には、0.376388888888889
 という数値です。
 これを 9:02 と解釈するか、9:02:00 とするのは表示形式だけの問題であって
 数値側の問題ではありません。
 ですから今回の場合は、C1 に対してあらかじめ時間書式で hh:mm を指定して
 おくことで値として張り付けた際に09:02 と表示されます。

 どのような張り付け方をしても、強制的に書式を修正するようなことは、
 マクロを使用すればできますが、それをお望みでしょうか。

 下記のマクロをシートに設定しておいて、C1に適当な1以下の数値を入れて
 みれば(あるいはコピーしてみれば)、すべて分までの時間として表示される
 のが確認できるかと思います。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub
    Range("C1").NumberFormatLocal = "h:mm"
 End Sub
 (Mook)

 Mookさんの言われる様に時刻のシリアル値は、1日を1としてその割合である少数点以下の
 倍精度実数(Double)で在る為、秒が00なら表示が「09:02:00」であれ、「09:02」であれ
 表示の問題だけで、同じシリアル値と成ります
 ただ、「1日を1としてその割合である」ので原理的には「=ROUND(A1*24*60,0)/(24*60)」で
 善いと思いますが?
 なにぶんにも、倍精度実数なので下位の方で多少計算結果が、
 手で「09:02:00」と打った時と違う可能性が有りますので
 使うなら「=TIME(INT(ROUND(A1*24*60,0)/60),MOD(ROUND(A1*24*60,0),60),0)」の方を使って下さい

 (Bun)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.