VBA自定义属性难题

Exo*_*ant -2 excel vba module class excel-vba

关于VBA的一个问题,我一直在Stack上问。我愿意竭尽全力寻找答案。要知道它看起来很愚蠢和幼稚,但这是一个棘手的骗人的问题,几乎每个人都一贯地错过答案。


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

  1. 简单来说就是Range(“ 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 计算属性“计数”并返回集合中的对象数

好吧,请在您的脑海中停留一下这个幼稚的例子,然后继续进行下面的讨论...


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

Public EmpName as String
Public EmpID as String
Public EmpRate as Double
Public EmpWeeklyHrs as Double
Run Code Online (Sandbox Code Playgroud)

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

Public Function EmpWeeklyPay as Double
  EmpWeeklyPay = EmpRate * EmpWeeklyHrs
End Function
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

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

Dim Count as Integer
Run Code Online (Sandbox Code Playgroud)

根据书中荒谬的公理说:

Properties are variables that can be declared Private or Public.
Run Code Online (Sandbox Code Playgroud)

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

您将如何在自定义对象中创建名称,值或计数之类的属性,而无需通过一些步骤来告诉编译器仅通过在Class模块中键入“ straw”声明来做什么?

小智 5

我不会与您正在阅读的书的作者作斗争(实际上,我还没有读过该书)。它得到了相当积极的评价,所以我认为问题的真正根源是您-误解了一些概念。

书的目录

在此处输入图片说明

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

好吧,反正

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

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

在实际发布到StackOverflow上之前应该做的事情称为研究

每个人偶尔都会读到一些不清楚或无法完全理解的内容。在这种情况下,您要做的是启动浏览器,并对该主题进行研究。多个来源阅读同一件事,我相信您一定会理解它。另外,不要依赖于一个特定的书,因为大多数作家总是说,这些方针的东西:“ 做更多的研究你自己,因为如果我要谈的是每细节这本书就必须是另一个1000页长 ”。

现在,

自定义对象的属性是声明为Private或Public的变量。

尽管从技术上讲这是正确的,但值得指出的是,不仅变量是类的属性。变量是类属性的一种类型-我将尝试说服您更好地将其称为Member。当您了解类时-您需要能够区分术语含义上的差异。你需要知道什么话想classclass Propertymemberfunctionvariablecollectionaccess modifiersinheritancepolymorphismobjectclass instance,多参考

计算属性“计数”并返回集合中的对象数

太好了,你怎么知道的?Range.Count属性 -另一个很好的技巧是访问MSDN开发人员的参考,并查看所使用对象的定义。在MSDN上,并不是每个类都有很好的描述,但是它为您提供了一些基本信息,以帮助您入门。如果您还有其他需要,请再次前往Google进行研究。

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

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

根据该书,该对象现在具有4个属性,因此我们在类模块中将它们声明为变量:

对于初学者来说,这总是有些棘手。.我想这是有些人感到困惑members的地方properties。正如乔恩·斯凯特Jon Skeet)所解释的那样,我将不对此进行详细介绍研究!)。能够分辨出您所使用的术语之间的区别至关重要。

在VBA中工作时,将班级中的所有内容都视为班级成员确实很容易。因此类成员variablesproperties (let/set/get)functionsprocedurestypeS,enumS, ,。external dlls declarations events (which are functions)如您所见,我将它们称为类成员,而不是调用所有类属性。这样,您使用该词的上下文的困惑Property就消失了。a Property现在是Let / Set / Get类型的事物,并且是类的成员。

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

再次,什么是.Count?如果您对VBA有点熟悉,那么您已经知道该怎么办?你研究

返回一个Long值,该值表示集合中对象的数量。

大。哪个成员通常会退回东西?一个Function?是的,那又返回什么呢?一个Long值。该值代表什么?the number of objects in the collection

为什么一个叫做a Collection而另一个叫做Class。您应该首先了解它们之间的区别。你呢?它是什么?

您将如何.Count在自己的班级中创建函数?这是相当先进的。您需要了解到此为止的所有其他内容,以便能够自己完成一个不仅仅是复制粘贴代码而又不真正了解正在发生什么事情的代码。之类的东西EnumeratorInterfacesIUnknown是参与,你不明白这些术语。你又做什么?研究。

.Count是始终在上实现的常见属性Collections。您有一个班级,但您Collection的班级中没有成员,您的班级Collection本身也没有。

研究使我知道» 实现自定义集合

PS:我故意没有链接到一个外部网站,该网站解释了此答案中多次使用的非常重要的关键字。

希望这可以帮助。