[[20170120223819]] 『日と時間の計算について』(ぽんた) ページの最後に飛ぶ

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

 

『日と時間の計算について』(ぽんた)

[20161228070810]『有給休暇時間の算出』関連の質問です。
再度、きちんと整理しての質問です。よろしくお願いします。
以下のような表があります。
GとHは、A〜Fの計算結果です。

例えば、
24行目 1月21日に0.5日(8:30〜13:15)の有給を取得しています。
25行目 1月23日に1日の有給を取得しています。
26行目 1月24日から1月25日の2日の有給を取得しています。
27行目 1月27日に2時間(9:30〜11:30)の有給を取得しています。
という具合に、GとHに計算結果を出したいのです。
その場合、日の単位と4時間は0.5として、G列に結果を出したいのです。
それ以外の時間は、H列に結果を出したいのです。

どうぞよろしくお願いします。

   A      B     C      D      E      F      G      H
   日付         日付   時間          時間  日     時間
24 1/21   〜            8:30  〜     13:15  0.5
25 1/23   〜    1/23          〜            1
26 1/24   〜    1/25          〜            2
27 1/27   〜            9:30  〜     11:30         2

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 始期と終期の中間に休み(土日祝)があったらどうするんですか?

 どこかに祝日リストが作られているんですか?
 それとも、小刻みに入力して土日祝は跨らない様にするんですか?

(半平太) 2017/01/20(金) 22:53


ありがとうございます。
そうですね。それは、あくまで平日として考えたいと思います。
また、実働時間は8時間です。お昼休み(12:15〜13:00)を除きます。
どうぞよろしくお願いします。
(ぽんた) 2017/01/20(金) 23:01

 (1) G24セル =IF(COUNT(A24:C24)=2,C24-A24+1,IF(AND(COUNT(D24:F24)=2,TEXT(MAX(0,MIN("12:15",F24*1)-D24)+MAX(0,F24-MAX("13:00",D24)),"h:mm")="4:00"),0.5,""))
 (2) H24セル =IF(OR(ISNUMBER(G24),COUNT(D24:F24)<2),"",TEXT((MAX(0,MIN("12:15",F24*1)-D24)+MAX(0,F24-MAX("13:00",D24)))*24,"0.0000")*1)

 下にコピー

 <結果図>
  行  ___A___  _B_  ___C___  ____D____  _E_  ____F____  __G__  __H__
  23  開始日        終了日   開始時刻        終了時刻   日数   時間 
  24  1月21日  〜            8:30       〜   13:15       0.5        
  25  1月23日  〜   1月23日             〜                 1        
  26  1月24日  〜   1月25日             〜                 2        
  27  1月27日  〜            9:30       〜   11:30                2 
  28  1月20日  〜            8:30       〜   14:15                5 
  29  1月20日  〜            8:30       〜   11:30                3 
  30                                                                

(半平太) 2017/01/20(金) 23:20


半平太さん、ありがとうございます。
ただ、F列のデータの入力規則に設定しているユーザー設定の数式「=$AB24=INT($AB24)」のためか、
上記数式をG列とH列に設定したところ、13:15という時間をF列に入力するとエラーが出てしまい、入力ができません。どのような対応が必要でしょうか?
(ぽんた) 2017/01/20(金) 23:37

それから、24行目の状態で、F列に17:15と入力したところ、
H列に8時間と出てしまいます。
この場合は、あくまでH列に入力不可とさせたいです。
8時間=1日ですから、その結果を出すためには、A列とC列に必ず入力して、G列に1日とさせたいです。
色々言って申し訳ありません。よろしくお願いします。
(ぽんた) 2017/01/20(金) 23:43

おはようございます。
これに付随する形で、C列に入力をしたら、D列とF列には入力できないようにデータの入力規則で設定出来ればと思います。逆に、D列又はF列に入力すると、C列には入力できない設定としたいのですが、データの入力規則の設定で制限することは可能でしょうか?
併せて、ご教示いただけるとありがたいです。よろしくお願いします。
(ぽんた) 2017/01/21(土) 07:30

データの入力規則の関数を日単位の関数が入っているセルに変更したり、自分なりに修正してますが、エラーとなり、入力が出来ません。みなさん、お力添えのほどよろしくお願いします。
(ぽんた) 2017/01/21(土) 13:05

 レイアウトの説明に一貫性がないような気が・・・以下、推測で、

 <想定レイアウト>
  行   ___K___   L   ___M___  _N_  ____O____  _P_   _S_  ____T____  _U_  _Z_  _AA_  _AB_
  23   開始日        終了日        開始時刻              終了時刻             日数  時間
  24   1/21     〜                 8:30                  16:15                         7
  25   1/23     〜   1/23                                                        1      
  26   1/24     〜   1/25                                                        2      
  27   1/27     〜                 9:30                  11:30                         2

 1.終了日(M列)の入力規則

   開始時刻または終了時刻が入力されていたら入力不可

   M24:M100を選択して、入力規則を設定する。
   【入力の種類】→ユーザー設定、
    □空白を無視する  のチェックを外す
   【数式】ボックスに → =COUNT(O24,T24)=0

 2.開始時刻(O列)または終了時刻(T列)の入力規則

  (a)終了日が入力されていたら、入力不可
  (b)時間(AB列)は空白か、1〜7の整数でなかったら、入力不可

  O24:O100、T24:T100を選択して、入力規則を設定する。
   入力の種類→ユーザー設定、
   □空白を無視する のチェックを外す
   数式ボックスに → =AND($M24="",OR($AB24="",ISNUMBER(MATCH((0&$AB24)*1,ROW(INDIRECT("A1:A7")),0))))

(半平太) 2017/01/21(土) 16:52


半平太さん、ありがとうございます!
レイアウトの説明に不備がありまして、申し訳ありません。
しかし、ご教示いただいた形を早速設定させていただいたところ、思いどおりの形になりました!
ありがとうございます!改めて凄い知識をお持ちなんだなと感心しております。

半平太さん、もう一つお尋ねしたいことがあります。
これは有給休暇簿なのですが、これまでの様式はK列からAB列まで全て手入力のもので、人によっては合計の入力ミスなど多々あって、結局は最初から管理職が確認するという二度手間なものとなっていました。
今回、皆さんのおかげで、使い勝手の良い素晴らしいものができました。

ただ、お昼休みを挟んだ場合の終了時刻をよく理解していない人がいまして、、、もう一つ別の入力パターンとして、AA列とAB列を直接入力することで、T列とM列を自動化するというものを作成してみたいのですが、今一度ご教示頂ければ有難いです。それに伴って、他の入力規則等の修正も必要になる場合もあるかと思います。

どうぞよろしくお願いいたします。
(ぽんた) 2017/01/21(土) 19:22


 (1) M24セル =IF(OR(AA24=0.5,AA24=""),"",K24+AA24-1)
 (2) T24セル =IF(OR(O24="",COUNTBLANK(AA24:AB24)=2),"",IF(O24<"12:15"*1,O24+IF(AA24=0.5,"4:00",IF(ISNUMBER(AA24),"",AB24/24))+(O24+IF(AA24=0.5,"4:00",IF(ISNUMBER(AA24),"",AB24/24))>"12:15:01"*1)*"0:45",MAX("13:00",O24)+IF(AA24=0.5,"4:00"*1,IF(ISNUMBER(AA24),"",AB24/24))))

 下にコピー

 <結果図>
  行 ___K___  L  ___M___ _N_ ____O____ _P _S_ ____T____ _U_  _____AA_____ _____AB_____
  23 開始日      終了日      開始時刻         終了時刻       日数(手入力) 時間(手入力)
  24 1/21    〜              8:30             13:15                   0.5             
  25 1/23    〜              8:30             16:15                                  7
  26 1/24    〜  1/24                                                   1             
  27 1/27    〜  1/28                                                   2             
  28 1/20    〜              9:30             11:30                                  2
  29 1/20    〜              8:30             14:15                                  5
  30 1/23                    8:30             11:30                                  3
  31 1/21                    8:30                                                     

 入力規則の設定 (※以前の入力規則はクリアする)

 1.AA24:AA100
 =AND(K24<>"",AB24="",OR(AND(AA24=0.5,O24<>""),MOD(AA24,1)=0))
 □空白は無視する のチェックは外す

 2.AB24:AB100
 =AND(K24<>"",AA24="",AB24<>4,O24<>"",ISNUMBER(MATCH(AB24,ROW(INDIRECT("A1:A7")),0)))
 □空白は無視する のチェックは外す

(半平太) 2017/01/22(日) 00:04


返事が遅くなってしまい申し訳ありませんでした。
半平太さん、すごい!の一言です。
ありがとうございます。
今後ともよろしくお願いします。
(ぽんた) 2017/01/23(月) 13:00

半平太さん、入力がうまくできなくなってしまったのですが、
何か原因があるでしょうか?
色々ためしてみたのですが、0.5を出す時間の組み合わせはうまくいくのですが、
それ以外の時間の入力がエラーとなってしまいます。
ご指導願います。
K列からT列を入力するパターンです。
(ぽんた) 2017/01/23(月) 16:25

 >何か原因があるでしょうか?

 多分、エクセルのバグだと思います。
 今まで、聞いたことがないトラブルですね。

 同じ規則を再度設定すると普通にワークするので、対症療法として、
 下のマクロを「ThisworkBookのモジュール」に貼り付けてはどうでしょうか?

 Private Sub Workbook_Open()
     Range("ZZ1000").Validation.Delete
 End Sub

 一旦保存して閉じ、再オープンすれば正常化します。

 ※マクロに意味はありません。エクセルに活を入れることだけが目的です。

 ※マクロが含まれることになるので、ファイルの拡張子は「.xlsm」の形式にする必要があります。

(半平太) 2017/01/23(月) 19:02


半平太さん、ありがとうございます。
上記マクロを入れて入力テストしたところ、ほぼ入力できるようになったのですが、
以下(結果が7時間)が入力不可となってしまいます。
7時間までは入力可能なはずだと思いますが、エラーとなってしまいます。
今一度、どうぞよろしくお願いします。

8:30〜16:15
9:00〜16:45

(ぽんた) 2017/01/24(火) 00:50


それから、以下の数式の ROW(INDIRECT("A1:A7")) 部分はどのような意味になりますか?

=AND($M24="",OR($AB24="",ISNUMBER(MATCH((0&$AB24)*1,ROW(INDIRECT("A1:A7")),0))))

どうぞよろしくお願いします。

(ぽんた) 2017/01/24(火) 00:53


おはようございます。
再び、ファイルを開き時間のテスト入力をしてみると、昨日同様0.5以外入力不可となってしまいます。
困ってしまいます。どのような対応が必要でしょうか?
今一度、よろしくお願いします。
(ぽんた) 2017/01/24(火) 07:08

一つ気づいたことがあります。
この部分 ROW(INDIRECT("A1:A7")) のA7をA8やA6等に修正してやると、その時点では計算ができます。
しかし、一旦上書き保存して開きなおして入力すると、再び計算ができなくなります。(0.5が結果となる計算のみ可能)
よろしくお願いします。
(ぽんた) 2017/01/24(火) 07:21

 >以下(結果が7時間)が入力不可となってしまいます。 
 >7時間までは入力可能なはずだと思いますが、エラーとなってしまいます。 
 >8:30〜16:15 
 >9:00〜16:45 

 こちらでは、普通に入力できます。
 現象が再現しないので、エラーの原因は分かりません。

 >それから、以下の数式の ROW(INDIRECT("A1:A7")) 部分はどのような意味になりますか? 
 単に、1〜7までの配列を作っているだけです。

 配列定数が使えれば {1;2;3;4;5;6;7} でいいんですが、入力規則には使えない為。

 わざわざINDIRECT()を使っているのは、表のレイアウトが変更になって、
 その配列が勝手に(自動的に)変化するのを避けるためです。

 >=AND($M24="",OR($AB24="",ISNUMBER(MATCH((0&$AB24)*1,ROW(INDIRECT("A1:A7")),0)))) 
                      ~~~↑~~~~~~   
                      ここは単に$AB24だけでよかったです。(当初の仕様の名残です)

 全体の意味は、
 (1)M24が必ず空欄であること
  かつ
 (2)AB24が空欄であるか または 数値が1,2,・・,7のどれかであること。(注:AB24が4になることはない→0.5日に移るので)

 こんなのでもよかったです。
  ↓
 =AND($M24="",IF($AB24="",TRUE,AND($AB24=INT($AB24),1<=$AB24,$AB24<=7)))
         ↑
 そこで、実際にこれに変え、くだんのマクロを消してテストしてみたところ、マクロ無しでもいけました。
 そちらでもテストしてみてください。(□空白は無視する のチェックを外すのをお忘れなく)

(半平太) 2017/01/24(火) 08:02


半平太さん、ありがとうございます。
今日修正頂いた分に修正したところ、うまく計算してくれました。
ありがとうございます。本当にすごいです。

半平太さん、別のところで質問している [20161227180631] についてですが、
こちらにもお力をいただけませんか?
これがうまく動作できれば、有給休暇簿が完成するんです。
厚かましいお願いなのですが、よろしくお願いします。
(ぽんた) 2017/01/24(火) 20:34


先日ご教授いただいた以下のデータ入力の規則について、お尋ねです。

日単位取得の場合は、M列に入力。時間単位取得の場合は、O列及びT列に入力します。
これをさらに発展させて、日単位取得の場合は、AA列の合計から限度の日数を超えると入力不可させ、時間単位取得の場合は、AB列の合計から限度の時間を超えると入力不可とさせたいのです。そのため、以前ご教授いただいた以下の数式を変更する必要があるのですが、どのような形に変更すればよいでしょうか?

前提条件として、AU16セルにその年に取得できる日数が入力されているとします。
AU16=40日
時間単位取得限度数=40時間(これは誰でも共通)
日単位取得限度数=35日(AU16-上記時間を除して算出)

M24:M100を選択して、入力規則を設定する。

   【入力の種類】→ユーザー設定、
    □空白を無視する  のチェックを外す
   【数式】ボックスに → =COUNT(O24,T24)=0

O24:O100、T24:T100を選択して、入力規則を設定する。

   入力の種類→ユーザー設定、
   □空白を無視する のチェックを外す
   数式ボックスに → =AND($M24="",OR($AB24="",ISNUMBER(MATCH((0&$AB24)*1,ROW(INDIRECT("A1:A7")),0))))
(ぽんた) 2017/01/29(日) 09:51

 【M24:M100】
 =AND(COUNT(O24,T24)=0,SUMIF(AA$24:AA24,">=1")<=$AU$16-5)

 【O24:O100、T24:T100】
 =AND($M24="",IF($AB24="",TRUE,AND($AB24=INT($AB24),1<=$AB24,$AB24<=7)),COUNTIF(AA$24:AA24,0.5)*4+SUM(AB$24:AB24)<=40)

(半平太) 2017/01/29(日) 10:44


コメント返信:

[ 一覧(最新更新順) ]


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