回答編集履歴
1
修正・追記
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のイメージになります。
|