【问题标题】:Passing objects to procedures in VBA将对象传递给 VBA 中的过程
【发布时间】:2011-05-11 23:25:44
【问题描述】:

我正在开发一个简单的工具,它可以让我解析多个 CSV 文件并将它们吐出到“合并”在一起的新工作表上。这是我的实现(我已经简化了)和我的问题:

A类

private variables as types
property methods for accessing variables

B类

private variables as types
property methods for accessing variables

C类

Private cA as ClassA
Private cB as Collection  'Collection of ClassB

D 类 - 我的问题的一部分

Private cC as Collection 'Collection of ClassC
'Other member variables and their property get/lets

Public Sub AddA(A as ClassA)
    If cC.Item(A.foo) is Nothing then 
        dim tempC as ClassC
        set tempC = new ClassC
        tempC.A = A
    End if
End Sub

主模块 - 我的问题的另一半

Dim cC as New ClassC
'Initialize Class C, this all works fine
Dim tempA as ClassA
Set tempA = new ClassA
'Set tempA properties
cC.AddA tempA  'This is where my error is

我尝试将它作为ByValByRef 传递给我不同的错误(“byref 参数类型不匹配”、“无效的过程或参数”和“对象不支持此属性或方法”

我不知道接下来要尝试什么,我什至尝试了括号“东西”,据说它强制参数进入 ByVal 或 ByRef,我不记得了,那是昨天。

谢谢。

【问题讨论】:

  • 错误在AddA 内部,所以一些代码会有所帮助。我也打赌你想要Public Sub AddA(ByVal A as ClassA)
  • @GSerg 我在调用 sub 的主模块中收到错误,我尝试使用 ByVal A as ClassA,我收到“无效的过程或参数”错误。请注意,我添加了 AddA 的代码,同时实现了我完全遗漏了一个类。我已经完全更新了所有代码。对此感到抱歉。
  • 使用Tools -> Options -> General -> Error Trapping 更改您看到错误的位置。在这种情况下,您可能需要“Break in class module”。
  • @GSerg 好的,现在我看到了错误实际发生的位置,它似乎是我执行检查的地方If cC.Item(A.Foo) is Nothing then,根据文档,如果该项目不存在,它将只是错误而不是返回空值。让我解决这个问题,然后我们看看会发生什么

标签: excel vba


【解决方案1】:

这一行:

tempC.A = A 

表示“将tempC 对象的A 属性赋值给A 对象的默认属性值。”
您的 A 对象显然没有默认属性。

你的真正意思可能是:

Set tempC.A = A 

但即便如此,您也无法从 D 类访问 C 类的私有字段 A。公开该字段或在C 类上创建一个公共SetA() 方法并从D 调用它。

【讨论】:

  • 这实际上并没有解决我的问题,它实际上在我的代码中的其他地方,但是你让我寻找正确的路径,我不知道错误捕获设置(这有助于吨),所以我要把它标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多