回答編集履歴

1

修正・追記

2016/09/07 07:30

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -20,35 +20,47 @@
20
20
 
21
21
  ```
22
22
 
23
- Dim rng as Range
23
+ Dim rng as Range '読込セル
24
-
24
+
25
- Dim shtRead as Sheet
25
+ Dim shtRead as Sheet '読込シート
26
-
26
+
27
- Dim shtWrite as Sheet
27
+ Dim shtWrite as Sheet '出力シート
28
-
29
-
30
-
28
+
29
+
30
+
31
- Set shtRead = Sheets("得点入力シート")
31
+ Set shtRead = Sheets("得点入力シート") '読込シートを設定
32
-
32
+
33
- Set shtWrite = Sheets("得点表印刷シート")
33
+ Set shtWrite = Sheets("得点表印刷シート") '出力シートを設定
34
-
35
-
36
-
34
+
35
+
36
+
37
- Dim iCnt as Integer
37
+ Dim iCnt as Integer '読込件数カウンタ
38
+
39
+ Dim iWriteCol as Integer '出力基準列
40
+
41
+
42
+
43
+ 'カウンタ初期化
38
44
 
39
45
  iCnt = 0
40
46
 
47
+
48
+
49
+ 'A4~A9の範囲をループ処理
50
+
41
51
  For Each rng In shtRead.Range("A4:A9")
42
52
 
43
53
  'カウンタをインクリメント
44
54
 
45
55
  iCnt = iCnt + 1
46
56
 
57
+
58
+
47
59
  'カウンタの偶数/奇数を判断
48
60
 
49
- 'If (iCnt / 2) <> Int(iCnt / 2) Then 'Int型で整数にした値と同じかどうかで判断(同じ:偶数 異なる:奇数)
61
+ 'If (iCnt / 2) <> Int(iCnt / 2) Then '判定方法① Int型で整数にした値と同じかどうかで判断(同じ:偶数 異なる:奇数)
50
-
62
+
51
- If (iCnt Mod 2) = 1 Then '2で割った余りで判断(余り0:偶数 余り1:奇数)
63
+ If (iCnt Mod 2) = 1 Then '判定方法② 2で割った余りで判断(余り0:偶数 余り1:奇数)
52
64
 
53
65
  '奇数の場合:I列
54
66
 
@@ -62,9 +74,9 @@
62
74
 
63
75
  End If
64
76
 
65
-
66
-
77
+
78
+
67
- '転記
79
+ '読込セルの行から各列の値を取得し、出力シートに転記する
68
80
 
69
81
  shtWrite.Cells(1 , iWriteCol + 1) = shtRead.Cells(rng.Row, 1).Value '学生番号
70
82
 
@@ -81,3 +93,121 @@
81
93
  ```
82
94
 
83
95
  机上で書いたコードなのでそのまま動くかはわかりませんが、参考までに。
96
+
97
+
98
+
99
+
100
+
101
+ 追記
102
+
103
+ ---
104
+
105
+ VBA初学者ということでしたので、提示したソースのポイントを解説させていただきます。
106
+
107
+
108
+
109
+ ---
110
+
111
+ **ポイント①:対象範囲をループ処理**
112
+
113
+ ```
114
+
115
+ For Each rng In shtRead.Range("A4:A9")
116
+
117
+
118
+
119
+ Next
120
+
121
+ ```
122
+
123
+ の部分で読込シートのA4~A9の範囲をループ処理しています。
124
+
125
+ これによりrng変数には、
126
+
127
+ 1週目:A4セル
128
+
129
+ 2週目:A5セル
130
+
131
+ ・・・
132
+
133
+ 6週目:A9セル
134
+
135
+ という具合に、範囲内のセルが1セルずつ繰り返し処理されるようになっています。
136
+
137
+
138
+
139
+ ---
140
+
141
+ **ポイント②:偶数/奇数判定**
142
+
143
+ 今回のコードでは、参考までに2つの判定方法を記述してあります。
144
+
145
+ (判定方法①はコメント化してあるので、実際には判定方法②で動作しています。)
146
+
147
+
148
+
149
+ 判定方法①は、n/2についてInt型で整数にした値と同じかどうかで判断する方法です。
150
+
151
+
152
+
153
+ 例えば3人目の場合、n/2 は 3÷2 = 1.5です。
154
+
155
+ これに対し、Int型は整数値しか持たないため、Int(1.5)は1に丸められます。
156
+
157
+ このため 1.5 ≠ Int(1.5)となります。
158
+
159
+
160
+
161
+ これが4人目の場合だと、n/2 は 4÷2 = 2.0、Int(n/2)もInt(2.0)=2となるため、
162
+
163
+ 2.0 = Int(2.0)となります。
164
+
165
+
166
+
167
+ これを利用して、n/2 が Int(n/2)と同じなら偶数、異なれば奇数と判断しています。
168
+
169
+
170
+
171
+
172
+
173
+ 判定方法②は、2で割った時の余りを求めて判断する方法です。
174
+
175
+
176
+
177
+ VBAには割り算の余りを返すMODという演算子が用意されています。
178
+
179
+ 偶数なら2で割った余りは0、奇数なら1となることを利用して判断しています。
180
+
181
+
182
+
183
+ ---
184
+
185
+ **ポイント③:出力基準列の設定**
186
+
187
+
188
+
189
+ 先の偶数/奇数判断の結果によって、
190
+
191
+ ・奇数なら iWriteCol = 9
192
+
193
+ ・偶数なら iWriteCol = 12
194
+
195
+ を設定しています。
196
+
197
+
198
+
199
+ これはコード内のコメントにも記載したとおり、出力シートのI列、L列を指すための値ものです。
200
+
201
+
202
+
203
+ 出力する際には、この基準列に対して
204
+
205
+ ・学生番号:iWriteCol + 1 (奇数なら9+1 = J列、偶数なら12+1=M列に出力)
206
+
207
+ ・名前  :iWriteCol + 0 (奇数なら9+0 = I列、偶数なら12+0=L列に出力)
208
+
209
+ ・国語  :iWriteCol + 1 (奇数なら9+1 = J列、偶数なら12+1=M列に出力)
210
+
211
+ というように位置調整して出力しています。
212
+
213
+ ※Cellsの座標指定はX,Y座標のように勘違いしやすいですが、Cells(行,列)なのでY,Xのイメージになります。