[[20110126081041]] 『シフト表』(NA) ページの最後に飛ぶ

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

 

『シフト表』(NA)
 月のシフト表があります。その中から、勤務者を勤務時間の早い順に並べ替えて、表示させたいです。
 早…5:00〜14:00
 A…6:00〜15:00
 B…7:00〜16:00
 C…8:00〜17:00
 D…9:00〜18:00
 遅…10:00〜19:00
 休…休み          みたいな勤務時間設定があります。

     1 2 3 4 5 6 7 8 9 ……(日付)
 佐藤  A B 休 D D D 遅 遅 B
 鈴木  休 早 A A B B 休 A A
 山田  遅 遅 D 休 A 遅 C D 休
 阿部  C 休 C C 休 A 早 休 遅

               のシフト表があります。

 例えば、3日の勤務者表を出したいとすると

     鈴木  6:00〜15:00
     阿部  8:00〜17:00
     山田  9:00〜18:00

 の様に、表示させたいのですが、わかりません。教えてください。Excel2007です。

作業列つかっていいですか?
  
	A	B	C	D	E	F …
1		1	2	3	4	5 …
2	佐藤	A	B	休	D	D …
3	鈴木	休	早	A	A	B …
4	山田	遅	遅	D	休	A …
5	阿部	C	休	C	C	休 …
6		
:		
10	3	日の勤務表
11	鈴木	6:00〜15:00
12	阿部	8:00〜17:00
13	山田	9:00〜18:00
14		
:		(B列)			(C列)
20	早	5:00〜14:00 	1
21	A	6:00〜15:00 	2
22	B	7:00〜16:00 	3
23	C	8:00〜17:00 	4
24	D	9:00〜18:00 	5
25	遅	10:00〜19:00	6
  
という表だとします。
 
仮にD11から14(最大人数が4人だから)と
E11から14を作業列とします(列じゃないけど)
何日の勤務表か、をA10に数字でいれます。
日付は必ず1日がB1からはじまるものとします。
 
作業列のE11に
=IF(OR(INDIRECT("R"&ROW(A2)&"C"&$A$10+1,0)="休",INDIRECT("R"&ROW(A2)&"C"&$A$10+1,0)=""),"",ROW(A2))
同じく作業列のD11に
=IF(E11="","",VLOOKUP(INDIRECT("R"&ROW(A2)&"C"&$A$10+1,0),$A$20:$C$25,3,0))
両方とも14までフィルコピー
 
A11に
=IF(COUNT($D$11:$D$14)<ROW(A1),"",INDEX($A$1:$A$5,VLOOKUP(SMALL($D$11:$D$14,ROW(A1)),$D$11:$E$14,2,0)))
B11に
=IF(COUNT($E$11:$E$14)<ROW(B1),"",VLOOKUP(INDEX(INDIRECT("R1C"&$A$10+1&":R5C"&$A$10+1,0),VLOOKUP(SMALL($D$11:$D$14,ROW(A1)),$D$11:$E$14,2,0)),$A$20:$B$25,2,0))
両方とも14までフィルコピー
 
(すずめ)

 ありがとうございました。すずめ様の、方法で早い時間ごとに表示されました。
 大変恐縮なのですが、同日に同勤務の人が発生する場合、どの様にすればよいか、重ね
 てご教授頂けませんでしょうか。
 例えば、佐藤A、鈴木A、みたいな場合、

 佐藤   6:00〜15:00
 佐藤   6:00〜15:00

 となってしまい、鈴木の名前が反映されないのです。(NA)

 何人ぐらいかぶりますかね?
とりあえず10人までとして
 
作業列のD11の式を
=IF(E11="","",VLOOKUP(INDIRECT("R"&ROW(A2)&"C"&$A$10+1,0),$A$20:$C$25,3,0))*10+ROW(A1)
としてください。
 
10人以上かぶるなら後ろのほうにある「*10」を「*100」にしてください。
(すずめ)

 すいません。色々やってみましたが、ダメそうなので、三度質問させて下さい。
 作成したいものは、名前が入っている人が10人で予備であと3枠ほど確保したいです。
 「休」の種類が2つ
 「休」…公休
 「−」…希望休

     A   B   C   D   E   F   …
 1       1   2   3   4   5   …(日付)
 2   佐藤  A   −
 3   鈴木  B   早
 4   山田  A   B
 5   阿部  休   −
 6   後藤  休   休
 7   遠藤  C   C
 8   松井  −   C
 9   石川  早   D
 10   斉藤  早   休
 11   浜崎  D   遅
 12  (予備空欄)
 13  (予備空欄)
 14  (予備空欄)
 15
 :
 の様なシフト表で、
 2日の勤務表なら
     鈴木   5:00〜14:00
     山田   7:00〜16:00
     遠藤   8:00〜17:00
     松井   8:00〜17:00
     石川   9:00〜18:00
     浜崎  10:00〜19:00
           の様に表示させたいです。何度もすいません。お願い致します。(NA)

 どう式を直してダメだったか書いていただけると、解説のしようもあるのですが・・・
 とりあえず想像で!
 
	A	B	C	D	E
1		1	2	3	4
2	佐藤	A	−		
3	鈴木	B	早		
4	山田	A	B		
5	阿部	休	−		
6	後藤	休	休		
7	遠藤	C	C		
8	松井	−	C		
9	石川	早	D		
10	斉藤	早	休		
11	浜崎	D	遅		
12	(予備空欄)				
13	(予備空欄)				
14	(予備空欄)				
15	(予備空欄)				
16	(予備空欄)				
:					
20	2	日の勤務表     		D列	E列
21	鈴木	5:00〜14:00			
22	山田	7:00〜16:00		102	3
23	遠藤	8:00〜17:00		303	4
24	松井	8:00〜17:00			
25	石川	9:00〜18:00			
26	浜崎	10:00〜19:00		406	7
27		          		407	8
28		          		508	9
29					
30		          		610	11
31					
:					C列
40	早	5:00〜14:00	1		
41	A	6:00〜15:00	2		
42	B	7:00〜16:00	3		
43	C	8:00〜17:00	4		
44	D	9:00〜18:00	5		
45	遅	10:00〜19:00	6		
 
最大人数をとりあえず15人としました。Aの16行まで人名を入れられます。
 
作業列のE21に
=IF(OR(INDIRECT("R"&ROW(A2)&"C"&$A$20+1,0)="休",INDIRECT("R"&ROW(A2)&"C"&$A$20+1,0)="−",INDIRECT("R"&ROW(A2)&"C"&$A$20+1,0)=""),"",ROW(A2))
同じく作業列のD21に
=IF(E21="","",VLOOKUP(INDIRECT("R"&ROW(A2)&"C"&$A$20+1,0),$A$40:$C$45,3,0)*100+ROW(A1))
両方とも35行目までフィルコピー
 
A21に
=IF(COUNT($D$21:$D$35)<ROW(A1),"",INDEX($A$1:$A$16,VLOOKUP(SMALL($D$21:$D$35,ROW(A1)),$D$21:$E$35,2,0)))
B21に
=IF(COUNT($E$21:$E$35)<ROW(A1),"",VLOOKUP(INDEX(INDIRECT("R1C"&$A$20+1&":R16C"&$A$20+1,0),VLOOKUP(SMALL($D$21:$D$35,ROW(A1)),$D$21:$E$35,2,0)),$A$40:$B$45,2,0))
両方とも35までフィルコピー
 
 
修正のポイントです。
1:勤務表($A$20:$B$35)の位置が違う場合
 ・E、D、Bの式の日付の位置(現在$A$20)の変更
 ・Dの式のE21の変更
 ・A、Bの式の作業列($E$21:$E$35、$D$21:$D$35、$D$21:$E$35)の変更
 
2:時間帯一覧表($A$40:$C$45)の位置が違う場合
 ・Dの式の$A$40:$C$45の変更
 ・Bの式の$A$40:$B$45の変更(上と列数が違うのに注意)
 
3:人数が増えた場合
 ・作業列の範囲を広げる(増えた人数分下にフィルコピー)
 ・Aの式の$A$1:$A$16を人数ぶん範囲を広げる
 ・Bの式のR16Cの16を行数と一致させる(18行目まで名前を入れるならR18Cに)
 ・AとBの式の作業列の範囲($E$21:$E$35、$D$21:$D$35、$D$21:$E$35)を広げる
 ・AとBの式の範囲を広げる(増えた人数分下にフィルコピー)
 
位置がわからず、こっちが仮定していれたので、変更しそうなポイントはこんなところでしょうか?
あとは式の意味と構成を理解していただけるとよいかと思います。
(すずめ)

 作ってみたので載せさせて下さい。

 AH列を作業列にしてみました。
	[A]	[B]	[C]	[D]	[E]	[F]	・・・	[AH]
[1]		1	2	3	4	5		作業列
[2]	佐藤	A	−					
[3]	鈴木	B	早					1.03
[4]	山田	A	B					3.04
[5]	阿部	休	−					
[6]	後藤	休	休					
[7]	遠藤	C	C					4.07
[8]	松井	−	C					4.08
[9]	石川	早	D					5.09
[10]	斉藤	早	休					
[11]	浜崎	D	遅					6.11
[12]	(予備空欄)							
[13]	(予備空欄)							
[14]	(予備空欄)							
 :								
[21]	2	日						
[22]	鈴木	5:00〜14:00 						
[23]	山田	7:00〜16:00 						
[24]	遠藤	8:00〜17:00 						
[25]	松井	8:00〜17:00 						
[26]	石川	9:00〜18:00 						
[27]	浜崎	10:00〜19:00						
:																
[34]								
 :								
[41]	区分	時間						
[42]	早	5:00〜14:00 						
[43]	A	6:00〜15:00 						
[44]	B	7:00〜16:00 						
[45]	C	8:00〜17:00 						
[46]	D	9:00〜18:00 						
[47]	遅	10:00〜19:00						
 AH2=IF(COUNTIF($A$42:$A$47,HLOOKUP($A$21,$B$1:AF2,ROW(AH2),FALSE)),MATCH(HLOOKUP($A$21,$B$1:AF2,ROW(AH2),FALSE),$A$42:$A$47,0)+ROW(AH2)/100,"")
  AH2 → AH14までフィルドラッグ
 A22=IF(COUNT($AH$2:$AH$14)<ROW(A1),"",INDEX($A$2:$A$14,MATCH(SMALL($AH$2:$AH$14,ROW(A1)),$AH$2:$AH$14,0)))
 B22=IF(A22="","",INDEX($B$42:$B$47,INT(SMALL($AH$2:$AH$14,ROW(A1)))))
  A22:B22 → A34:B34までフィルドラッグ

 (HANA)

 AH2用の式は
 =IF(COUNTIF($A$42:$A$47,INDEX(B2:AF2,$A$21)),MATCH(INDEX(B2:AF2,$A$21),$A$42:$A$47,0)+ROW(AH2)/100,"")
 で良かったですね。。。

 (HANA)

すずめ様、HANA様、ありがとうございました。おかげさまで、出来ました。助かりました。(NA)

コメント返信:

[ 一覧(最新更新順) ]


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