回答編集履歴

2

12/26のコメントに対する回答を追記

2017/12/26 12:55

投稿

imihito
imihito

スコア2166

test CHANGED
@@ -205,3 +205,101 @@
205
205
  End Type
206
206
 
207
207
  ```
208
+
209
+
210
+
211
+ ---
212
+
213
+
214
+
215
+ 17/12/26追記
216
+
217
+
218
+
219
+ > Dim Tanaka As Collection
220
+
221
+ Set Tanaka = members.Item("Tanaka")
222
+
223
+ Dim Yamada As Collection
224
+
225
+ Set Yamada = members.Item("Yamada")
226
+
227
+ 上記4行をfor文で動的にしたくて
228
+
229
+ For ii = LBound(people) To UBound(people)
230
+
231
+ members.Add New Collection, people(ii)
232
+
233
+ Dim people(ii) As Collection
234
+
235
+ Set people(ii) = members.Item(people(ii))
236
+
237
+ Next ii
238
+
239
+ としました。
240
+
241
+
242
+
243
+ 結論から申し上げると**「VBAでは不可能」**です。
244
+
245
+
246
+
247
+ VBAではプロシージャの実行時に使用する変数を全て初期化するため、実行するまで名前の決まらない変数は作成できません。
248
+
249
+
250
+
251
+ 出来たとしても、エディタの支援を全て投げ捨てることになるため、ただやりにくいだけになるかと思います。
252
+
253
+
254
+
255
+
256
+
257
+ 雰囲気だけなら以下のような書き方もできますが、私個人としてはオススメしません。
258
+
259
+
260
+
261
+ ```vba
262
+
263
+ With members
264
+
265
+ 'members!Tanaka と members("Tanaka") は同じ意味
266
+
267
+
268
+
269
+ !Tanaka.Add 25, "age"
270
+
271
+ !Tanaka.Add 90, "number"
272
+
273
+
274
+
275
+ !Yamada.Add "test@test.com", "mail"
276
+
277
+ !Yamada.Add "tokyo", "addres"
278
+
279
+
280
+
281
+ MsgBox !Tanaka.Item("age")
282
+
283
+ MsgBox !Yamada.Item("mail")
284
+
285
+
286
+
287
+ End With
288
+
289
+ ```
290
+
291
+
292
+
293
+ ## おまけ:エラーの原因
294
+
295
+
296
+
297
+ `Dim people(ii) As Collection`は純粋に`people`という名前の変数の宣言だと解釈されます。
298
+
299
+ さらに`(ii)`となっているため、静的な配列(要素数が固定の配列)変数の宣言と解釈されます。
300
+
301
+ しかし`ii`は変数のため、定数ではありません(固定されていません)。
302
+
303
+ 結果として、「静的配列の変数宣言に定数を使っていない」と解釈され、「定数式が必要です。」のコンパイルエラーが発生します。
304
+
305
+ 実際は変数宣言も重複しているため、「定数式が必要です。」を解消しても「同じ適用範囲内で宣言が重複しています。」のコンパイルエラーが発生します。

1

エラーの理由追記

2017/12/26 12:55

投稿

imihito
imihito

スコア2166

test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
 
146
146
 
147
- ```
147
+ ```vba
148
148
 
149
149
  Set Member(people(ii)) = New Collection
150
150
 
@@ -157,3 +157,51 @@
157
157
 
158
158
 
159
159
  としか書けません。
160
+
161
+
162
+
163
+
164
+
165
+ ```vba
166
+
167
+ Member(people(ii)) As Collection
168
+
169
+ ```
170
+
171
+ の意図がいまいちわかりませんでしたが、もしかして型変換をしようとしているのでしょうか?
172
+
173
+
174
+
175
+ VBAでは値型のみ`CStr`などの関数で型変換できますが、それ以外は「その型の変数に入れる」ぐらいしか方法がありません。
176
+
177
+
178
+
179
+ なぜ`Type ブロック外では無効なステートメントです。`のエラーが発生したかをざっくり説明すると
180
+
181
+ ユーザー定義型のフィールド宣言の構文と同じ書き方をしたためです。
182
+
183
+
184
+
185
+ 上記の行には予約後の`As`が入っているため、変数宣言などの一種だと解釈されます。
186
+
187
+ しかし行頭に`Dim`などが存在しないため普通の変数宣言ではありません。
188
+
189
+ `As`を使いつつ、行頭に`Dim`などが無いパターンはユーザー定義型のフィールド宣言時のみとなります。
190
+
191
+ しかし、書かれている場所は`Type~End Type`(Typeブロック)で囲まれていないため、`Type ブロック外では無効なステートメントです。`のエラーが発生します。
192
+
193
+
194
+
195
+ ```
196
+
197
+ 'ユーザー定義型の定義
198
+
199
+ 'Personという名前でNameというString型のフィールドを持つ型
200
+
201
+ Type Person
202
+
203
+ Name As String
204
+
205
+ End Type
206
+
207
+ ```