|
kanabun さん
昨日別件の仕事で職場を離れてしまいましたので、
返事ができませんでした。申し訳ありません。
ご丁寧に回答していただき、本当にありがとうございます。
とても参考になりました。
▼kanabun さん:
>▼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
>
>以上の処理を最終データ行目で繰り返すことにより、
>出力表が出来上がります。
>
>上の処理はセルに直接書き込んでいましたが、これを
>配列を用意してそこに出力して、さいごにまとめてシートに吐き出す
>ようにすれば処理速度は格段にアップします。
|
|