gpt4 book ai didi

vba - cells() 的默认属性

转载 作者:行者123 更新时间:2023-12-02 14:31:15 25 4
gpt4 key购买 nike

我的印象是 VBA 的所有对象都有默认属性。因此,如果我说 Cells(counter, x) 附加的默认属性将为 .value。此外,我一直交替使用 Cells(counter, x)Cells(counter, x).value。但是,当通过 for 循环将项目添加到集合时,我注意到如果我没有包含 .value 而不是存储值,它会存储工作表中位置所表示的值。这样,如果删除该位置,集合中的引用就会丢失。这给我带来了两个发现:1)集合可以存储非静态引用,2)Cells()和其他对象没有默认属性,例如.value

如果有人能够澄清、确认和启发,那就太好了。

最佳答案

不,并非所有类型都有默认成员。

通过指定特殊的成员属性,任何类模块都可以拥有默认成员(您必须手动导出和编辑代码文件才能执行此操作,VBE 不会公开任何功能为此):

Attribute {member name}.VB_UserMemId = 0

只允许一个成员成为类型的默认成员。

<小时/>

您正在发现默认成员的肮脏之处以及为什么应该避免使用它们。

VBA 做了很多事情来“让我们的生活更轻松”(例如隐式类型转换),默认成员就是其中之一。

Collections can store non-static references

我不知道什么是“静态引用”,但是当您将对象引用存储在集合中时,您并不是存储该对象的副本对象,但引用它。

Cells() and other objects do not have default properties such as .value.

Global.Cells 是一个参数化属性 getter,它返回 Range 对象引用; Range.Cells 也是一个返回 Range 对象的 getter; Excel 对象模型中没有 Cell 类。 Range 的默认成员是一个隐藏的 [_Default] 成员,它似乎解析为其Value。但是当你这样做时:

Dim c As Collection
Set c = New Collection
c.Add ActiveSheet.Cells(1, 1)

然后添加 .Cells(1, 1) 返回的 Range 引用,然后是:

Debug.Print c.Item(1)

将输出该Range对象的值。然而这个:

Debug.Print TypeName(c.Item(1))

将输出范围

令人困惑?是的。这就是为什么您应该始终指定 Option Explicit,尽可能使用显式类型声明的变量,避免隐式类型转换,...​​并避免使用默认成员。

通过编写完全按照其应有行为读取的代码,您可以避免许多 VBA 陷阱,并且当您最终想要学习一些 VB.NET 或 C# 时,您将完全不会迷失类型安全性和显式性。

关于vba - cells() 的默认属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37866303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com