[[20191108164552]] 『別店舗へ出勤する人物名を別ブックへ反映したい』(ゆき) ページの最後に飛ぶ

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

 

『別店舗へ出勤する人物名を別ブックへ反映したい』(ゆき)

出勤する人物名を別ブックへと反映したい。

はじめまして。
仕事柄、別店舗に出勤することが多いため、シフトが確定する度にブック事にExcelに入力→プリントしたものを照らし合わせてダブルチェック……という二度手間を無くしたいと思いました。

・一郎、二郎、三郎、四郎が毎日A店、B店、C店のどこかへ出勤するのを一覧にしたブック「月別」がある
・A店用の勤務者をまとめたブック「A店用」が別にある
・「月別」に入力した時点で、「A店用」へ人物名を反映させたい
・それぞれの店舗で個別のブックがある
・A店舗は2人出勤しているため、セルを上段と下段に分けている
・A列、1行目がテンプレートとなっており、毎回B2〜E4に入力しています。

「月別ブック」(sheet月別1月)入力用
   [A]   [B]   [C]   [D]   [E]
[1]      一郎  二郎  三郎   四郎
[2]  1日   A    C    B    A
[3]  2日   B    A    C    B
[4]  3日   C    B    A    C

「A店用ブック」(sheetA店1月)反映用
   [A]   [B]   [C]   [D]
[1]  1日   2日   3日   4日
[2]  一郎   二郎   三郎   一郎
[3]  四郎           四郎
[4]  5日   6日   7日   8日
[5]  二郎   三郎   一郎   二郎
[6]           四郎

表記がわかりづらくて申し訳ありません。
自分の力で一度組んでみようと思い、HlookupやDget、Ifを使おうと試行錯誤しましたが、初心者故にどのように組めばいいものか全くわからず……。
お力添えをいただきたく質問させていただきました。
また、自分の力でできるようでしたら、マクロやVBAも深く勉強してみようかと考えております。

難しいことを求めていることは重々承知の上です。
まず、可能か不可能か、またはエンジニアの方に発注するべき案件かのご助言をいただけましたら幸いです。
よろしくお願い致します。

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


 >「A店用ブック」(sheetA店1月)反映用

 は4日で行が変わるのでしょうか?
 例えば横にひと月分とかではだめですか?

 また、月別ブックの行列を入れ替えることは可能ですか?
 こちらも横にひと月分ということになります。

(渡辺ひかる) 2019/11/08(金) 17:25


「A店用ブック」については、すぐに印刷できるような配置になっているので、月曜日〜日曜日の7日分×4列といった感じの格子状のカレンダーになっています。
印刷外に横並びでひと月分のデータを挿入することは可能なので、それをカレンダーに反映できたら完璧です。

「月別ブック」については、同上の理由で行列の入れ替えが不可能な配置です。
ですが、もし行列の入れ替えが可能であればどのような命令を入力すればいいかをお教えいただきたいです。
(ゆき) 2019/11/08(金) 18:53


 こんばんは!

 ちょっと書いてみました。
 ちょっと検証不足気味ですけど、、
 ただ単に書き出すだけなら↓こんな感じになりました。。

 答えはあってますかぁ??
 後は、、応用して頂けると助かります。

 では、、では、、

 2019/11/1    一郎     二郎    三郎    四郎
1(金)	       A	C	B	A
2(土)	       B	A	C	B
3(日)	       C	B	A	C
4(月)	       A	C	B	A
5(火)	       B	A	C	B
6(水)	       C	B	A	C
7(木)	       A	C	B	A
8(金)	       B	A	C	B
9(土)	       C	B	A	C
10(日)	       A	C	B	A
11(月)	       B	A	C	B
12(火)	       C	B	A	C
13(水)	       A	C	B	A
14(木)	       B	A	C	B
15(金)	       C	B	A	C
16(土)	       A	C	B	A
17(日)	       B	A	C	B
18(月)	       C	B	A	C
19(火)	       A	C	B	A
20(水)	       B	A	C	B
21(木)	       B	A	C	B
22(金)	       C	B	A	C
23(土)	       A	C	B	A
24(日)	       B	A	C	B
25(月)	       C	B	A	C
26(火)	       A	C	B	A
27(水)	       B	A	C	B
28(木)	       B	A	C	B
29(金)	       C	B	A	C
30(土)	       B	A	C	B

 1(金)	2(土)	3(日)	4(月)	5(火)	6(水)	7(木)
一郎	二郎	三郎	一郎	二郎	三郎	一郎
四郎			四郎			四郎
8(金)	9(土)	10(日)	11(月)	12(火)	13(水)	14(木)
二郎	三郎	一郎	二郎	三郎	一郎	二郎
		四郎			四郎	
15(金)	16(土)	17(日)	18(月)	19(火)	20(水)	21(木)
三郎	一郎	二郎	三郎	一郎	二郎	二郎
	四郎			四郎		
22(金)	23(土)	24(日)	25(月)	26(火)	27(水)	28(木)
三郎	一郎	二郎	三郎	一郎	二郎	二郎
	四郎			四郎		
29(金)	30(土)					
三郎	二郎	

 Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MyA As Variant
Dim MyAry As Variant
Dim v As Variant
Dim x As Variant
Dim y As Variant
Dim z As Variant
Dim n As Variant
Dim q As Variant
Dim i As Long
Dim j As Long
Dim k As Long
Dim SD As Long
If Target.CountLarge > 1 Then Exit Sub
If Not IsDate(Me.Range("A1").Value) Then Exit Sub
If Intersect(Target, Me.Range("B2:E33")) Is Nothing Then Exit Sub
With Me
    MyA = .Range("A1").CurrentRegion.Resize(32, 5).Value
    v = .Range("A1").CurrentRegion.Offset(, 1).Resize(, 4).Value
End With
ReDim MyAry(1 To 15, 1 To 7)
ReDim x(Day(DateAdd("m", 1, Me.Range("A1").Value) - 1) - 1)
SD = Weekday(Me.Range("A1").Value)
q = Application.Index(v, 1, 0)
For i = LBound(v) + 1 To UBound(v) - 1
    ReDim y(1)
    z = Filter(Evaluate("(B" & i & ":E" & i & "=""A"")*COLUMN(A1:D1)"), 0, False, vbTextCompare)
    For j = LBound(z) To UBound(z)
        If j > 1 Then Exit For
        y(j) = q(z(j))
    Next
    x(i - 2) = y
Next
For j = SD To UBound(MyAry, 2)
    If UBound(x) < k Then Exit For
    If IsArray(x(k)) Then
        MyAry(1, j) = MyA(k + 2, 1)
        MyAry(2, j) = x(k)(0)
        MyAry(3, j) = x(k)(1)
    End If
    k = k + 1
Next
For i = LBound(MyAry, 1) + 3 To UBound(MyAry, 1) - 2 Step 3
    For j = LBound(MyAry, 2) To UBound(MyAry, 2)
        If UBound(x) < k Then Exit For
        If IsArray(x(k)) Then
            MyAry(i, j) = MyA(k + 2, 1)
            MyAry(i + 1, j) = x(k)(0)
            MyAry(i + 2, j) = x(k)(1)
        End If
        k = k + 1
    Next
Next
With Sheets("Sheet2")
    .Range("A1").Resize(UBound(MyAry, 1), UBound(MyAry, 2)).Value = MyAry
End With
Erase MyA, MyAry, v, x, y, z, q
End Sub
すみません。よく見たら別Bookですね。
エラー処理をちょっと追加しました。
(SoulMan) 2019/11/08(金) 23:21

 >・A店舗は2人出勤しているため、セルを上段と下段に分けている 

 これですけど
  「A店用ブック」(sheetA店1月)反映用 で一人の日があるのは 矛盾していませんか?

 「月別ブック」(sheet月別1月)入力用 の2日でB店が2つあるのは?

(渡辺ひかる) 2019/11/09(土) 10:45


 数式でやってみました

 各店舗2名までを一つのセルに表示します。

 複数ブックで外部参照だと、ややこしくなるので 同一ブックに「sheet月別11月」シート、「sheetA店11月」シートを準備してください
 レイアウトはSoulManさんのをお借りしました。

 「sheet月別11月」シート

 ・A1セルは該当月の1日の日付
 ・A2セル数式=A1
 ・A3セル数式=A2+1、以下 下にコピー
 ・日付セルの書式は d"("aaa")"

     |[A]      |[B] |[C] |[D] |[E] 
 [1] |2019/11/1|一郎|二郎|三郎|四郎
 [2] |1(金)    |A   |C   |B   |A   
 [3] |2(土)    |B   |A   |C   |A   
 [4] |3(日)    |C   |A   |A   |C   
 [5] |4(月)    |A   |C   |B   |A   
 [6] |5(火)    |A   |A   |C   |B   
 [7] |6(水)    |A   |B   |A   |C   
 [8] |7(木)    |A   |C   |B   |A   
 [9] |8(金)    |B   |A   |C   |A   
 [10]|9(土)    |A   |B   |A   |C   
 [11]|10(日)   |A   |C   |B   |A   
 [12]|11(月)   |B   |A   |C   |B   
 [13]|12(火)   |C   |B   |A   |C   
 [14]|13(水)   |A   |C   |B   |A   
 [15]|14(木)   |B   |A   |C   |B   
 [16]|15(金)   |C   |B   |A   |C   
 [17]|16(土)   |A   |C   |B   |A   
 [18]|17(日)   |B   |A   |C   |B   
 [19]|18(月)   |C   |B   |A   |C   
 [20]|19(火)   |A   |C   |B   |A   
 [21]|20(水)   |B   |A   |C   |B   
 [22]|21(木)   |B   |A   |C   |B   
 [23]|22(金)   |C   |B   |A   |C   
 [24]|23(土)   |A   |C   |B   |A   
 [25]|24(日)   |B   |A   |C   |B   
 [26]|25(月)   |C   |B   |A   |C   
 [27]|26(火)   |A   |C   |B   |A   
 [28]|27(水)   |B   |A   |C   |B   
 [29]|28(木)   |B   |A   |C   |B   
 [30]|29(金)   |C   |B   |A   |C   
 [31]|30(土)   |B   |A   |C   |B   

 「sheetA店11月」シート

 ・B1セルは該当月の1日の日付
 ・D1セルは店名
 ・A2セル数式=IF(WEEKDAY($B$1,11)=COLUMN(A2),$B$1,"")
 ・B2セル数式=IF(A2="",IF(WEEKDAY($B$1,11)=COLUMN(B2),$B$1,""),A2+1) として、G2セルまでコピー
 ・A4セル数式=IF(MONTH($G2+COLUMN(A4))=MONTH($B$1),$G2+COLUMN(A4),"")として、G4セルまでコピー
 ・A4:G4までをコピーして、6行目、8行目、10行目に貼り付け
 ・日付セルの書式は d"("aaa")"

 ・A3セル数式

=IF(A2="","",INDEX(sheet月別11月!$B$1:$E$1,,AGGREGATE(15,6,COLUMN($A$1:$D$1)/(INDEX(sheet月別11月!$B$2:$E$31,DAY(sheetA店11月!A2),0)=sheetA店11月!$D$1),1)) & IFERROR(" " & INDEX(sheet月別11月!$B$1:$E$1,,AGGREGATE(15,6,COLUMN($A$1:$D$1)/(INDEX(sheet月別11月!$B$2:$E$31,DAY(sheetA店11月!A2),0)=sheetA店11月!$D$1),2)),""))

 として、G3までコピー
 ・A3:G3 をコピーして、5行目、7行目、9行目、11行目に貼り付け

     |[A]      |[B]      |[C]      |[D]      |[E]      |[F]      |[G]      
 [1] |年月     |2019/11/1|店名     |A        |         |         |         
 [2] |         |         |         |         |1(金)    |2(土)    |3(日)    
 [3] |         |         |         |         |一郎 四郎|二郎 四郎|二郎 三郎
 [4] |4(月)    |5(火)    |6(水)    |7(木)    |8(金)    |9(土)    |10(日)   
 [5] |一郎 四郎|一郎 二郎|一郎 三郎|一郎 四郎|二郎 四郎|一郎 三郎|一郎 四郎
 [6] |11(月)   |12(火)   |13(水)   |14(木)   |15(金)   |16(土)   |17(日)   
 [7] |二郎     |三郎     |一郎 四郎|二郎     |三郎     |一郎 四郎|二郎     
 [8] |18(月)   |19(火)   |20(水)   |21(木)   |22(金)   |23(土)   |24(日)   
 [9] |三郎     |一郎 四郎|二郎     |二郎     |三郎     |一郎 四郎|二郎     
 [10]|25(月)   |26(火)   |27(水)   |28(木)   |29(金)   |30(土)   |         
 [11]|三郎     |一郎 四郎|二郎     |二郎     |三郎     |二郎     |         

 店舗を変えたり、月を変えたりしてみてください
 なお、6週の月がありますが、その際は10行目、11行目をコピーして12,13行目に貼り付けてください

(渡辺ひかる) 2019/11/09(土) 13:31
13:37 敬称漏れ修正


 私は、日曜日書き出しにしてみました。 
					1(金)	2(土)
					一郎	二郎
					二郎	
3(日)	4(月)	5(火)	6(水)	7(木)	8(金)	9(土)
二郎	一郎	二郎	三郎	一郎	二郎	一郎
三郎	四郎			四郎		四郎
10(日)	11(月)	12(火)	13(水)	14(木)	15(金)	16(土)
二郎	二郎	三郎	一郎	二郎	三郎	一郎
						四郎
17(日)	18(月)	19(火)	20(水)	21(木)	22(金)	23(土)
二郎	三郎	一郎	二郎	二郎	三郎	一郎
		四郎				四郎
24(日)	25(月)	26(火)	27(水)	28(木)	29(金)	30(土)
二郎	三郎	一郎	二郎	二郎	三郎	二郎
		四郎				
(SoulMan) 2019/11/09(土) 13:52

 ちなみに月曜日書き出しの場合は、、
SD = Weekday(Me.Range("A1").Value)
の後に

 ↓を追加して
If SD = 1 Then
    SD = 7
Else
    SD = SD - 1
End If

 スタート位置を調整してください。
(SoulMan) 2019/11/09(土) 14:03

コメント返信:

[ 一覧(最新更新順) ]


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