[[20160316205318]] 『シフト表から勤務時間帯ごとの合計をだしたい』(温室育ち) ページの最後に飛ぶ

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

 

『シフト表から勤務時間帯ごとの合計をだしたい』(温室育ち)

 はじめまして、温室育ちです。
 以下のシフト表から、D列の16行目以降に時間帯ごとの出勤人数を出したいと考えています。

 できれば関数で計算したいです。
 =SUMPRODUCT((B3:B12=B16)*(C3:C12=A16)*(VLOOKUP(D3:D12,Sheet2!A2:C4,2,FALSE)>=C16)*(VLOOKUP(D3:D12,Sheet2!A2:C4,3,FALSE)<=C16)*1)
 などとしてみたのですがダメでした・・・

 ご教示ください。よろしくお願いします。

 sheet1
     |[A]     |[B] |[C]     |[D]   |[E]   |[F]   |[G]   |[H]   
 [1] |        |    |        |日付  |      |      |      |      
 [2] |名前    |役割|チーム名|3月1日|3月2日|3月3日|3月4日|3月5日
 [3] |くま    |α  |動物園  |A     |      |C     |C     |      
 [4] |ぱんだ  |β  |サーカス|B     |B     |      |A     |      
 [5] |らっこ  |α  |テレビ  |      |A     |B     |      |B     
 [6] |こあら  |α  |サーカス|C     |      |A     |      |A     
 [7] |きりん  |α  |動物園  |      |A     |      |B     |B     
 [8] |たぬき  |α  |テレビ  |C     |C     |      |      |C     
 [9] |ぞう    |β  |動物園  |A     |      |B     |      |      
 [10]|らいおん|β  |サーカス|B     |      |C     |      |A     
 [11]|ねこ    |β  |テレビ  |      |B     |      |A     |      
 [12]|わんこ  |β  |動物園  |      |A     |B     |C     |      

     |[A]     |[B] |[C]   |[D]   |[E]   |[F]   |[G]   |[H]   
 [15]|チーム名|役割|時間帯|3月1日|3月2日|3月3日|3月4日|3月5日
 [16]|動物園  |α  |9:00  |     1|      |      |      |      
 [17]|動物園  |α  |9:30  |     1|      |      |      |      
 [18]|動物園  |α  |10:00 |     1|      |      |      |      
 [19]|動物園  |α  |10:30 |     1|      |      |      |      
 [20]|動物園  |α  |11:00 |     1|      |      |      |      
 [21]|動物園  |α  |11:30 |      |      |      |      |      
 [22]|動物園  |α  |12:00 |      |      |      |      |      
 [23]|動物園  |α  |12:30 |      |      |      |      |      
 [24]|動物園  |α  |13:00 |      |      |      |      |      
 [25]|動物園  |α  |13:30 |      |      |      |      |      
 [26]|動物園  |β  |9:00  |     1|      |      |      |      
 [27]|動物園  |β  |9:30  |     1|      |      |      |      
 [28]|動物園  |β  |10:00 |     1|      |      |      |      
 [29]|動物園  |β  |10:30 |     1|      |      |      |      
 [30]|動物園  |β  |11:00 |     1|      |      |      |      
 [31]|動物園  |β  |11:30 |      |      |      |      |      
 [32]|動物園  |β  |12:00 |      |      |      |      |      
 [33]|動物園  |β  |12:30 |      |      |      |      |      
 [34]|動物園  |β  |13:00 |      |      |      |      |      
 [35]|動物園  |β  |13:30 |      |      |      |      |      
 [36]|サーカス|α  |9:00  |      |      |      |      |      
 [37]|サーカス|α  |9:30  |      |      |      |      |      
 [38]|サーカス|α  |10:00 |      |      |      |      |      
 [39]|サーカス|α  |10:30 |      |      |      |      |      
 [40]|サーカス|α  |11:00 |      |      |      |      |      
 [41]|サーカス|α  |11:30 |      |      |      |      |      
 [42]|サーカス|α  |12:00 |     1|      |      |      |      
 [43]|サーカス|α  |12:30 |     1|      |      |      |      
 [44]|サーカス|α  |13:00 |     1|      |      |      |      
 [45]|サーカス|α  |13:30 |     1|      |      |      |      
 [46]|サーカス|β  |9:00  |      |      |      |      |      
 [47]|サーカス|β  |9:30  |      |      |      |      |      
 [48]|サーカス|β  |10:00 |      |      |      |      |      
 [49]|サーカス|β  |10:30 |     2|      |      |      |      
 [50]|サーカス|β  |11:00 |     2|      |      |      |      
 [51]|サーカス|β  |11:30 |     2|      |      |      |      
 [52]|サーカス|β  |12:00 |     2|      |      |      |      
 [53]|サーカス|β  |12:30 |      |      |      |      |      
 [54]|サーカス|β  |13:00 |      |      |      |      |      
 [55]|サーカス|β  |13:30 |      |      |      |      |      
 [56]|テレビ  |α  |9:00  |      |      |      |      |      
 [57]|テレビ  |α  |9:30  |      |      |      |      |      
 [58]|テレビ  |α  |10:00 |      |      |      |      |      
 [59]|テレビ  |α  |10:30 |      |      |      |      |      
 [60]|テレビ  |α  |11:00 |      |      |      |      |      
 [61]|テレビ  |α  |11:30 |      |      |      |      |      
 [62]|テレビ  |α  |12:00 |     1|      |      |      |      
 [63]|テレビ  |α  |12:30 |     1|      |      |      |      
 [64]|テレビ  |α  |13:00 |     1|      |      |      |      
 [65]|テレビ  |α  |13:30 |     1|      |      |      |      
 [66]|テレビ  |β  |9:00  |      |      |      |      |      
 [67]|テレビ  |β  |9:30  |      |      |      |      |      
 [68]|テレビ  |β  |10:00 |      |      |      |      |      
 [69]|テレビ  |β  |10:30 |      |      |      |      |      
 [70]|テレビ  |β  |11:00 |      |      |      |      |      
 [71]|テレビ  |β  |11:30 |      |      |      |      |      
 [72]|テレビ  |β  |12:00 |      |      |      |      |      
 [73]|テレビ  |β  |12:30 |      |      |      |      |      
 [74]|テレビ  |β  |13:00 |      |      |      |      |      
 [75]|テレビ  |β  |13:30 |      |      |      |      |      

 sheet2
     |[A]   |[B]     |[C]     
 [1]|シフト|出勤時間|退勤時間
 [2]|A     |9:00    |11:00   
 [3]|B     |10:30   |12:00   
 [4]|C     |12:00   |13:30   

< 使用 Excel:Excel2003、使用 OS:Windows7 >


おはようございます。
これは難しいですね。
あまり効果的な作業列も使えそうにない。
(作業シートを3シート作れば式も短くなりそうだけど、逆に手間が増えそうだし)
マクロでやった方が良いケースだと思います。
マクロなら条件や参照表などが多くても、一つ一つ順番に解決できるけど、数式だとかなり複雑ですね。

一応、D16に下のどちらの式も正しく表示できますが、これ以上纏めたりする方法が私には思い浮かばないので上級者の方の案があれば、そちらでお願いします。
空白のセルは0と表示されるので、書式設定で0;0;"" とユーザー定義して頂くか、
2003ならツール→オプションだったかな?、の[ゼロ値のセルにゼロを表示する]のチェックを外して下さい。
結果が数字に見える文字でも良ければ、TEXT関数で=TEXT(下の式,"0;0;""""")として下さい。

D16=SUM(($B16&$A16&"A"=$B$3:$B$12&$C$3:$C$12&D$3:D$12)*($C16>=Sheet2!$B$2)*($C16<=Sheet2!$C$2))+SUM(($B16&$A16&"B"=$B$3:$B$12&$C$3:$C$12&D$3:D$12)*($C16>=Sheet2!$B$3)*($C16<=Sheet2!$C$3))+SUM(($B16&$A16&"C"=$B$3:$B$12&$C$3:$C$12&D$3:D$12)*($C16>=Sheet2!$B$4)*($C16<=Sheet2!$C$4))
[Ctrl]+[Shift]+[Enter]同時押し
下右に必要数フィルコピー
か、
D16=COUNTIFS($B$3:$B$12,$B16,$C$3:$C$12,$A16,D$3:D$12,"A")*AND($C16>=Sheet2!$B$2,$C16<=Sheet2!$C$2)+COUNTIFS($B$3:$B$12,$B16,$C$3:$C$12,$A16,D$3:D$12,"B")*AND($C16>=Sheet2!$B$3,$C16<=Sheet2!$C$3)+COUNTIFS($B$3:$B$12,$B16,$C$3:$C$12,$A16,D$3:D$12,"C")*AND($C16>=Sheet2!$B$4,$C16<=Sheet2!$C$4)
下右に必要数フィルコピー
 

	A	B	C	D	E	F	G	H
1				日付				
2	名前	役割	チーム名3月1日	3月2日	3月3日	3月4日	3月5日
3	くま	α	動物園	A		C	C	
4	ぱんだ	β	サーカスB	B		A	
5	らっこ	α	テレビ		A	B		B
6	こあら	α	サーカスC		A		A
7	きりん	α	動物園		A		B	B
8	たぬき	α	テレビ	C	C			C
9	ぞう	β	動物園	A		B		
10	らいおんβ	サーカスB		C		A
11	ねこ	β	テレビ		B		A	
12	わんこ	β	動物園		A	B	C	
13								
14								
15	チーム名役割	時間帯	3月1日	3月2日	3月3日	3月4日	3月5日
16	動物園	α	9:00	1	1			
17	動物園	α	9:30	1	1			
18	動物園	α	10:00	1	1			
19	動物園	α	10:30	1	1		1	1
20	動物園	α	11:00	1	1		1	1
21	動物園	α	11:30				1	1
22	動物園	α	12:00			1	2	1
23	動物園	α	12:30			1	1	
24	動物園	α	13:00			1	1	
25	動物園	α	13:30			1	1	
26	動物園	β	9:00	1	1			
27	動物園	β	9:30	1	1			
28	動物園	β	10:00	1	1			
29	動物園	β	10:30	1	1	2		
30	動物園	β	11:00	1	1	2		
31	動物園	β	11:30			2		
32	動物園	β	12:00			2	1	
33	動物園	β	12:30				1	
34	動物園	β	13:00				1	
35	動物園	β	13:30				1	
36	サーカスα	9:00			1		1
37	サーカスα	9:30			1		1
38	サーカスα	10:00			1		1
39	サーカスα	10:30			1		1
40	サーカスα	11:00			1		1
41	サーカスα	11:30					
42	サーカスα	12:00	1				
43	サーカスα	12:30	1				
44	サーカスα	13:00	1				
45	サーカスα	13:30	1				
46	サーカスβ	9:00				1	1
47	サーカスβ	9:30				1	1
48	サーカスβ	10:00				1	1
49	サーカスβ	10:30	2	1		1	1
50	サーカスβ	11:00	2	1		1	1
51	サーカスβ	11:30	2	1			
52	サーカスβ	12:00	2	1	1		
53	サーカスβ	12:30			1		
54	サーカスβ	13:00			1		
55	サーカスβ	13:30			1		
56	テレビ	α	9:00		1			
57	テレビ	α	9:30		1			
58	テレビ	α	10:00		1			
59	テレビ	α	10:30		1	1		1
60	テレビ	α	11:00		1	1		1
61	テレビ	α	11:30			1		1
62	テレビ	α	12:00	1	1	1		2
63	テレビ	α	12:30	1	1			1
64	テレビ	α	13:00	1	1			1
65	テレビ	α	13:30	1	1			1
66	テレビ	β	9:00				1	
67	テレビ	β	9:30				1	
68	テレビ	β	10:00				1	
69	テレビ	β	10:30		1		1	
70	テレビ	β	11:00		1		1	
71	テレビ	β	11:30		1			
72	テレビ	β	12:00		1			
73	テレビ	β	12:30					
74	テレビ	β	13:00					
75	テレビ	β	13:30					

(sy) 2016/03/17(木) 07:20


 おはようございます。

 syさん ありがとうございます!  できました!!
 ただ私の手違いで、一部条件が間違っていました。
 退勤時間が11:00の場合、出勤している時刻は10:30までです。
 なので、表のD20セルは空欄が正しかったのですが、この部分は自分で修正できそうです。

 また、今回のケースはマクロでやった方がよいとのことでしたので、わかる方がいらっしゃいましたらマクロでのやり方もご教示ください。

 よろしくおねがいします。

(温室育ち) 2016/03/17(木) 09:36


 Excel2003なら

 =SUMPRODUCT(($C$3:$C$12=$A16)*($B$3:$B$12=$B16)*(SUMIF(Sheet2!$A$2:$A$4,$D$3:$D$12,Sheet2!$B$2:$B$4)<=$C16)*(SUMIF(Sheet2!$A$2:$A$4,$D$3:$D$12,Sheet2!$C$2:$C$4)>=$C16))

 かな?

 Excel2007以降なら

 =SUMPRODUCT(COUNTIFS($C$3:$C$12,$A16,$B$3:$B$12,$B16,D$3:D$12,"<>",D$3:D$12,REPT(Sheet2!$A$2:$A$4,(Sheet2!$B$2:$B$4<=$C16)*(Sheet2!$C$2:$C$4>=$C16))))

 でもよさげなんだけどね。

 ※0表示するんで、表示形式とかで対応は必要。
 
(GobGob) 2016/03/17(木) 09:38

 あら? エラーがでる。。。

 Excel2003修正っす

  =SUMPRODUCT(($C$3:$C$12=$A16)*($B$3:$B$12=$B16)*(SUMIF(Sheet2!$A$2:$A$4,D$3:D$12,Sheet2!$B$2:$B$4)<=$C16)*(SUMIF(Sheet2!$A$2:$A$4,D$3:D$12,Sheet2!$C$2:$C$4)>=$C16))
 
(GobGob) 2016/03/17(木) 09:40

 補足。

 Sheet2で、出勤 0:00の条件が無いのが前提っす (24:00はOK)
 
(GobGob) 2016/03/17(木) 09:54

 一応、0:00対応を考えたんで。

 =SUMPRODUCT(($C$3:$C$12=$A16)*($B$3:$B$12=$B16)*(SUMIF(Sheet2!$A$2:$A$4,D$3:D$12,Sheet2!$B$2:$B$4)<=$C16)*(SUMIF(Sheet2!$A$2:$A$4,D$3:D$12,Sheet2!$C$2:$C$4)>=$C16)*COUNTIF(Sheet2!$A$2:$A$4,D$3:D$12))
 
(GobGob) 2016/03/17(木) 10:15

 本線とはまったく離れて申し訳ないんですが

 >>退勤時間が11:00の場合、出勤している時刻は10:30までです。

 なら、Sheet2 の退勤時刻を 10:30 と設定すればいいのでは?
 Sheet1 の用途というか意味合いが不明ですが、仮に 【ステージに出ている時間】を表示するなら
 後片付け時間もあるでしょうから、30分前に姿を消すというのはうなづけますし、でも、Sheet2が報酬ベースの
 管理用であれば、11:00にしておくというのもわかりますが。

 その場合、出勤も 9:00 だったとしても、準備とか、そういったこともあってステージに顔を出せるのは 9:30 とか
 そういうことはないのでしょうかね。

 テーマに関係のないレスで申し訳ありません。

 時間がとれたらVBAで書いてみようかなと思い、読み返して、あれ? と思いましたので。

 (仮にコードを書いたとしても、βのコードはいつも、【ゴリゴリの力技】ですから、きっと syさんから
 さらっとスマートなものが提示されるでしょうし、βとしてはアップしない公算大ですが)

(β) 2016/03/17(木) 10:28


 お世話になっております。
 GobGobさんの式でもできました!
 本当にありがとうございます!!

 βさんもご意見くださいましてありがとうございます。説明が悪く申し訳ありません。
 βさんのおっしゃることは全くそのとおりで、退勤時間のところを10:30にしてしまえばすむことでした。
 単純に既に退勤時間が11:00とされている、出来あがったシフトパターン表を、そのまま使いたかっただけです。
 また、ご指摘いただいた準備や後片づけの件は、今回は考慮しなくて大丈夫です。

 マクロでのやり方、是非拝見したいです。もしよろしければアップしていただけると幸いです。

 よろしくおねがいします。
(温室育ち) 2016/03/17(木) 10:46

 一応書いてみました。
 やはり、ゴリゴリの力技コードになりました。
 SHeet2の出勤時刻 30分調整をいれてあります。
 詳細な検証はしていないのですが、アップします。

 Sub Test()
    Dim dicS As Object
    Dim dicA As Object
    Dim c As Range
    Dim x As Long
    Dim y As Long
    Dim kRole As String
    Dim kTeam As String
    Dim kDate As Long
    Dim body As Range
    Dim line As Range
    Dim v As Variant
    Dim tZone As Date
    Dim sZone As Variant
    Dim k As String
    Dim sCode As String

    Set dicS = CreateObject("Scripting.Dictionary")
    Set dicA = CreateObject("Scripting.Dictionary")

    'シフト情報の辞書格納
    With Sheets("Sheet2")
        For Each c In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
            '退勤時間は30分繰り上げ
            dicS(c.Value) = Array(c.Offset(, 1).Value, c.Offset(, 2).Value - TimeSerial(0, 30, 0))
        Next
    End With

    With Sheets("Sheet1")
        x = .Range("A2").End(xlToRight).Column - 3  '元データの日付の数
        '元データの情報をDicAに格納
        For Each c In .Range("D3:D14").Resize(, x)
            If dicS.exists(c.Value) Then    'シフトコード登録あれば
                kRole = c.EntireRow.Range("B1").Value
                kTeam = c.EntireRow.Range("C1").Value
                kDate = c.EntireColumn.Cells(2).Value2
                sCode = c.Value
                k = kRole & vbTab & kTeam & vbTab & kDate & vbTab & sCode
                dicA(k) = dicA(k) + 1
            End If
        Next

        x = .Range("A15").End(xlToRight).Column - 3     '展開データの日付の数
        y = .Range("A" & Rows.Count).End(xlUp).Row - 15 '展開データのデータ行数
        Set body = .Range("D16").Resize(y, x)           '展開データのデータ部分
        ReDim v(1 To y, 1 To x)                         'データ部分と同じサイズの配列生成

        For Each line In body.Rows

            kRole = line.EntireRow.Range("B1").Value
            kTeam = line.EntireRow.Range("A1").Value
            sCode = getShift(line.EntireRow.Range("C1").Value, dicS)
            If dicS.exists(sCode) Then
                For Each c In line.Cells
                    kDate = c.EntireColumn.Cells(15).Value2
                    k = kRole & vbTab & kTeam & vbTab & kDate & vbTab & sCode
                    If dicA.exists(k) Then v(c.Row - 15, c.Column - 3) = v(c.Row - 15, c.Column - 3) + dicA(k)
                Next
            End If
        Next

        body.Value = v

    End With

 End Sub

 Private Function getShift(t As Date, dic As Object) As String
    Dim d As Variant
    For Each d In dic
        If t >= dic(d)(0) And t <= dic(d)(1) Then
            getShift = d
            Exit For
        End If
    Next
 End Function

(β) 2016/03/18(金) 12:35


 お世話になっております。
 βさん、コードのご提示ありがとうございます!
 確認させていただいて、また報告いたします。
 本当にありがとうございました。
(温室育ち) 2016/03/18(金) 18:34

コメント返信:

[ 一覧(最新更新順) ]


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