回答編集履歴

1

コードの修正と追加

2018/04/03 15:13

投稿

hatena19
hatena19

スコア33722

test CHANGED
@@ -10,17 +10,17 @@
10
10
 
11
11
  ```vba
12
12
 
13
- Public Sub 可変列へ転記()
13
+ Public Sub 可変列()
14
14
 
15
- Dim Rng1 As Range, rng2 As Range
15
+ Dim Rng1 As Range, Rng2 As Range
16
16
 
17
17
  Dim MaxRow As Long, MaxCol As Long
18
18
 
19
- Dim i As Long, j As Long
19
+ Dim i As Long
20
20
 
21
21
 
22
22
 
23
- If Worksheets("Sheet3").Range("A1").Value = "" Then
23
+ If Worksheets("Sheet1").Range("A1").Value = "" Then
24
24
 
25
25
  MsgBox "データがありません。"
26
26
 
@@ -30,21 +30,21 @@
30
30
 
31
31
 
32
32
 
33
- Set Rng1 = Worksheets("Sheet3").Range("A1", "B1") 'コピー元の最初のセル範囲
33
+ Set Rng1 = Worksheets("Sheet1").Range("A1", "B1") 'コピー元の最初のセル範囲
34
34
 
35
- Set rng2 = Worksheets("Sheet4").Range("A1", "B1") 'コピー先の最初のセル範囲
35
+ Set Rng2 = Worksheets("Sheet2").Range("A1", "B1") 'コピー先の最初のセル範囲
36
36
 
37
37
 
38
38
 
39
- MaxRow = Rng1.End(xlDown).Row
39
+ MaxRow = Rng1.End(xlDown).Row 'コピー元の行数
40
40
 
41
- MaxCol = rng2.End(xlToRight).Column
41
+ MaxCol = Rng2.End(xlToRight).Column 'コピー先の項目の列数
42
42
 
43
43
 
44
44
 
45
45
  For i = 1 To MaxRow
46
46
 
47
- rng2.Offset(1 + ((i - 1) \ (MaxCol \ 2)), ((i - 1) * 2) Mod MaxCol).Value _
47
+ Rng2.Offset(1 + ((i - 1) \ (MaxCol \ 2)), ((i - 1) * 2) Mod MaxCol).Value _
48
48
 
49
49
  = Rng1.Offset(i).Value
50
50
 
@@ -53,3 +53,65 @@
53
53
  End Sub
54
54
 
55
55
  ```
56
+
57
+ ---
58
+
59
+ 配列を使用して高速化したバージョン
60
+
61
+ ```vba
62
+
63
+ Public Sub 可変列へ転記_配列()
64
+
65
+ Dim aryFrom(), aryTo()
66
+
67
+ Dim MaxRow As Long, MaxCol As Long
68
+
69
+ Dim i As Long, r As Long, c As Long
70
+
71
+
72
+
73
+ If Worksheets("Sheet1").Range("A1").Value = "" Then
74
+
75
+ MsgBox "データがありません。"
76
+
77
+ Exit Sub
78
+
79
+ End If
80
+
81
+
82
+
83
+ MaxRow = Worksheets("Sheet1").Range("A1").CurrentRegion.Rows.Count
84
+
85
+ MaxCol = Worksheets("Sheet2").Range("A1").CurrentRegion.Columns.Count
86
+
87
+
88
+
89
+ aryFrom = Worksheets("Sheet1").Range("A2", "B" & MaxRow).Value 'コピー元のデータを配列に格納
90
+
91
+ ReDim aryTo(1 To MaxRow \ (MaxCol \ 2) + 1, 1 To MaxCol) '出力先配列のサイズを確保
92
+
93
+
94
+
95
+
96
+
97
+ For i = 1 To MaxRow - 1
98
+
99
+ r = 1 + ((i - 1) \ (MaxCol \ 2))
100
+
101
+ c = ((i - 1) * 2) Mod MaxCol + 1
102
+
103
+ aryTo(r, c) = aryFrom(i, 1)
104
+
105
+ aryTo(r, c + 1) = aryFrom(i, 2)
106
+
107
+ Next
108
+
109
+
110
+
111
+ Worksheets("Sheet2").Range("A2").Resize(UBound(aryTo), MaxCol).Value = aryTo
112
+
113
+ End Sub
114
+
115
+
116
+
117
+ ```