[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セルの数字の数だけ縦に並べる』(雅)
以下の表があります。
番号 氏名 昼勤 夜勤……
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.