![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
やりたい事は画像の様な表で
BとCを比較して
・①のようにCの方が遅ければ、Dに「1」が入るようにする。
・②のようにBとCが30分以上乖離していれば、Eに「1」が入るようにする。
・ただし、どちらも午前5時を基準に比較したいので
③のような場合、通常なら「1」がつくが、Dの方が早く30分以内の乖離なので「1」はつかない。
上の条件を満たす関数をD,Eに入れたい
さらにHとIを比較して
・④のようにIの方が早ければ、Jに「1」が入るようにする。
・⑤のようにHとIが30分以上乖離していれば、Kに「1」が入るようにする。
・ただし、どちらも午前5時を基準に比較したいので
⑥のような場合、通常なら「1」がつくが、Iの方が遅く30分以内の乖離なので「1」はつかない。
上の条件を満たす関数をJ,Kに入れたい
少しわかりにくいかもしれませんが、作りたい数式は以上です。
皆さんのお力を貸してください。
![「エクセルの関数で教えてください。」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/f/473416_5da6fad5974bf/M.jpg)
No.12ベストアンサー
- 回答日時:
計算式を考えました。
B,C,H,I 列を基準値を考慮した場合の分数は以下のようになります、これを基に後は比較すれば良いだけです。
=IF(HOUR(B1)<5,HOUR(B1)*60+MINUTE(B1)+1440,HOUR(B1)*60+MINUTE(B1))
=IF(HOUR(C1)<5,HOUR(C1)*60+MINUTE(C1)+1440,HOUR(C1)*60+MINUTE(C1))
=IF(HOUR(H1)<5,HOUR(H1)*60+MINUTE(H1)+1440,HOUR(H1)*60+MINUTE(H1))
=IF(HOUR(I1)<5,HOUR(I1)*60+MINUTE(I1)+1440,HOUR(I1)*60+MINUTE(I1))
これらを別の列に置いておけるならば変更などもとても楽です。
D1 セルには「=IF(E1="",IF(Ⓑ<Ⓒ,1,""),"")」
E1 セルには「=IF(ABS(Ⓑ-Ⓒ)<30,"",1)」
J1 セルには「=IF(K1="",IF(Ⓗ>Ⓘ,1,""),"")」
K1 セルには「=IF(ABS(Ⓗ-Ⓘ)<30,"",1)」
Ⓑ は「(IF(HOUR(B1)<5,HOUR(B1)*60+MINUTE(B1)+1440,HOUR(B1)*60+MINUTE(B1)))」と置き換えて下さい。
Ⓒ は「(IF(HOUR(C1)<5,HOUR(C1)*60+MINUTE(C1)+1440,HOUR(C1)*60+MINUTE(C1)))」と置き換えて下さい。
Ⓗ は「(IF(HOUR(H1)<5,HOUR(H1)*60+MINUTE(H1)+1440,HOUR(H1)*60+MINUTE(H1)))」と置き換えて下さい。
Ⓘ は「(IF(HOUR(I1)<5,HOUR(I1)*60+MINUTE(I1)+1440,HOUR(I1)*60+MINUTE(I1)))」と置き換えて下さい。
例えば D1 セルは以下のようになります。
=IF(E1="",IF((IF(HOUR(B1)<5,HOUR(B1)*60+MINUTE(B1)+1440,HOUR(B1)*60+MINUTE(B1)))<(IF(HOUR(C1)<5,HOUR(C1)*60+MINUTE(C1)+1440,HOUR(C1)*60+MINUTE(C1))),1,""),"")
No.13
- 回答日時:
No.12 の補足
・「分数」は「ぶんすう」ではなく「ふんすう」です。
・「1440」は1日の分数(ふんすう)です。(24×60)←計算出来るものは先に計算しておいた方がスピードを稼ぐ事が出来ます。
・分数(ふんすう)にすることで見た目との誤差が生じなくなります。(割り算など誤差が生じるものが無い事が重要です)
・「これらを別の列に置いておけるならば変更などもとても楽です。」はセルを変数の入れ物として使えるので仕組みを理解するのも楽だと思います。
No.11
- 回答日時:
rukaandkaito 様へ
失礼かもしれませんが私の結果と比べさせていただきました。
☆「5時以前」の処理に問題が有るパターン
B「3:59」 C「3:34」の場合
これは「パターン②」ではなく「パターン③」が正解だと思います。
B「2:51」 C「3:19」の場合
これは「パターン②」ではなく「パターン①」が正解だと思います。
☆「誤差処理」に問題がありそうなパターン
H「19:43:19」 K「20:13:06」の場合
見た目はそれぞれ「19:43」「20:13」と表示されるので、
これは「パターン⑤」になった方が良いのでは?
もちろん「秒」まで考慮するなら「パターン⑥」が正解です。
計算式だと条件が少し複雑になるだけで間違い個所を直すのが大変になるのでマクロなどのプログラムを覚えた方が宜しいかも?
ちなみにNo.4 のコードですがエラーチェックなどしなければ以下のようにかなり単純なものになります。(重かったりしたらこっちを使った方が良いかも)
Function MinDiff(開始時刻 As Date, 終了時刻 As Date, Optional 基準時刻 As String = "00:00") As Variant
Dim 開始分 As Long
Dim 終了分 As Long
Dim 基準分 As Long
基準分 = CLng(Mid(基準時刻, 1, 2)) * 60 + CLng(Mid(基準時刻, 4, 2))
If 基準分 < 1440 Then
開始分 = Hour(開始時刻) * 60 + Minute(開始時刻)
終了分 = Hour(終了時刻) * 60 + Minute(終了時刻)
If 開始分 < 基準分 Then 開始分 = 開始分 + 1440
If 終了分 < 基準分 Then 終了分 = 終了分 + 1440
MinDiff = 終了分 - 開始分
Else
開始分 = Int(開始時刻 * 1440)
終了分 = Int(終了時刻 * 1440)
MinDiff = 終了分 - 開始分
End If
End Function
しかも汎用性を削ればさらに単純です。
Function MinDiff(開始時刻 As Date, 終了時刻 As Date, Optional 基準時刻 As String = "00:00") As Variant
Dim 開始分 As Long
Dim 終了分 As Long
Dim 基準分 As Long
基準分 = CLng(Mid(基準時刻, 1, 2)) * 60 + CLng(Mid(基準時刻, 4, 2))
開始分 = Hour(開始時刻) * 60 + Minute(開始時刻)
終了分 = Hour(終了時刻) * 60 + Minute(終了時刻)
If 開始分 < 基準分 Then 開始分 = 開始分 + 1440
If 終了分 < 基準分 Then 終了分 = 終了分 + 1440
MinDiff = 終了分 - 開始分
End Function
No.10
- 回答日時:
まず基準時間を5時にしたいという事なので、判定式の際にその部分を含めれば良いと考えます。
B列の判定は「IF(B1<TIMEVALUE("05:00"),1,0)」といった具合で5時以前の場合に1日加算して計算します。
次に乖離が30分という事なので、差分が「ー(マイナス)」の場合を考慮して、2乗した値の平方根を使用します。
C列およびJ列の判定は
ということで関数を作ってみました
--------------------------------------------------------------------------------
D1:[=IF(E1="",IF(B1+IF(B1<TIMEVALUE("05:00"),1,0)<C1,"1",""),"")]
E1:[=IF(SQRT((C1-(B1+IF(B1<TIMEVALUE("05:00"),1,0)))^2)>TIMEVALUE("00:30"),"1","")]
J1:[=IF(K1="",IF(H1+IF(H1<TIMEVALUE("05:00"),1,0)>(I1+IF(I1<TIMEVALUE("05:00"),1,0)),"1",""),"")]
K1:[=IF(SQRT(((I1+IF(I1<TIMEVALUE("05:00"),1,0))-(H1+IF(H1<TIMEVALUE("05:00"),1,0)))^2)>TIMEVALUE("00:30"),"1","")]
--------------------------------------------------------------------------------
お試しください
No.9
- 回答日時:
d-q-t-p 様へ
折角なのでもう少しチェックしてみました。24時間未満なので RAND関数で作った数が書式設定さえ変えればそのまま使えるので、私の作ったものと比べてみました。
①C列が5時より前の物は誤動作するようです。
例① 2:56 2:39 本当はパターン③になる筈
例② 5:10 4:54 本当はパターン②になる筈
②秒のデータが隠れていた場合(手入力なら問題ないけどコピペや計算によるものだと可能性が有ります)
例③ 13:14:29 12:44:49 ⇒ 13:14 12:44 と表示されるので パターン②として処理した方が良いと思います。(秒まで考えるなら d-q-t-p 様が正解です)
No.8
- 回答日時:
d-q-t-p 様へ
大変申し訳ございません。コピペされたデータで書式設定が「h:mm」の場合(見た目は問題なく見えてしまっている)対応用にテストデータにわざと日付データを入れたものでテストしたので誤作動したようです。時間だけのデータの場合は問題ありませんでした。本当に申し訳ございませんでした。
No.5
- 回答日時:
②と⑤が2個ずつある意味が分かりません。
D1:=IF(AND(E1="",C1>B1+(B1<5/24)),1,"")
E1:=IF(ABS(C1-B1-(B1<5/24))+10^-5>1/48,1,"")
逆も考え方は一緒なので省略。
「10^-5」は演算誤差対策です。
それにしても最終的にやりたいことを書いた方がいいと思いますけど。
結果に数値と文字列(「1」と「""」)をまぜこぜにすること自体が
微妙に思います。
No.4
- 回答日時:
ちなみに例は間違っていますよね?
図の赤で囲ったようになるのが正解ですよね?
ワークシート関数でも出来ないわけではないのですが、時間誤差による誤動作などを除くとえらく計算式が長くなるので途中であきらめました(変数が使えないのは辛い!)
マクロ(VBA)を使っても良いのなら、汎用性の有るユーザー定義関数を作ってみたので使ってみて下さい。詳しい使い方は数日中に関数とともに私のHP( https://luckshp.web.fc2.com/ )に「分差判定」として載せる予定です。興味がある人は覗いて下さい。
このユーザー定義関数(MinDiff)を使った場合は次の計算式で出来ます。
D1セルに「=IF(E1=1,"",IF(MinDiff(B1,C1,"05:00")>0,1,""))」
E1セルに「=IF(ABS(MinDiff(B1,C1,"05:00"))>=30,1,"")」
J1セルに「=IF(K1=1,"",IF(MinDiff(H1,I1,"05:00")<0,1,""))」
K1セルに「=IF(ABS(MinDiff(H1,I1,"05:00"))>=30,1,"")」
以下がユーザー定義関数のコードです。標準モジュールにコピペして下さい。
(基準時刻を考慮た上での終了時刻から開始時刻を引いた分数が返ります)
Function MinDiff(開始時刻 As Date, 終了時刻 As Date, Optional 基準時刻 As String = "00:00") As Variant
Dim 開始分 As Long
Dim 終了分 As Long
Dim 基準分 As Long
If Len(基準時刻) = 5 Then
If IsNumeric(Mid(基準時刻, 1, 1)) Then
If IsNumeric(Mid(基準時刻, 2, 1)) Then
If Mid(基準時刻, 3, 1) = ":" Then
If IsNumeric(Mid(基準時刻, 4, 1)) Then
If IsNumeric(Mid(基準時刻, 4, 1)) Then
If CLng(Mid(基準時刻, 4, 2)) < 60 Then
基準分 = CLng(Mid(基準時刻, 1, 2)) * 60 + CLng(Mid(基準時刻, 4, 2))
If 基準分 < 1440 Then
開始分 = Hour(開始時刻) * 60 + Minute(開始時刻)
If 開始分 < 1440 Then
終了分 = Hour(終了時刻) * 60 + Minute(終了時刻)
If 終了分 < 1440 Then
If 開始分 < 基準分 Then 開始分 = 開始分 + 1440
If 終了分 < 基準分 Then 終了分 = 終了分 + 1440
MinDiff = 終了分 - 開始分
Else
MinDiff = CVErr(xlErrNum)
End If
Else
MinDiff = CVErr(xlErrNum)
End If
Else
開始分 = 開始時刻 * 1440
If 開始分 <= 基準分 Then
If 終了分 <= 基準分 Then
MinDiff = 終了分 - 開始分
Else
MinDiff = CVErr(xlErrNum)
End If
Else
MinDiff = CVErr(xlErrNum)
End If
End If
Else
MinDiff = CVErr(xlErrNA)
End If
Else
MinDiff = CVErr(xlErrNA)
End If
Else
MinDiff = CVErr(xlErrNA)
End If
Else
MinDiff = CVErr(xlErrNA)
End If
Else
MinDiff = CVErr(xlErrNA)
End If
Else
MinDiff = CVErr(xlErrNA)
End If
Else
MinDiff = CVErr(xlErrNA)
End If
End Function
![「エクセルの関数で教えてください。」の回答画像4](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/4/542332295_5da786db848d3/M.png)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 人事・法務・広報 うちの会社の総務課は、終業時間より30分以内にロッカーまで移動して私服に着替えて出門しなかったり、始 4 2023/06/26 15:27
- Excel(エクセル) 出退勤管理の遅刻・早退時間について 3 2023/08/10 15:33
- Excel(エクセル) エクセルの早退時間を計算したいです。計算はうまくいっているようですが… 1 2022/12/26 16:22
- Excel(エクセル) エクセル シート比較で書式を変えるを繰り返したい 2 2023/05/05 11:25
- Word(ワード) 数値に差のあるデータを分かりやすく比較する方法について。医療現場におけるヒヤリハットの発生件数を事例 3 2022/07/18 14:24
- Excel(エクセル) Excelで、ゴルフ場、ボウリング場、フィットネスクラブの利用者数比較をしたいです。 しかしフィット 4 2022/11/20 22:17
- カラオケ 利用した事ある方はご存知かと思いますが、 快活クラブと、JOYSOUND。 まぁ地域やお店によって、 4 2022/05/16 15:29
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- Excel(エクセル) 出退勤管理の早退時間について 4 2023/08/21 15:22
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[MS Access]クエリで変換 hhmm...
-
標準時間と117の時間の10秒のずれ
-
ゆいレールの3両編成の時刻を教...
-
エクセル 時間計算 指定の時...
-
サンライズエクスプレスの通過時刻
-
JR時刻検索に付いて教えて下さ...
-
はまなすの入線時刻
-
ユーザーフォームから入力され...
-
VBA で PCの 時刻を サーバー時...
-
8時間以上だったら1時間マイ...
-
iPhoneのボイスメモ
-
サンヨーTEL-L780留守...
-
電車の時刻
-
東北新幹線はやて351号の東京駅...
-
SL(DL)やまぐち号 津和野行きの...
-
ここの「間」は要りますか
-
鈴鹿サーキット2015年9月25日の...
-
ETON E1XMの現在時刻日本時間)...
-
Accessの重複なしのカウントの...
-
エクセルVBAでタイマーコントロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フリー wifi でwindowsの時刻が...
-
8時間以上だったら1時間マイ...
-
Accessの重複なしのカウントの...
-
[MS Access]クエリで変換 hhmm...
-
アルファエックス
-
iPhoneのボイスメモ
-
下の画像の問題の(2)なのですが...
-
午後11時59分って何時? 昼の11...
-
標準時間と117の時間の10秒のずれ
-
SL(DL)やまぐち号 津和野行きの...
-
米原駅から栃木県足利市八幡町...
-
電線等の入線潤滑材の代用品っ...
-
時間と時刻の違い!?
-
サンライズエクスプレスの通過時刻
-
エクセルで早朝深夜労働時間を...
-
VBA で PCの 時刻を サーバー時...
-
[h]:mm形式→10進法への変換
-
Excelでミリsecまでの2つの時...
-
エクセルのNow関数の時刻の更新...
-
エクセル 時間計算 指定の時...
おすすめ情報
①完成例として手入力しました。
②例として挙げたのでシリアル値かどうかが良く分かりません。