【问题标题】:Accessing array of floats inside an array of class objects in VBA在VBA中访问类对象数组中的浮点数组
【发布时间】:2020-02-20 06:52:35
【问题描述】:

我有一些可能很容易解决的问题,即访问类对象数组中的浮点数组。 在我的 Excel 文档中,我声明了一个具有一些属性的类 TData,例如

Public weight As Double
Public segments As Variant

然后在模块中声明一个对象数组和一个修改数据的函数:

Dim dataset(126) As Object

Function modify()

   Set dataset(0) = New TData
   dataset(0).weight = 50
   dataset(0).segments = Array(5.5,2,1)

   Debug.Print dataset(0).segments(0) ' this produces an error 451
   t = dataset(0).segments
   Debug.Print t(0) ' this is fine and prints the correct answer

End Function

如果我尝试使用“dataset(0).segments(0)”行直接访问该值,我将收到错误 451“Property let procedure not defined and property get procedure did not return an object”。如果我首先将数组分配给一个变量,我可以访问该值。

现在我不明白为什么我不能访问嵌套数组的值。我想这是一些我在任何地方都找不到的特定语法。问题是,当我将“dataset(0).segments”添加到手表时,它会列出具有上述“dataset(0).segments(0..2)”符号的值。

【问题讨论】:

  • Debug.Print dataset(0).segments()(0)
  • 太棒了!谢谢。现在看起来这会返回一个 ByValue 值,因为尝试执行 dataset(0).segments()(0) = 7.2 是有效的,但不会修改原始数组。我目前正在考虑只使用一个 Let 方法,但是还有一个符号可以直接写入数组吗?
  • 我认为如果你想修改它,你需要把数组拉出来,或者在对象上创建一个setter方法。

标签: arrays excel vba class


【解决方案1】:

感谢蒂姆:

我已经删除了我之前的答案,并将其替换为蒂姆提供并被作者接受的内容。该错误是一个语法错误,即使我没能捕捉到。我正在改变我对社区的回答,但 100% 归功于 Tim。如果蒂姆发布了答案,他应该会得到接受的答案复选标记。

Debug.Print dataset(0).segments()(0)

【讨论】:

  • 感谢您的回答,但没有违反 OOP 的概念。我在 Object 数组的第一个位置显式地创建了一个 TData 类的新实例,其中 new TDatastatement 具有显式的 126 个保留字段。它的属性此时未初始化或默认,但在以下两行中初始化,数组隐式使用Array(0,0,0) 表示法。从那时起,所有必需的属性在 dataset(0) 的对象中都是有效的。
  • 我认为我没有很好地解释自己。我并不是要暗示违反了 OOP。在您的问题中,您问为什么不能直接访问数组中的浮点数。我的回答就是针对这个问题的。我认为您已经有了工作 OOP 代码,而您只是想知道为什么必须通过创建另一个变量来访问对象内部的数组。如果这不是您要问的问题,您能否澄清一下您想要了解的内容?
  • 啊,好的。如果我访问对象数组中的数组,例如python,我只需编写print(dataset[0].segments[0]) 来获取,或者dataset[0].segments[0] = 5.4 来设置对象数组的数组属性内的值。在 VBA 中,t = dataset(0).segments(0) 行产生了错误,正如 Tim 所指出的,我必须写 Debug.Print dataset(0).segments()(0) 才能获得读取权限。所以他的评论是对最初问题的正确答案。但是,我无法使用此表示法设置值。我将其添加为“奖励”问题:)
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多