Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
为什么';返回范围的Excel/VBA用户定义的默认属性的行为是否与范围类似?_Vba_Excel - Fatal编程技术网

为什么';返回范围的Excel/VBA用户定义的默认属性的行为是否与范围类似?

为什么';返回范围的Excel/VBA用户定义的默认属性的行为是否与范围类似?,vba,excel,Vba,Excel,我正在编写的Excel/VBA类中的属性返回一个范围。我使用中描述的技术将其作为类的默认属性。我希望对我的类的对象使用Range类的所有内置属性和方法,而不显式指定属性。它不起作用。下面是几个简单得多的类来说明。(这些列表是使用文本编辑器查看的导出源,因为VBA的编辑器隐藏属性语句。) 下面是普通模块中的一个子模块,用于实例化和测试类。注释指出了当我单步通过它时会发生什么: Sub DefTest() Dim DefRange As New clsDefRange, DefLong As

我正在编写的Excel/VBA类中的属性返回一个范围。我使用中描述的技术将其作为类的默认属性。我希望对我的类的对象使用Range类的所有内置属性和方法,而不显式指定属性。它不起作用。下面是几个简单得多的类来说明。(这些列表是使用文本编辑器查看的导出源,因为VBA的编辑器隐藏属性语句。)

下面是普通模块中的一个子模块,用于实例化和测试类。注释指出了当我单步通过它时会发生什么:

Sub DefTest()
    Dim DefRange As New clsDefRange, DefLong As New clsDefLong
    Debug.Print DefLong.DefProp         '(1) Displays 125. Verifies the class behaves as intended.
    Debug.Print DefLong                 '(2) Same as (1). Verifies VBA uses the DefProp property as the default.
    Debug.Print DefRange.DefProp.Value  '(3) Displays the ActiveCell content. Verifies that this class works as intended.
    Debug.Print DefRange.DefProp        '(4) Same as (3). Verifies VBA knows DefProp returns a Range without further prompting.
    Debug.Print DefRange                '(5) Aborts with the messge "Run-time error '13': Type mismatch"
 End Sub
为什么语句(5)中的DefRange的行为与语句(4)中的DefRange.DefProp不一样

如果我将声明(5)更改为:

编译器选择“.Cells”,表示“compileerror:Method或data member not found”(编译错误:未找到方法或数据成员),然后停止,因此问题出现在对象模型中,而不仅仅是在运行时出错。我做错什么了吗?或者不可能有一个返回范围的默认属性吗?其他内置类呢?用户定义的类

Debug.Print DefRange
这似乎是要求它链接默认属性,但它不会这样做。只能从提供的对象中提取默认特性。在本例中,您返回的是一个无法打印的范围对象。VBA不会转到下一个级别来查看默认属性是否返回对象以及该对象类型是否具有默认属性。我想如果是这样的话,你可以创建一个无限循环——两个对象各自是另一个的默认属性的结果

Debug.Print DefRange.Cells(1, 1) 
没有默认属性将自身插入点链。我想这是因为如果DefRange有自己的Cells属性,它会使用哪个?在Excel的模型中,我想不出任何对象会有这种行为。你可以用这个

Debug.Print DefRange(1,1)
这似乎是链接默认属性的一个例子,我说过它不会这样做。我猜
(1,1)
足以再次启动链。DefRange返回一个范围对象,(1,1)返回一个范围对象,并返回Value(默认)属性


有趣的问题。我想知道默认属性功能是故意以这种方式构建的,还是只是它的工作方式。

我可能猜默认属性可能不会扩展到复杂的对象,或者(可能更可能)需要不同的语法才能工作。好问题,不过。。。我根本不知道那个把戏!我同意这是一个很好的问题。我认为这可能与Range有一个隐藏的默认属性有关。此DDOE帖子有一个有趣的讨论:。我尝试了两种不同的方法,但无法改变您看到的行为。FWIW,根据我的经验,一般来说,不依赖默认属性做任何事情都会更好,即使是内置对象。完全引用所有内容,并且(a)在阅读代码时更容易理解,(b)在运行代码时更可靠。请接受我对回复时间过长的歉意。我想我选中了一个选项,当有人发表评论但没有人到达时,我会收到一封电子邮件。无论如何,谢谢你帮助教育我。
Debug.Print DefRange.Cells(1, 1) 
Debug.Print DefRange(1,1)