arrays - Excel VBA:如何使用嵌套数组
问题描述
实际上,我想创建一个可以使用类型的数组,并随着时间的推移拥有它。所以这意味着目标是有一个我可以调用的数组:Array(At a period = 1).Name.Variable = the expected Value
. 所以我一直在设计数组看起来像:
{ Period1:{
{A:{Revenue:5,ROE:5%},
B:{Revenue:7,ROE:8%}
}
Period2:{
{A:{Revenue:5,ROE:5%},
B:{Revenue:7,ROE:8%}
}
}
我正在从一个 Excel 表中读取这些值,该表的名称 (A,B) 具有各自的收入和 ROE 值。然后,随着时间的推移,我会使用这些值对它们做一些事情。
这是我尝试过的,我得到以下编译错误:只有公共对象模块中的用户定义类型可以强制转换为变体或从变体强制转换或传递给后期绑定函数。
Option Explicit
Private Type RelationshipArray
Revenue As Double
ROE As Double
End Type
Public Type RelationshipProductCategory
Period As Integer
A as variant
B as variant
End Type
'
'Private this As RelationshipArray
'
'Public Property Get Revenue(ByVal value As Double) As Double
' Revenue = this.Revenue
'End Property
'
'Public Property Get ROE(ByVal value As Double) As Double
' ROE = this.ROE
'End Property
Function GetRelationshipValues(ByVal Period As Integer, ByRef B As Variant, ByRef A As Variant) As RelationshipProductCategory
GetRelationshipValues.Period = Period
GetRelationshipValues.A = A
GetRelationshipValues.B = B
End Function
Sub RelationshipIncomeCalculation()
Dim ar(10)
Dim A As RelationshipArray
Dim B As RelationshipArray
'this table value is analogous to Range("A2") just more robust for my use
A.Revenue = TableValue("RelationShipIncomeInput", "A", "Revenue", 0, 0)
A.ROE = TableValue("RelationShipIncomeInput", "A", "ROE", 0, 0)
B.Revenue = TableValue("RelationShipIncomeInput", "B", "Revenue", 0, 0)
B.ROE = TableValue("RelationShipIncomeInput", "BUSINESS DEPOSITS", "ROE", 0, 0)
ar(0) = GetRelationshipValues(0, A,B)
解决方案
希望我的回答仍然有帮助,但是如果您已经解决了这个问题,如果您可以将其标记为答案,那就太好了
基本上,您不应该将RelationshipArray
and声明RelationshipProductCategory
为Type,而是声明为Class Module(这是“公共对象模块中的用户定义类型”所指的内容)。
例如,右键单击项目并创建一个 Class Module RelationshipArray
,并将这些粘贴到其中:
Public Revenue As Double
Public ROE As Double
并为RelationshipProductCategory
.
要创建类模块的新实例,您应该这样做
dim v as RelationshipArray
set v = new RelationshipArray
将其设置为数组元素也是如此:
Dim ar(10) as RelationshipArray
Set ar(0) = v
因此,您的代码应如下所示:
Option Explicit
Function GetRelationshipValues(ByVal Period As Integer, ByRef B As Variant, ByRef A As Variant) As RelationshipProductCategory
Dim rtn As RelationshipProductCategory
Set rtn = New RelationshipProductCategory
rtn.Period = Period
Set rtn.A = A
Set rtn.B = B
Set GetRelationshipValues = rtn
End Function
Function TableValue(rel As String, prodasp As String, attr As String, v1 As Double, v2 As Double) As Double
TableValue = Rnd
End Function
Sub RelationshipIncomeCalculation()
Dim ar(10) as RelationshipProductCategory
Dim A As RelationshipArray
Dim B As RelationshipArray
Set A = New RelationshipArray
Set B = New RelationshipArray
'this table value is analogous to Range("A2") just more robust for my use
A.Revenue = TableValue("RelationShipIncomeInput", "A", "Revenue", 0, 0)
A.ROE = TableValue("RelationShipIncomeInput", "A", "ROE", 0, 0)
B.Revenue = TableValue("RelationShipIncomeInput", "B", "Revenue", 0, 0)
B.ROE = TableValue("RelationShipIncomeInput", "BUSINESS DEPOSITS", "ROE", 0, 0)
Set ar(0) = GetRelationshipValues(0, A, B)
MsgBox "ar(0).A.Revenue = " & ar(0).A.Revenue
End Sub
我建议您更多地了解类型和类模块之间的区别。基本上,类模块在 IMO 中更有用。
推荐阅读
- android - 使用 Facebook Live Video API 时如何以编程方式指定视频流旋转
- c# - 发送带有 S3 存储桶访问密钥的 MFA 令牌,使用 c# 上传文件
- javascript - IE页面在长时间进程中崩溃
- hibernate - 如何持久化具有多个复合键的实体
- python - 如何计算二维数组元素之间差异的所有组合?
- hive - Hive unix_timestamp is not recognizing difference between 12:07 and 00:07, and returns same Unix timestamp for both
- python - 使用弹性搜索的范围查询保存为“文本”类型的日期
- haskell - Haskell MonadWriter 类型签名
- c# - Sitefinity 项目中自定义 WCF 服务的访问令牌身份验证
- c - 制作文件以从serialPort写入所有信息