Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


14070 / 76733 ←次へ | 前へ→

【68163】Re:VBAソースコードについて
発言  kanabun  - 11/2/8(火) 10:15 -

引用なし
パスワード
   ▼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

以上の処理を最終データ行目で繰り返すことにより、
出力表が出来上がります。

上の処理はセルに直接書き込んでいましたが、これを
配列を用意してそこに出力して、さいごにまとめてシートに吐き出す
ようにすれば処理速度は格段にアップします。

1 hits

【68157】VBAソースコードについて VBA初心者 11/2/7(月) 13:44 質問
【68158】Re:VBAソースコードについて kanabun 11/2/7(月) 14:45 発言
【68159】Re:VBAソースコードについて VBA初心者 11/2/7(月) 15:08 質問
【68160】Re:VBAソースコードについて kanabun 11/2/7(月) 15:27 発言
【68163】Re:VBAソースコードについて kanabun 11/2/8(火) 10:15 発言
【68170】Re:VBAソースコードについて VBA初心者 11/2/8(火) 15:48 お礼
【68179】Re:VBAソースコードについて kanabun 11/2/9(水) 20:12 発言
【68161】Re:VBAソースコードについて UO3 11/2/7(月) 17:39 発言

14070 / 76733 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free