
プロパティに値をセットする際、動的にプロパティ名を変えてセットしたいのですが、どの様にすれば可能かがわかりません。
どなたか、お教えいただけないでしょうか。
------------------------------------------------
Public Structure YYY
Dim meisai1 As YYY
Dim meisai2 As YYY
.
Dim meisai99 As YYY
End Structure
Public Structure YYY
Dim abc As Int32
Dim def As String
End Structure
------------------------------------------------
Dim yyy As YYY
yyy.meisai1.abc = 52
↑
ここを「meisai1」~「meisai99」まで繰り返したい
No.3ベストアンサー
- 回答日時:
ラッパークラスの作成
'-------------------------------------------------------------------------------
Private Class lapXXX
Private _xx As XXX
Public Sub New(ByVal xx As XXX)
_xx = xx
End Sub
Default Public Property Items(ByVal i As Integer) As YYY
Get
Return Me.getItem(i)
End Get
Set(ByVal value As YYY)
Me.setItem(i, value)
End Set
End Property
Public ReadOnly Property Value() As XXX
Get
Return _xx
End Get
End Property
Private Function getItem(ByVal i As Integer) As YYY
Dim t As Type = _xx.GetType()
Dim fieldName As String = String.Format("meisai{0}", i)
Dim fi As System.Reflection.FieldInfo = t.GetField(fieldName)
If Not fi Is Nothing Then
Return CType(fi.GetValue(_xx), YYY)
Else
Return Nothing
End If
'Select Case i
' Case 1
' Return _xx.meisai1
' Case 2
' Return _xx.meisai2
' Case 3
' Return _xx.meisai3
' Case 4
' Return _xx.meisai4
' Case 5
' Return _xx.meisai5
' Case 6
' Return _xx.meisai6
' Case 7
' Return _xx.meisai7
' Case 8
' Return _xx.meisai8
' Case 9
' Return _xx.meisai9
' Case 10
' Return _xx.meisai10
' Case Else
' Return Nothing
'End Select
End Function
Private Sub setItem(ByVal i As Integer, ByVal value As YYY)
''VB.NETでは、なぜか構造体にSetValueメソッドが使えない。C#なら使用可能
'Dim t As Type = _xx.GetType()
'Dim fieldName As String = String.Format("meisai{0}", i)
'Dim fi As System.Reflection.FieldInfo = t.GetField(fieldName)
'If Not fi Is Nothing Then
' fi.SetValue(_xx, value)
'Else
'End If
''しかたないので、全パターンを列挙する
Select Case i
Case 1
_xx.meisai1 = value
Case 2
_xx.meisai2 = value
Case 3
_xx.meisai3 = value
Case 4
_xx.meisai4 = value
Case 5
_xx.meisai5 = value
Case 6
_xx.meisai6 = value
Case 7
_xx.meisai7 = value
Case 8
_xx.meisai8 = value
Case 9
_xx.meisai9 = value
Case 10
_xx.meisai10 = value
Case Else
End Select
End Sub
End Class
'-------------------------------------------------------------------------------
使用例
'-------------------------------------------------------------------------------
Dim x As New lapXXX(xxx) '操作しやすいようにラッパークラスに渡す
For i As Integer = 1 To 10
Dim y As YYY
y.abc = 52
y.def = x(i).def
x(i) = y
Next
xxx = x.Value 'ここ重要:操作した結果をもとにもどす
'-------------------------------------------------------------------------------
コピーが発生しまくるのであまりおすすめできません
もとがクラスになりさえすれば・・・
(1) HashTableを使用したり
(2) Invokeメソッドを使用したり
と、当方もいろいろやってみましたが、挫折して「Case文」にて、99個列挙して実装しました。
もっとスマ-トな方法があれば、お教えいただければ、ありがたいです。
No.2
- 回答日時:
ちょっと気になったので、自分でも調査してみました。
リフレクションのGetFieldメソッド使えば、できると思いましたが
構造体(値型)は難しいですね・・・
クラス(参照型)なら、なんとでもなるのですが
識者に期待します
No.1
- 回答日時:
こんにちは、今ひとつ、意味が解らないのですが。
以下の様な使い方ですか。????
Module Module1
Public Structure yyy
Dim abc As Integer
Dim dcf As String
End Structure
Public Structure myyy
Dim meisai() As yyy
Sub ini()
ReDim meisai(99)
For i As Integer = 0 To 99
meisai(i).abc = 0
meisai(i).dcf = ""
Next
End Sub
End Structure
Sub Main()
Dim m As myyy
m.ini()
Dim i As Integer
For i = 0 To 99
m.meisai(i).abc = i * 10
m.meisai(i).dcf = "abc" & i
Next
For i = 0 To 99
Debug.Print(m.meisai(i).abc)
Debug.Print(m.meisai(i).dcf)
Next
End Sub
End Module
計算結果
0
abc0
10
abc1
20
abc2
30
abc3
40
abc4
------
中略
------
970
abc97
980
abc98
990
abc99
この回答への補足
ご回答ありがとうございます。
ご指摘のとおり、「meisai()」「List(Of YYY)」の様に指定できればいいのですが、
外部インタ-フェイスのため、「固有名のインスタンス」で、先方より指定されてしまっているので、困っております。
※質問文で、「Structure YYY」を2個書いてしまっていますが、当方の記述ミスです。
------------------------------------------------
Public Structure XXX
Dim meisai1 As YYY
Dim meisai2 As YYY
.
Dim meisai99 As YYY
End Structure
Public Structure YYY
Dim abc As Int32
Dim def As String
End Structure
------------------------------------------------
Dim xxx As XXX
xxx.meisai1.abc = 52
↑
ここを「meisai1」~「meisai99」まで繰り返したい
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【VBA】 結合セルに複数画像と...
-
【マクロ】並び替えの範囲が、...
-
【マクロ】開いているブックの...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【ExcelVBA】5万行以上のデー...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
Vba セルの4辺について罫線が有...
-
エクセルのVBAコードと数式につ...
-
エクセルの改行について
-
VBA ユーザーフォーム ボタンク...
-
Excelマクロで使うVBAコードを...
-
VBAの質問(Msgboxについて)です
-
VBAでセルの書式を変えずに文字...
-
【ExcelVBA】値を変更しながら...
-
【マクロ】変数を使った、文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のメンバをfor文で回したい
-
batファイルでtelnetを起動⇒文...
-
mailto:の本文に文字数制限はあ...
-
動的にプロパティ名を変えたい
-
mailto:の中に&を入れる
-
エラーログの意味
-
「HSP」で左クリック判定がうま...
-
R8Cマイコンの乗算
-
IplImageをHSの閾値から2値...
-
ACCESS97のモジュールにSPL...
-
アクセスを拒否の仕方について
-
EXCEL VBA でユーザー定義型デ...
-
またまたわかりません><;
-
メールの送信者名を自動でサイ...
-
時間の平均値を計算する方法を...
-
mailtoで宛先を日本語で指定す...
-
UWSCで出目画像カウントしたい
-
Bresenhamのアルゴリズムを用い...
-
PythonでのSQL文の書き方を教え...
-
Wi-Fiが繋がらなくなりました N...
おすすめ情報