【发布时间】:2017-06-13 17:23:55
【问题描述】:
我碰到了一些奇怪的数组,我可以为整个数组赋值,但不能为单个数组成员赋值。
这是一个数据类模块,名为Class_E
Public Name As Variant
Public Age As Variant
这是正文代码,它只是为 2 个数组分配和重新分配值
Sub main()
Dim r As Class_E
Set r = Band()
End Sub
Function Band() As Class_E
Set Band = New Class_E
'Part 1: Initialize the variables
Debug.Print "Part 1"
Band.Name = Array("Edison", "Tesla", "Faraday", "Turing")
Debug.Print "Before: Name={" & Band.Name(0) & ", " & Band.Name(1) & ", " & Band.Name(2) & ", " & Band.Name(3) & "}"
Band.Age = Array(10, 10, 10, 10)
Debug.Print "Before: Age={" & Band.Age(0) & ", " & Band.Age(1) & ", " & Band.Age(2) & ", " & Band.Age(3) & "}"
'Part 2: Change values of arrays, by item
Debug.Print "Part 2"
For k = LBound(Band.Name) To UBound(Band.Name)
Debug.Print "k=" & k
Band.Name(k) = "Foo"
Band.Age(k) = 999
Next k
Debug.Print "After: Name={" & Band.Name(0) & ", " & Band.Name(1) & ", " & Band.Name(2) & ", " & Band.Name(3) & "}"
Debug.Print "After: Age={" & Band.Age(0) & " " & Band.Age(1) & " " & Band.Age(2) & " " & Band.Age(3) & "}"
'Part 3: Change values of array, entirely
Debug.Print "Part 3"
Band.Name = Array("Spring", "Summer", "Autumn", "Winter")
Debug.Print "Again: Name={" & Band.Name(0) & ", " & Band.Name(1) & ", " & Band.Name(2) & ", " & Band.Name(3) & "}"
Band.Age = Array(11, 11, 11, 11)
Debug.Print "Again: Age={" & Band.Age(0) & ", " & Band.Age(1) & ", " & Band.Age(2) & ", " & Band.Age(3) & "}"
'Part 4: Use another temp array variable
Debug.Print "Part 4"
Dim Temp_Name As Variant, Temp_Age As Variant
Temp_Name = Band.Name
Temp_Age = Band.Age
For k = LBound(Band.Name) To UBound(Band.Name)
Debug.Print "k=" & k
Temp_Name(k) = "Foo"
Temp_Age(k) = 999
Next k
Debug.Print "Temp: Name={" & Temp_Name(0) & ", " & Temp_Name(1) & ", " & Temp_Name(2) & ", " & Temp_Name(3) & "}"
Debug.Print "Temp: Age={" & Temp_Age(0) & " " & Temp_Age(1) & " " & Temp_Age(2) & " " & Temp_Age(3) & "}"
'Part 5: Original arrays again
Debug.Print "Part 5"
Debug.Print "Again: Name={" & Band.Name(0) & ", " & Band.Name(1) & ", " & Band.Name(2) & ", " & Band.Name(3) & "}"
Debug.Print "Again: Age={" & Band.Age(0) & ", " & Band.Age(1) & ", " & Band.Age(2) & ", " & Band.Age(3) & "}"
End Function
这是我得到的输出屏幕
Part 1
Before: Name={Edison, Tesla, Faraday, Turing}
Before: Age={10, 10, 10, 10}
Part 2
k=0
k=1
k=2
k=3
After: Name={Edison, Tesla, Faraday, Turing}
After: Age={10 10 10 10}
Part 3
Again: Name={Spring, Summer, Autumn, Winter}
Again: Age={11, 11, 11, 11}
Part 4
k=0
k=1
k=2
k=3
Temp: Name={Foo, Foo, Foo, Foo}
Temp: Age={999 999 999 999}
Part 5
Again: Name={Spring, Summer, Autumn, Winter}
Again: Age={11, 11, 11, 11}
问题:
1. 为什么第 2 部分中的简单作业没有执行?并且没有错误消息。如第 3 部分所示,重新分配数组没有问题。
2. 为什么第 4 部分中的“Temp_Name = Band.Name”是数组值的副本而不是数组指针?没有为临时数组分配内存的指令。
非常感谢您的意见。
【问题讨论】:
-
您应该使用
Band(0 to 3),而不是Band.Name(0 to 3)。循环遍历将是Band(k).Name = "Foo"。 -
使用数组作为类成员是有问题的。请改用集合或字典。您还可以设想@Jeeped 建议的更好的设计方案。此外,
Name是 VBA 中的关键字,请勿将其用于变量。 -
@Jeeped,事实上,这是一个较大项目的孤立问题。我需要一个数组作为类结构的一部分,所以不能做 Band(0 到 3)。
-
@A.S.H.我们可以将名称更改为其他名称,但问题仍然存在
-
对于数组,使用类型 (udt)。因此,您不会被使用令人困惑的变体所困。对于类类型,我推荐字典,比集合更灵活。