【问题标题】:VBA Custom Property ConundrumVBA 自定义属性难题
【发布时间】:2014-02-27 07:29:41
【问题描述】:

有一个关于 VBA 的问题,我一直在 Stack 上提出。我愿意不遗余力地寻找答案。请注意,这可能看起来很愚蠢和幼稚,但这是一个棘手的讽刺问题,几乎每个人都会一直错过答案。


根据我的 VBA 书籍(Bill Jelin - VBA Macros Microsoft Excel 2010),当我们创建自定义对象时,我们会打开一个类模块。 自定义对象的属性是声明为 Private 或 Public 的变量。 这对我来说似乎非常不合逻辑!!!我将在下面的图片中说明原因。

  1. 只是范围(“A1:A4”)
  2. 一个非常简单的 Sub 用于解释目的(你可以在下面清楚地看到它)

    Sub dd()
      Dim i As Integer
      Dim Top As Range
      Set Top = Range("A1:A4")
      i = Top.Count
      MsgBox i
    End Sub
    
  3. Count 属性“计数”并返回集合中对象的数量

好吧,记住这个幼稚的例子一分钟,然后继续下面...


现在假设我们正在 VBA 中创建一个自定义对象,因此我们打开一个类模块并将其命名为 clsEmployee。现在该对象有 4 个属性,根据本书,我们将它们声明为类模块中的变量:

Public EmpName as String
Public EmpID as String
Public EmpRate as Double
Public EmpWeeklyHrs as Double

还有一个方法,所以我们在Class模块中输入她

Public Function EmpWeeklyPay as Double
  EmpWeeklyPay = EmpRate * EmpWeeklyHrs
End Function

现在,如果我们转到普通模块引用并通过在 Intellisense 窗口中键入 Employee 来实例化对象...

...向我们展示了这些过程和功能

但是如何创建像 Count 这样的自定义属性?正如您在第一张图片的图形示例中看到的那样,Count 属性参与了某种逻辑步骤,并对集合中解析它们的单元格进行计数,并在 MsbBox 中返回数字 4。只有这些逻辑步骤实际上以某种方式硬编码在机器中才有意义。您不能通过简单的输入在 Class 模块中声明这种属性:

Dim Count as Integer

根据书中的荒谬公理:

Properties are variables that can be declared Private or Public.

这也将非常揭示 Count 属性 不等于 与图片中代码中的任何内容。这意味着 Count 属性不是“稻草”属性,它需要一些逻辑来解析 Range("A1:A4") 中的单元格并说有 4 个单元格。我只是看不到如何通过在 Class 模块中键入来创建这样一个自定义对象: Dim Count as Integer

如何在没有一些过程的情况下创建自定义对象属性,如名称、值或计数来告诉编译器要做什么在 Class 模块中输入“straw”声明?

【问题讨论】:

  • "我只是看不到如何通过在 Class 模块中输入来创建这样一个自定义对象:Dim Count as Integer" 这不是你会做的。如果你正在学习这方面的书,那么你肯定在课堂模块中读过Public Property [Let|Set] XXXXX()Public Property Get XXXX() 吗?如果没有,你应该从那里开始。
  • 不,先生,这些还不会消除这些障碍吗?
  • 类几乎总是任何编程书籍的中间主题。不知道大多数情况,但我总是将它归类为中间,因为到达那里意味着比简单的 For、Do-While 循环或生成素数/斐波那契等等更多的投入。当然,如果你在上面问这个问题,你显然没有阅读完整的章节,或者你没有理解它。 :) 阅读它,消化它。然后再问。 @TimWilliams 是正确的。此外,请阅读很多关于继承的内容,因为在回答完上述问题后,您肯定也会想问这个问题。
  • 除了大家写的,如果要获取一个集合的成员Count,需要设置一个集合。即使您已经正确创建了对象,您仍然需要设置这些对象的集合。
  • @TimWilliams、BK201 和 Ron Rosenfeld,你们都是对的,我完全同意你们所有的 cmets。我试图在我的回答中总结一些概念,如果我忘记了什么,请随时批评或更新我。

标签: vba class excel module


【解决方案1】:

我不会和你正在阅读的书的作者打架(事实上,我没有读过那本书)。它收到了相当positive reviews 所以我认为问题的真正根源是你 - 误解了一些概念。

你的书目录

现在,您是否缺少页面? :P 你是如何从 Using a Custom Object (p 498)Collections (p 501) 而没有看到/阅读第 499 页 Properties?

不管怎样

创建一个自定义对象我们打开一个类模块。

这是非常糟糕的措辞。我不是书籍作家,但我读过很多编程书籍,而且我从未见过专业人士实际使用如此糟糕的措辞进行教学。对我来说,有一些编程经验的人这句话显然没有意义。 该句子的概念对于学习类、类模块等至关重要,您应该确保理解其中的每个单词及其含义。

你应该做的before actually posting on StackOverflow 被称为研究

每个人偶尔都会读到一些不清楚或无法完全理解的东西。在这种情况下,您要做的是启动浏览器并自己研究该主题。多个来源阅读相同的内容,我相信您会得到在某个时候理解它。另外,永远不要依赖某一本书,因为大多数作者总是这样说:“自己做更多的研究,因为如果我要谈论关于这个的每一个细节,或者这本书必须再长 1000 页”。

现在,

自定义对象的属性是声明为 Private 或 公开。

虽然这在技术上是正确的,但值得指出的是,不仅变量是类的属性。变量是类属性的一种类型——我将试图说服你最好将其称为members。 当您开始了解课程时 - 您需要能够区分术语含义的差异。你需要知道像 classclass Propertymemberfunctionvariablecollectionaccess modifiersinheritancepolymorphism、@9876543 这样的词class instance,还有更多参考

Count 属性“计数”并返回对象的数量 收藏

太好了,你怎么知道的? Range.Count Property - 另一个很好的提示是访问 MSDN 开发人员参考并查看您使用的对象的定义。 MSDN 上并非对每个课程都有很好的描述,但它为您提供了一些基本信息来帮助您学习。如果您还有其他需要,请再次访问 google 并进行研究。

现在假设我们正在 VBA 中创建一个自定义对象,因此我们打开一个类 模块并将其命名为 clsEmployee。

在 VBA 中创建自定义对象肯定是指自定义对象模块,不要与自定义对象实例混淆。 VBA 项目的自定义对象是UserFormModule引用标准模块)和Class Module。这些是对象模块。添加类模块就像为要实例化的模型添加您自己的蓝图(您自己的数据类型以您在该蓝图中设计的方式存储一些信息)。添加对象模块和创建对象实例是有区别的...

现在对象有 4 个属性, 根据这本书,所以我们将它们声明为内部变量 类模块:

这对于初学者来说总是有点难以理解。我猜是有些人将membersproperties 混淆了。我不打算以Jon Skeet already has explained 的身份详细介绍这一点(research!!)。必须能够区分您使用的术语。

在 VBA 中工作时,将班级中的所有内容都视为班级成员真的很容易。所以班级成员是variablesproperties (let/set/get)functionsprocedurestypes、enums、external dlls declarationsevents (which are functions)。如您所见,我没有调用所有类属性,而是将它们称为类成员。然后,您使用单词Property 的上下文混乱就消失了。 Property 现在是 Let/Set/Get 类型的事物,并且是类的成员。

但是如何创建像 Count 这样的自定义属性?

再次,.Count 是什么?如果您对 VBA 有点熟悉,那么您已经知道如果不知道您会做什么?你research

返回一个 Long 值,表示在 收藏。

太好了。一般是哪个会员退货? Function?是的,那么它返回了什么? Long 值。该值代表什么? the number of objects in the collection.

为什么一个叫Collection,另一个叫Class。您应该清楚地知道它们之间的区别是什么。你?它是什么?

您将如何在自己的类中创建.Count 函数?这是相当先进的。在此之前,您需要了解其他所有内容,以便自己能够做到这一点,而不仅仅是复制粘贴代码,而无需真正了解正在发生的事情。 EnumeratorInterfacesIUnknown 之类的东西都涉及到,而您不理解这些术语。你又做什么?研究。

.Count 是始终在Collections 上实现的公共属性。你有一个班级,但你的班级没有Collection 成员,你的班级本身也不是Collection

研究将我引向 »Implementation of a custom collection

PS:我故意没有链接到一个外部站点,该站点解释了在此答案中多次使用的一个非常重要的关键字....您应该自己弄清楚哪个是-我会等待您的反馈:)

希望这会有所帮助。

【讨论】:

  • 亲爱的,您的问题确实非常直观。我有点固执地坚持了 2 天,因为当时书籍的解释完全破坏了我的逻辑,但现在我继续前进,我明白这本书开始清理我脑海中的烂摊子,从 Property Get/Let 开始.我有 5 本书 VBA 并且我一直在做研究。感谢您的宝贵时间
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2011-03-27
相关资源
最近更新 更多