[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『条件が一致する人を表示したい』(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.