Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA将父类传递给子类_Vba_Class_Subclass - Fatal编程技术网

VBA将父类传递给子类

VBA将父类传递给子类,vba,class,subclass,Vba,Class,Subclass,我在上找到了一篇很好的帖子,这似乎正是我想要的:但是我对它的修改给了我对象不支持此属性或方法。 感谢Mat的马克杯和Tomalak,我的代码现在可以正常工作了: 父类-CLS计算机 子类-clsCD 代码模块-模块1 如果我测试我,它是一个对象(例如,如果IsObject(Me)然后停止计算为true),当我键入Me时,Intellisense显示CLSCOComputer中的所有属性和方法。本地人窗口将我显示为CLSCOComputer对象。我知道要检查的所有东西都表明我是一个CLS计算机对象

我在上找到了一篇很好的帖子,这似乎正是我想要的:但是我对它的修改给了我
对象不支持此属性或方法。

感谢Mat的马克杯和Tomalak,我的代码现在可以正常工作了:

父类-CLS计算机

子类-clsCD

代码模块-模块1


如果我测试我,它是一个对象(例如,
如果IsObject(Me)然后停止
计算为true),当我键入
Me时,Intellisense显示CLSCOComputer中的所有属性和方法。
本地人窗口将我显示为CLSCOComputer对象。我知道要检查的所有东西都表明我是一个CLS计算机对象,那么我做错了什么?

我不在电脑旁,所以只是瞎编代码

Public Property Set Parent(ByRef Obj As clsComputer)
    Set pParent = Obj
End Property
为您的CLS计算机课程试一试

Option Explicit
Private pCD As clsCD

''''''''''''''''''''''''''''''
' CD property
'''''''''''''''''''''''''''''' 
Public Property Get CD() As clsCD
    Set CD = pCD
End Property

Public Property Set CD(value As clsCD)
    pCD = value
End Property

Sub Class_Initialize()
    Set pCD = New clsCD
    pCD.Initialize(Me)
End Property

我不在我的电脑旁,所以只需要盲编码

为您的CLS计算机课程试一试

Option Explicit
Private pCD As clsCD

''''''''''''''''''''''''''''''
' CD property
'''''''''''''''''''''''''''''' 
Public Property Get CD() As clsCD
    Set CD = pCD
End Property

Public Property Set CD(value As clsCD)
    pCD = value
End Property

Sub Class_Initialize()
    Set pCD = New clsCD
    pCD.Initialize(Me)
End Property
经典

去掉括号

pCD.Initialize Me
完成了

参数周围的括号强制对其进行求值并通过val传递(不管过程的签名是什么),而且由于您可能尚未为
clsComputer
定义默认属性,因此求值会中断,运行时甚至无法访问
Initialize
方法

也就是说,按值传递对象引用没有错。事实上,这就是C和VB.NET默认所做的——考虑传递任何参数<代码> ByVal < /代码>。< /P> < P>经典> < /P> 去掉括号

pCD.Initialize Me
完成了

参数周围的括号强制对其进行求值并通过val传递(不管过程的签名是什么),而且由于您可能尚未为
clsComputer
定义默认属性,因此求值会中断,运行时甚至无法访问
Initialize
方法


也就是说,按值传递对象引用没有错。事实上,这就是C和VB.NET默认所做的——考虑传递任何参数<代码> ByVal < /代码>。< /P>没有骰子。它仍然会出错。ByRef是对象的默认值,因此从Let更改为Set并不能纠正此问题。但您甚至不能
Let
对象引用,AFAIK。如果我错了,请纠正我。没有错,绝对正确。除非我通过值传递对象引用,而不是通过引用@Tim
属性Let
用于值类型。对对象使用
属性集
。是的,您是正确的@Tomalak。你不能
对象。不幸的是,这仍然失败。如果我注了
pCD.Initialize(Me)
并只
设置pCD.Parent=Me
,代码运行良好。@Tim看到我的答案了吗。它仍然会出错。ByRef是对象的默认值,因此从Let更改为Set并不能纠正此问题。但您甚至不能
Let
对象引用,AFAIK。如果我错了,请纠正我。没有错,绝对正确。除非我通过值传递对象引用,而不是通过引用@Tim
属性Let
用于值类型。对对象使用
属性集
。是的,您是正确的@Tomalak。你不能
对象。不幸的是,这仍然失败。如果我注意到
pCD.Initialize(Me)
并只
设置pCD.Parent=Me
,代码工作正常。@Tim看到我的答案了吗!在这个和@tomalak之间,这就解决了它!我会更新我的帖子。太棒了。最后我知道了帕伦斯想要做的最后一点。谢谢,啊哈!在这个和@tomalak之间,这就解决了它!我会更新我的帖子。太棒了。最后我知道了帕伦斯想要做的最后一点。谢谢
pCD.Initialize (Me) 'Error occurs on this line when using F8
pCD.Initialize Me