Excel VBA質問箱 IV

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

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


550 / 13645 ツリー ←次へ | 前へ→

【79766】縦に長いデータにしたい はやしはる 18/4/5(木) 23:16 質問[未読]
【79768】Re:縦に長いデータにしたい マナ 18/4/6(金) 19:33 発言[未読]

【79766】縦に長いデータにしたい
質問  はやしはる  - 18/4/5(木) 23:16 -

引用なし
パスワード
   このようなデータがあります。

出席番号 国語 社会 算数 理科
1 62 27 48 73
2 90 94 86 95
3 75 64 48 45
4 68 55 75 66
5 85 82 92 90
6 77 45 50 70
7 65 36 26 48

下に示すように縦に長いデータに変換する方法をVBAでチャレンジしているのですが、効率よく書けません。
出席番号と各科目のデータを5シートに作って縦に結合するということをしています。

みなさんならばどのようにされますでしょうか?


出席番号 科目 得点
1 国語 62
2 国語 90
3 国語 75
4 国語 68
5 国語 85
6 国語 77
7 国語 65
1 社会 27
2 社会 94
3 社会 64
4 社会 55
5 社会 82
6 社会 45
7 社会 36
1 算数 48
2 算数 86
3 算数 48
4 算数 75
5 算数 92
6 算数 50
7 算数 26
1 理科 73
2 理科 95
3 理科 45
4 理科 66
5 理科 90
6 理科 70
7 理科 48

よろしくお願いします。

【79768】Re:縦に長いデータにしたい
発言  マナ  - 18/4/6(金) 19:33 -

引用なし
パスワード
   ▼はやしはる さん:

データ範囲を変数に取り込んで、そこから1列ずつ、とりだして
順番に転記していくと考えれば、こんな感じになります。

作業通りにコードを記述すれば出来上がるので簡単です。


Option Explicit

Sub test()
  Dim tbl As Range
  Dim n As Long
  Dim k As Long
  Dim dst As Range
  
  Set tbl = Range("a1").CurrentRegion
  Set tbl = Intersect(tbl, tbl.Offset(1))
  n = tbl.Rows.Count
  
  Worksheets.Add
  
  Range("a1:c1").Value = Array("出席番号", "科目", "得点")
  
  For k = 2 To 5
    Set dst = Range("a" & Rows.Count).End(xlUp).Offset(1).Resize(n)
    dst.Value = tbl.Columns(1).Value
    dst.Offset(, 1).Value = tbl.Columns(k).Cells(0).Value
    dst.Offset(, 2).Value = tbl.Columns(k).Value
  Next

End Sub

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