必须有办法做到这一点,但我不知道如何做。
假设我有一个包含这些对象的数据类型
Set test = New clsMonth
With test
.January = 0.7136 / 20
.February = 0.6755 / 20
.March = 0.6528 / 20
.April = 0.7773 / 20
.May = 0.8213 / 20
.June = 0.8715 / 20
.July = 0.9 / 20
.August = 1.0243 / 20
.September = 1.0516 / 20
.October = 0.8514 / 20
.November = 0.7095 / 20
.December = 0.6994 / 20
End With
我想要引用存储在数组中的那些。我该如何使用该数组来引用它们。我尝试过这样的事情(这很草率,但我很快就做了一个例子):
Set test = New clsMonth
With test
.January = 0.7136 / 20
.February = 0.6755 / 20
.March = 0.6528 / 20
.April = 0.7773 / 20
.May = 0.8213 / 20
.June = 0.8715 / 20
.July = 0.9 / 20
.August = 1.0243 / 20
.September = 1.0516 / 20
.October = 0.8514 / 20
.November = 0.7095 / 20
.December = 0.6994 / 20
End With
Dim month(1 To 2) As String
month(1) = "March"
MsgBox test.month(1)
先谢谢你。这将在很多方面帮助我!!
ClsMonth:
Option Explicit
'encapsulating values to be exposed as properties
Private Type TMonth
January As Single
February As Single
March As Single
April As Single
May As Single
June As Single
July As Single
August As Single
September As Single
October As Single
November As Single
December As Single
End Type
Private this As TMonth
'property accessors for each member
'this "talks" to the form code to assign and retrieve values for each month
Public Property Get January() As Single
January = this.January
End Property
Public Property Let January(ByVal value As Single)
this.January = value
End Property
Public Property Get February() As Single
February = this.February
End Property
Public Property Let February(ByVal value As Single)
this.February = value
End Property
Public Property Get March() As Single
March = this.March
End Property
Public Property Let March(ByVal value As Single)
this.March = value
End Property
Public Property Get April() As Single
April = this.April
End Property
Public Property Let April(ByVal value As Single)
this.April = value
End Property
Public Property Get May() As Single
May = this.May
End Property
Public Property Let May(ByVal value As Single)
this.May = value
End Property
Public Property Get June() As Single
June = this.June
End Property
Public Property Let June(ByVal value As Single)
this.June = value
End Property
Public Property Get July() As Single
July = this.July
End Property
Public Property Let July(ByVal value As Single)
this.July = value
End Property
Public Property Get August() As Single
August = this.August
End Property
Public Property Let August(ByVal value As Single)
this.August = value
End Property
Public Property Get September() As Single
September = this.September
End Property
Public Property Let September(ByVal value As Single)
this.September = value
End Property
Public Property Get October() As Single
October = this.October
End Property
Public Property Let October(ByVal value As Single)
this.October = value
End Property
Public Property Get November() As Single
November = this.November
End Property
Public Property Let November(ByVal value As Single)
this.November = value
End Property
Public Property Get December() As Single
December = this.December
End Property
Public Property Let December(ByVal value As Single)
this.December = value
End Property
'end of property accessors'
Public Function ValueFor(ByVal monthName As String) As Single 'function to take month name and respond w property value
On Error GoTo CleanFail
Dim instance As Object
Set instance = Me 'CallByName can't take "me" directly for some reason, must create an instance of me
Dim result As Single
result = CallByName(instance, monthName, VbGet)
CleanExit:
ValueFor = result
Exit Function
CleanFail:
result = 0
Resume CleanExit
End Function
答案 0 :(得分:3)
您可以调整ValueFor
函数来接受monthNameOrIndex As Variant
,如下所示:
Public Function ValueFor(ByVal monthNameOrIndex As Variant) As Single
On Error GoTo CleanFail
Dim name As String
If IsNumeric(monthNameOrIndex) Then
name = MonthName(monthNameOrIndex)
Else
name = CStr(monthNameOrIndex)
End If
Dim instance As Object
Set instance = Me 'CallByName can't take "Me" directly
Dim result As Single
result = CallByName(instance, name, VbGet)
CleanExit:
ValueFor = result
Exit Function
CleanFail:
result = 0
Resume CleanExit
End Function
然后你可以这样做:
MsgBox test.ValueFor(3)
就像你能做到的那样:
MsgBox test.ValueFor("March")
仔细观察这个片段:
Dim month(1 To 2) As String month(1) = "March" MsgBox test.month(1)
如果您要在数组中存储月份名称,并且想要检索值并将其传递给此test.ValueFor
函数,则需要执行以下操作:
Dim month(1 To 2) As String
month(1) = "March"
MsgBox test.ValueFor(month(1))
'same: text.ValueFor("March")
答案 1 :(得分:1)
Sub Tester()
Dim o As New clsTest, arr, e
o.One = "First"
o.Two = "Second"
o.Three = "Third"
arr = Array("One", "Two", "Three")
For Each e In arr
Debug.Print CallByName(o, e, VbGet)
Next e
End Sub
输出:
First
Second
Third
另clsTest:
Public One As String
Public Two As String
Public Three As String