【Excel VBA】Type のプロパティ名を変数で指定できますか?


Public Type x
member As String
End Type

Sub test()
Dim x As x
Dim s As String
s = "member"
x.s = "変数$sで指定したい" ' NG!
MsgBox x.member
End Sub

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/05 23:07:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント35pt

何でそのようなことがしたいか、目的を書かれれば代案も提示できるかと思いますが、

VBA で変数(メンバ変数を含めて)を変数で指定することは単純にはできないと思います。


他の言語であれば連想配列が比較的目的に近いように思いますが、残念ながら VBA に

この機能はありません。VBA で類似の方法としては Dictionary の使用が思い浮かびますが、

それではダメでしょうか。

Sub test()
    Dim x As Object
    Dim s As String
    
    Set x = CreateObject("Scripting.Dictionary")
    s = "member"
    x.Add s, "変数$sで指定したい"

    MsgBox x.Item(s)
End Sub

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.ht...

id:nannde

Mookさま!

おっしゃるとおり、連想配列的な利用です。

逐一、要素名を書かなければいけないとは...

簡単にはできないと教えていただいたことで非常に助かりました。

ありがとうございました!

2009/12/05 22:59:24

その他の回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント10pt
x(s) = "変数$sで指定したい"

こういうこと?

id:nannde

コンパイルエラー

配列がありません

でした。

わかりづらくてすみません。

タイプのエレメント名を直書きする

x.member = 値

のではなく、

変数で指定したい

Dim elem_string As String

x.elem_string = 値 ' これはエラー

ということなのです。

2009/12/05 21:25:46
id:mystashes No.2

回答回数32ベストアンサー獲得回数11

ポイント35pt
Sub test()
Dim x As x
Dim s As String
s = "member" '<-ここはタイプのエレメント名とは関係なく任意の文字列。
x.member = s '<-もちろんここで x.member="hoge"等直接代入も可
MsgBox x.member
End Sub

でいけると思います。

id:nannde

わかりづらくてすみません。

タイプのエレメント名を変数で指定したい

ということなのです。タイプの値ではなく。

2009/12/05 21:33:07
id:Mook No.3

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント35pt

何でそのようなことがしたいか、目的を書かれれば代案も提示できるかと思いますが、

VBA で変数(メンバ変数を含めて)を変数で指定することは単純にはできないと思います。


他の言語であれば連想配列が比較的目的に近いように思いますが、残念ながら VBA に

この機能はありません。VBA で類似の方法としては Dictionary の使用が思い浮かびますが、

それではダメでしょうか。

Sub test()
    Dim x As Object
    Dim s As String
    
    Set x = CreateObject("Scripting.Dictionary")
    s = "member"
    x.Add s, "変数$sで指定したい"

    MsgBox x.Item(s)
End Sub

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.ht...

id:nannde

Mookさま!

おっしゃるとおり、連想配列的な利用です。

逐一、要素名を書かなければいけないとは...

簡単にはできないと教えていただいたことで非常に助かりました。

ありがとうございました!

2009/12/05 22:59:24
  • id:mystashes
    「エレメント名を変数で指定したい」という要望への直接の解決策はありません。
    連想配列チックな利用方法をお考えでしょうか?
    最終的に実現したい挙動を教えて頂ければ、何か代替策があるかもしれません。
  • id:nannde
    ありがとうございます!

    まさに、連想配列チックな利用方法を考えてました。

    > 最終的に実現したい挙動を教えて頂ければ、
    そのように質問すればよかったのですね。
    皆さんにお時間を取らせてしまい大変すみませんでしたm(_ _)m

    > 「エレメント名を変数で指定したい」という要望への直接の解決策はありません。
    非常に役立つお答えです。

    ありがとうございました。
  • id:Mook
    直接的ではありませんが、インタフェース関数を持つことで代用できませんか?

    Function SetX( ByRef vx As x , memberName As String, val )
      Select Case memberName
        Case "member1"
        vx.member1 = val
        Case "member2"
        vx.member2 = val
        Case "member3"
        vx.member3 = val
      End Select
    End Function
    のように。

    クラスを使うともう少しスマートにできそうな気がしますが。
  • id:nannde
    Mookさま
    ありがとうございます。
    なるほど!
    と思いましたが、結構たいへんそうですね...(^^;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません