[[20140414205453]] 『セルの数字の数だけ縦に並べる』(雅) ページの最後に飛ぶ

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

 

『セルの数字の数だけ縦に並べる』(雅)

以下の表があります。

番号  氏名    昼勤   夜勤……
1   田中 太郎  1     2
2   鈴木 次郎  3     1

縦に従業員の方の番号と氏名が並んでおり、各人の当月の勤務回数が
横に並べられています。
例えば上記表では田中さんは今月は昼勤1回、夜勤2回をしたということを
表しています。

ここで、上表を別シートに以下のように作り変えたいのです。

番号  氏名     勤務
1   田中 太郎   昼勤
1   田中 太郎   夜勤
1   田中 太郎   夜勤
2   鈴木 次郎   昼勤
2   鈴木 次郎   昼勤
2   鈴木 次郎   昼勤
2   鈴木 次郎   夜勤

尚、上表では勤務は二つしかありませんが、実際は50個ほどあり、人員は100以上
300以下で毎月変動しています。
また、昼勤が0回、といったように勤務回数が0の場合もありえます。
但し、空欄はありません(初期値が0なので)。

昼勤の回数を記入したセルの値をkとし、kが1以上ならk回繰り返す…とすればいいのでは、
と思ったのですが、勤務が50個あるということはその条件式を50個分作らねばならない
のではと二の足を踏んでおります。
(昼勤の回数がk、夜勤の回数がl、夜勤交替1の回数がm……とすれば出来なくは

 ないと思うのですが、コードが大変長くなりそうです。)

他にもっといい方法があるのではと思い、質問させて頂きました。
どうぞ宜しくお願い致します。

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


 0は除外ということで...

 Sub test()
     Dim a, i As Long, ii As Long, iii As Long
     a = Cells(1).CurrentRegion.Value
     With CreateObject("System.Collections.ArrayList")
         For i = 2 To UBound(a, 1)
             For ii = 3 To UBound(a, 2)
                 If a(i, ii) > 0 Then
                     For iii = 1 To a(i, ii)
                         .Add Array(a(i, 1), a(i, 2), a(1, ii))
                     Next
                 End If
             Next
         Next
         Sheets.Add.Cells(1).Resize(.Count, 3).Value = Application.Index(.ToArray, 0, 0)
     End With
 End Sub
(seiya) 2014/04/14(月) 21:19

 Sheet1

	A	B	C	D
1	番号	氏名	昼勤	夜勤
2	1	田中	1	2
3	2	鈴木	3	1
4	3	山田	2	3
5	4	伊藤	0	1
6				

 Sheet2
	A	B	C
1	番号	氏名	勤務
2	1	田中	昼勤
3	1	田中	夜勤
4	1	田中	夜勤
5	2	鈴木	昼勤
6	2	鈴木	昼勤
7	2	鈴木	昼勤
8	2	鈴木	夜勤
9	3	山田	昼勤
10	3	山田	昼勤
11	3	山田	夜勤
12	3	山田	夜勤
13	3	山田	夜勤
14	4	伊藤	夜勤
15			

 Sheet2

 A2 =IFERROR(INDEX(Sheet1!A:A,SMALL(INDEX((MID(REPT(0,MMULT(Sheet1!$C$2:$D$23*1,(ROW($1:$2)>0)*1)),COLUMN($A:$J),1)="")*10^16+ROW(A$2:A$23),),ROW(A1))),"")

 A2をB2にコピー

 C2 =IFERROR(INDEX(Sheet1!$1:$1,SMALL(INDEX((MID(REPT(0,INDEX(Sheet1!C:D,MATCH(A2,Sheet1!A:A),0)),ROW($1:$10),1)="")*10^16+COLUMN(Sheet1!$C$1:$D$1),),COUNTIF(A$2:A2,A2))),"")

 A2:C2 下へコピー。

 ※昼夜勤の合計 10まで。(A2のCOLUMN範囲、C2のROW範囲で調整)
 ※昼夜勤 2個 (A2のMMULTの範囲とROW関数、C2のINDEX、COLUMNの範囲で調整)
 ※行範囲23行まで(各関数の範囲で調整)
 
(GobGob) 2014/04/15(火) 08:17

コメント返信:

[ 一覧(最新更新順) ]


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