[[20190805173211]] 『条件が一致する人を表示したい』(blue) ページの最後に飛ぶ

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

 

『条件が一致する人を表示したい』(blue)

下記3つのシートがあるとします。
 ・全体カレンダー
 ・営業部シフト
 ・ショップシフト

各シフトシートには、下記のように各部署のシフトが入力されています。

	Aさん	Bさん
2019/8/5	休み
2019/8/6	休み	休み

その内容を参照して、「全体カレンダー」の「休み」欄に休みの人の
名前が表示されるようにしたいのです。

日付 休み
2019/8/5 Aさん
2019/8/6 Aさん,Bさん

下記のような計算式を入れると表示はされるのですが、
スタッフの増減があった時に計算式がずれてきたり、もう少し日付も一致すればみたいな感じの計算式があれば…と思っています。

=IF(営業部シフト!B3="休み",営業部シフト!$B$1,)&","&IF(営業部シフト!C3="休み",営業部シフト!$C$1,)&","&IF(ショップシフト!C3="休み",ショップシフト!$C$1,)

効率的な方法がありましたら、教えて頂きたいです。
宜しくお願い致します。

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


 おはようございます ^^
もっとスマートな方法が有るとは思いますが、
作ってみました。なにかの足しにでも。。。バックアップ必須です ^^;
ならなければゴミ箱にでも。。。 m(_ _)m

 営業部シフト
     |[A]    |[B]     |[C]     |[D]     |[E]     |[F]     |[G]     |[H]     |[I]     
 [1] |       |従業員 B|従業員 C|従業員 D|従業員 E|従業員 F|従業員 G|従業員 H|従業員 I
 [2] |8月5日 |休み    |        |        |        |        |        |休み    |        
 [3] |8月6日 |        |休み    |        |        |        |        |        |休み    
 [4] |8月7日 |        |        |休み    |        |        |        |        |        
 [5] |8月8日 |        |        |        |休み    |        |        |        |        
 [6] |8月9日 |        |        |        |        |休み    |        |        |        
 [7] |8月10日|        |        |        |        |        |休み    |        |        
 [8] |8月11日|        |        |        |        |        |        |休み    |        
 [9] |8月12日|        |休み    |        |        |        |        |        |休み    
 [10]|8月13日|休み    |        |        |        |        |        |休み    |        

 ショップシフト

     |[A]    |[B]     |[C]     |[D]     |[E]     |[F]     |[G]     |[H]     |[I]     
 [1] |       |従業員 J|従業員 K|従業員 L|従業員 M|従業員 N|従業員 O|従業員 P|従業員 Q
 [2] |8月5日 |休み    |        |        |休み    |        |        |        |休み    
 [3] |8月6日 |        |休み    |        |        |        |        |休み    |休み    
 [4] |8月7日 |        |        |休み    |        |        |休み    |休み    |        
 [5] |8月8日 |        |        |        |休み    |        |休み    |休み    |        
 [6] |8月9日 |        |        |        |休み    |休み    |        |        |        
 [7] |8月10日|        |休み    |        |        |休み    |休み    |        |休み    
 [8] |8月11日|休み    |        |        |休み    |        |        |        |休み    
 [9] |8月12日|        |休み    |休み    |        |        |        |        |        
 [10]|8月13日|休み    |        |        |        |休み    |        |休み    |休み    

 全体カレンダー(結果図 と なりました。)
     |[A]      |[B]                                                  
 [1] |日 付    |休み                                                 
 [2] |2019/8/5 |従業員 B,従業員 H,従業員 J,従業員 M,従業員 Q         
 [3] |2019/8/6 |従業員 C,従業員 I,従業員 K,従業員 P,従業員 Q         
 [4] |2019/8/7 |従業員 D,従業員 L,従業員 O,従業員 P                  
 [5] |2019/8/8 |従業員 E,従業員 M,従業員 O,従業員 P                  
 [6] |2019/8/9 |従業員 F,従業員 M,従業員 N                           
 [7] |2019/8/10|従業員 G,従業員 K,従業員 N,従業員 O,従業員 Q         
 [8] |2019/8/11|従業員 H,従業員 J,従業員 M,従業員 Q                  
 [9] |2019/8/12|従業員 C,従業員 I,従業員 K,従業員 L                  
 [10]|2019/8/13|従業員 B,従業員 H,従業員 J,従業員 N,従業員 P,従業員 Q

 Option Explicit
Sub OneInstance01()
    Dim WsA           As Variant
    Dim Dic           As Object
    Dim MyDat()       As Variant
    Dim Snm           As Variant
    Dim i             As Long
    Dim j             As Long
    Dim N             As Long
    Dim y             As Long
    Dim x             As Long
    Dim Base          As Variant
    WsA = Array("営業部シフト", "ショップシフト")
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each Snm In WsA
        Base = Worksheets(Snm).Cells(1).CurrentRegion
        For i = 2 To UBound(Base, 1)
            If Not Dic.Exists(Base(i, 1)) Then
                For j = 2 To UBound(Base, 2)
                    If Base(i, j) = "休み" Then
                        ReDim Preserve MyDat(N)
                        MyDat(N) = Base(1, j)
                        N = N + 1
                    End If
                Next
                Dic.Add Base(i, 1), MyDat
                N = 0
                ReDim MyDat(N)
            Else
                MyDat = Dic(Base(i, 1))
                For j = 2 To UBound(Base, 2)
                    If Base(i, j) = "休み" Then
                        ReDim Preserve MyDat(UBound(MyDat) + 1)
                        MyDat(UBound(MyDat)) = Base(1, j)
                    End If
                Next
                Dic(Base(i, 1)) = MyDat
            End If
        Next
        Erase Base
    Next
    With Worksheets("全体カレンダー")
        y = 2
        .UsedRange.Clear
        .Cells(1).Resize(, 2) = Array("日 付", "休み")
        For i = 0 To Dic.Count - 1
            .Cells(y, 1) = Dic.keys()(i)
            .Cells(y, 2) = Join(Dic.items()(i), ",")
            y = y + 1
        Next
        .UsedRange.EntireColumn.AutoFit
    End With
    Erase WsA, MyDat
    Set Dic = Nothing
End Sub
(隠居じーさん) 2019/08/06(火) 10:14

 Sub main()
    Dim zc As Worksheet, ws As Variant, c As Range
    Set zc = Sheets("全体カレンダー")
    zc.Cells.ClearContents
    For Each ws In Array(Sheets("営業部シフト"), Sheets("ショップシフト"))
        For Each c In ws.UsedRange
            If c.Value = "休み" Then
                If zc.Range("A:A").Find(c.EntireRow.Cells(1).Value, , , xlWhole) Is Nothing Then
                    zc.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, 2).Value = _
                    Array(c.EntireRow.Cells(1).Value, c.EntireColumn.Cells(1).Value)
                Else
                    zc.Range("A:A").Find(c.EntireRow.Cells(1).Value, , , xlWhole).Resize(, 2).Value = _
                    Array(c.EntireRow.Cells(1).Value, zc.Range("A:A").Find(c.EntireRow.Cells(1).Value, , , xlWhole).Offset(, 1).Value & "," & c.EntireColumn.Cells(1).Value)
                End If
            End If
        Next c
    Next ws
End Sub
(mm) 2019/08/06(火) 11:01

コメント返信:

[ 一覧(最新更新順) ]


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