やりたかったことは以下のようなことですか?
vba
1Sub Sample35()
2
3 Dim people() As String
4 people = Split("Tanaka,Yamada", ",")
5
6 Dim members As Collection
7 Set members = New Collection
8
9 Dim ii As Long
10 For ii = LBound(people) To UBound(people)
11 members.Add New Collection, people(ii)
12 Next ii
13
14 Dim Tanaka As Collection
15 Set Tanaka = members.Item("Tanaka")
16 Tanaka.Add 25, "age"
17 Tanaka.Add 90, "number"
18
19 Dim Yamada As Collection
20 Set Yamada = members.Item("Yamada")
21 Yamada.Add "test@test.com", "mail"
22 Yamada.Add "tokyo", "addres"
23
24 MsgBox Tanaka.Item("age")
25 MsgBox Yamada.Item("mail")
26
27End Sub
以下元のコードでミスしていると思われる箇所です。
Split関数
vba
1Dim people() As String
2people = Split("Tanaka", "Yamada")
この書き方だと(少なくともWindows版では)"Tanaka"
しかpeople()
の中に入りません。
両方入れる場合は
vba
1Dim people() As String
2people = Split("Tanaka,Yamada", ",")
または
vba
1Dim people() As Variant
2people = Array("Tanaka", "Yamada")
の書き方になると思います。
Member()
Collection
を辞書的に使いたい、その辞書をMember()
にまとめたい、と考えるとMember()
の型はCollection
ですよね?
vba
1Dim Member() As String
2↓
3Dim Member() As Collection
配列の添え字に文字列は使えないので
vba
1Set Member(people(ii)) = New Collection
2↓
3Set Member(ii) = New Collection
としか書けません。
vba
1Member(people(ii)) As Collection
の意図がいまいちわかりませんでしたが、もしかして型変換をしようとしているのでしょうか?
VBAでは値型のみCStr
などの関数で型変換できますが、それ以外は「その型の変数に入れる」ぐらいしか方法がありません。
なぜType ブロック外では無効なステートメントです。
のエラーが発生したかをざっくり説明すると
ユーザー定義型のフィールド宣言の構文と同じ書き方をしたためです。
上記の行には予約後のAs
が入っているため、変数宣言などの一種だと解釈されます。
しかし行頭にDim
などが存在しないため普通の変数宣言ではありません。
As
を使いつつ、行頭にDim
などが無いパターンはユーザー定義型のフィールド宣言時のみとなります。
しかし、書かれている場所はType~End Type
(Typeブロック)で囲まれていないため、Type ブロック外では無効なステートメントです。
のエラーが発生します。
'ユーザー定義型の定義
'Personという名前でNameというString型のフィールドを持つ型
Type Person
Name As String
End Type
17/12/26追記
Dim Tanaka As Collection
Set Tanaka = members.Item("Tanaka")
Dim Yamada As Collection
Set Yamada = members.Item("Yamada")
上記4行をfor文で動的にしたくて
For ii = LBound(people) To UBound(people)
members.Add New Collection, people(ii)
Dim people(ii) As Collection
Set people(ii) = members.Item(people(ii))
Next ii
としました。
結論から申し上げると**「VBAでは不可能」**です。
VBAではプロシージャの実行時に使用する変数を全て初期化するため、実行するまで名前の決まらない変数は作成できません。
出来たとしても、エディタの支援を全て投げ捨てることになるため、ただやりにくいだけになるかと思います。
雰囲気だけなら以下のような書き方もできますが、私個人としてはオススメしません。
vba
1With members
2 'members!Tanaka と members("Tanaka") は同じ意味
3
4 !Tanaka.Add 25, "age"
5 !Tanaka.Add 90, "number"
6
7 !Yamada.Add "test@test.com", "mail"
8 !Yamada.Add "tokyo", "addres"
9
10 MsgBox !Tanaka.Item("age")
11 MsgBox !Yamada.Item("mail")
12
13End With
おまけ:エラーの原因
Dim people(ii) As Collection
は純粋にpeople
という名前の変数の宣言だと解釈されます。
さらに(ii)
となっているため、静的な配列(要素数が固定の配列)変数の宣言と解釈されます。
しかしii
は変数のため、定数ではありません(固定されていません)。
結果として、「静的配列の変数宣言に定数を使っていない」と解釈され、「定数式が必要です。」のコンパイルエラーが発生します。
実際は変数宣言も重複しているため、「定数式が必要です。」を解消しても「同じ適用範囲内で宣言が重複しています。」のコンパイルエラーが発生します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/24 23:10
2017/12/26 00:00
2018/01/10 05:28