|
▼VBA初心者 さん: こんにちは〜
質問者さんからの応答がありませんが、
しばらく参加できないので、レス入れときます。
回答ではありません。
要は、今現在 入力表のデータ入れ替え統合を(手作業で)どうやって
処理しているのか、ってことです。その手順を文章化できれば、それを
VBAのコードに直していけばいいのです。手作業でも、VBAでも、作業の
手順は変わらないですから。
Step1.
元のファイルの入力表の[E]列〜[O]列を このBookのSheet1の
[A1]にCopyし、「社員No」と「tscode」で昇順ソートします。
【Sheet1】
[A] [B] [C] [D] [E] [F][G][H][I][J][K]
[1] code 役職 社員No 名前 tscode 1W 2W 3W 4W 5W 6W
[2] A1 部長 0001 高橋 A001 1 0 1 2 0 2
[3] A1 部長 0001 高橋 A001 2 2 3 2 1 3
[4] A1 部長 0002 吉田 B001 2 0 3 4 1 0
[5] C1 課長 0004 鈴木 D001 0 3 4 3 1 0
[6] E1 社員1 0005 渡辺 E001 4 2 4 4 1 2
[7] E1 社員1 0006 長谷川 F001 0 2 1 4 3 3
[8] G1 社員2 0007 川本 G001 2 3 4 1 0 2
[9] G1 社員2 0007 川本 H001 2 0 4 2 3 1
[10] G1 社員2 0008 安田 H001 4 2 0 2 4 2
Step2.
あたらしいシートをこのBookに追加し、一行目にタイトルを
書き込みます。
【SheetNew】
[F1],[G1],.. のtscodeは 元の【Sheet1】の[E]列に Unique:=Trueで
フィルタオプションをかけ、得られた重複のないtscode一覧をソート
したものを行列入れ替えて[F1]にPasteSpecialすればいいと思います。
変数WS1を【Sheet1】とし、
変数WS2 を【SheetNew】のこととすると、
WS1.[E1:E10].AdvancedFilter xlFilterCopy, _
CopyToRange:=WS2.[E1], Unique:=True
で、
[A] [B] [C] [D] [E] [F][G][H][I][J][K]・・・
[1] code 役職 社員No 名前 tscode
[2] A001
[3] B001
[4] D001
[5] E001
[6] F001
[7] G001
[8] H001
[9]
[10]
が得られますから、この範囲を(E列だけを)ソートして
[F1]にTranspose貼り付けします。
Dim r As Range
With WS2
Set r = .range("E1",.range("E1").End(xlDown))
r.Sort Key1:=.Columns(1),Header:=xlYes
r.Copy
.range("F1").PasteSpecial xlPasteValues, Transpose:=True
Application.CutCopyMode = True
r.ClearContents
End With
の処理で、
【SheetNew】
[A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職 社員No 名前 A001 B001 D001 E001 F001 G001 H001
となりますから、[E1]に"week"を代入して、タイトル行は完成です。
Step3.
【Sheet1】を上から順に処理していきます。
最初の社員番号は 「001」なので 2行目〜7行目にその社員の[A]列〜[D]列
をCOPYします。 またE列に 1W〜6W を代入します。
【SheetNew】
[A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職 社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
[2] A1 部長 0001 高橋 1W
[3] A1 部長 0001 高橋 2W
[4] A1 部長 0001 高橋 3W
[5] A1 部長 0001 高橋 4W
[6] A1 部長 0001 高橋 5W
[7] A1 部長 0001 高橋 6W
[8]
[9]
[10]
最初のデータ行の tscodeは「A001」です。これが、[F]列〜[L]列の第何列目にあるか
調べ、変数m に代入します。
m =Application.Match("A001",[F1:L1],1)
m = 1 ですから、F列に(つまり[F2:F7]に 【Sheet】の値を加算していきます。
[A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職 社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
[2] A1 部長 0001 高橋 1W 1
[3] A1 部長 0001 高橋 2W 0
[4] A1 部長 0001 高橋 3W 1
[5] A1 部長 0001 高橋 4W 2
[6] A1 部長 0001 高橋 5W 0
[7] A1 部長 0001 高橋 6W 2
[8]
2つめのデータは 前と同じく
> 0001 高橋 A001 2 2 3 2 1 3
なので m = 1の行に ↑の値を加算していきます。
[A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職 社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
[2] A1 部長 0001 高橋 1W 3
[3] A1 部長 0001 高橋 2W 2
[4] A1 部長 0001 高橋 3W 4
[5] A1 部長 0001 高橋 4W 4
[6] A1 部長 0001 高橋 5W 1
[7] A1 部長 0001 高橋 6W 5
以上の処理を最終データ行目で繰り返すことにより、
出力表が出来上がります。
上の処理はセルに直接書き込んでいましたが、これを
配列を用意してそこに出力して、さいごにまとめてシートに吐き出す
ようにすれば処理速度は格段にアップします。
|
|