Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Class VBA:为什么使用属性而不是子例程或函数?_Class_Vba_Properties_Arguments - Fatal编程技术网

Class VBA:为什么使用属性而不是子例程或函数?

Class VBA:为什么使用属性而不是子例程或函数?,class,vba,properties,arguments,Class,Vba,Properties,Arguments,当我们可以使用子例程或函数简单地传递和返回参数时,为什么我们需要在VBA类中使用属性Let、Get和Set。所以我想你真正的问题更多的是:“为什么要使用类模块?”。事实上,你可以在数年内构建出优秀的应用程序,而无需这样做。 我开始将它们用于非常特殊的用途,比如阅读复杂的文本文件(大型机打印的报告,逻辑记录跨越多个物理行),或者从庞大复杂的Excel工作表中获取特定信息。 一旦你完成了一个模拟你想要阅读的项目的类,你就可以在不同的应用程序中重用该类,并将注意力集中在你特定应用程序的逻辑上,而不是放

当我们可以使用子例程或函数简单地传递和返回参数时,为什么我们需要在VBA类中使用属性
Let
Get
Set
。所以我想你真正的问题更多的是:“为什么要使用类模块?”。事实上,你可以在数年内构建出优秀的应用程序,而无需这样做。
我开始将它们用于非常特殊的用途,比如阅读复杂的文本文件(大型机打印的报告,逻辑记录跨越多个物理行),或者从庞大复杂的Excel工作表中获取特定信息。

一旦你完成了一个模拟你想要阅读的项目的类,你就可以在不同的应用程序中重用该类,并将注意力集中在你特定应用程序的逻辑上,而不是放在同一个旧程序的逻辑上,例如,阅读同一个旧文件。

你不需要。。。对于90%的应用程序来说,标准VBA恰到好处。使用类,您可以对代码进行更多的“逻辑控制”

假设您有一个函数
function IsUnique(MyArg作为字符串)作为布尔值
,该函数查找传入了
MyArg
姓名的人员表,如果在表中找不到姓名,则返回
TRUE
。例如,没有什么可以阻止您调用此函数并传递用户选择的最喜爱蔬菜的字符串。尽管此调用将始终返回
TRUE
,因为蔬菜存储在此应用程序中的其他位置,但您仍将获得语法正确的程序

现在假设您有一个类
PersonClass
,其中包含函数(=property)
Name
IsUnique()

你的代码最后你可能会喜欢这个

Dim MySpouse as PersonClass
    Set MySpouse = New PersonClass
    MySpouse.Name = "Fanny Hill"
    If MySpouse.IsUnique() Then
        MySpouse.Insert
    End If
看起来有些过分的做法实际上是将与某个人有关的代码块、函数和变量(这里称为方法和属性)封装到一个类中,并使代码更清楚地了解使用该类模板(即该类的实例)的变量所做的事

典型示例:IP地址算法。。。。。(添加IP、查找基址或广播地址、在各种掩码符号之间转换、检查两个范围的重叠、查找包含两个或多个IP的网络掩码等)十几个应用程序中需要的:编写一次类模块,一旦测试,您就可以轻松地重用它

类的另一个优点是,当在VBA编辑器中输入代码时,代码完成会准确地告诉您可以对类执行什么操作(即,所有属性和方法都显示在下拉列表中)-这是过程和函数所没有的安慰(它们只告诉您参数名称和类型)


够了吗?

我认为简单的答案是属性是类的特征,而方法(子例程)是动作

我对此的解释是,属性是“形容词”,方法是“动词”。我们可以做一个类比来帮助说明这一点:我们有两个NHL守门员(让我们把他们创建为clsGoalie的成员),凯里·普莱斯和达斯汀·托卡斯基。每个都有一个特定于其唯一“守门员”对象的属性,我们称之为保存百分比(PSAVEPERATION)。两名守门员都需要完全相同的方法来阻止网上射门(比如私人次拦网),但他们独特的属性会影响该动作的表现

为什么我们要用属性而不是返回值来定义类的特征,答案是属性扩展了对象,或者本质上定义了对象。返回值不能用于引用回其来源的对象。回到我们的守门员类比。。。假设我们用一个子程序定义了每个守门员的扑救百分比。我们可以让它工作,但在我们的主方法中需要更多的代码。首先,我们必须将SavePercentage设置为Double(您已经可以看到我们已经超出了对象)。接下来,“SavePercentage=Price.calcsaveepercentage”。最后,我们必须编写一个全新的方法(在我们的主模块或其他模块中),然后将新的double类型变量传递给。。。在这一点上,我们甚至不知道谁在网上。普莱斯救了那枪还是托卡斯基?令人困惑在本例中,如果我们将save percentage作为类“clsGoalie”的一个属性,我们将更好地利用OOP的强大功能:干净的代码和封装


希望这能有所帮助。

此外,Let/Get组合或Set/Get组合为参数类型(对于Let/Set)和返回值(Get)设置了一个规则,以便可以在赋值语句的左侧使用函数。使编码清晰

海报并不是在问为什么要使用类。他问我们为什么要在VBA类中使用属性Let、Get和Set,而不是Subs和Functions。到目前为止,下面的问题似乎还没有回答这个问题,我期待着与此类似的函数效果。net回答:有些答案状态属性只用于类,但是属性也可以用于常规代码模块。sub用于使不需要返回值的情况发生。函数也可能会使某些事情发生,但返回一些结果/值/对象。拥有一个属性意味着有一些值/对象,用户可以
获取它以查看它的外观,或者
设置它以更改它。例如,Worksheet.Name是内置的Excel属性
Get
像这样获取属性:
Debug.Print ActiveSheet.Name
Let
像这样:
ActiveSheet.Name=“My Report”