我看到了这行代码txtNewCaption.SetFocus
,并被告知SetFocus
被用作子代码在这里,但这也是一个功能。我还在线阅读了一个子函数和一个函数的区别,子函数不返回任何值,而是一个函数返回一个值。我无法想象SetFoucs
会返回什么样的值,因此我在网上搜索了很多有关SetFocus
的文章,但是没有一篇给我提供SetFocus
用作返回值的函数的示例。我假设我的理解或告诉我的东西有误或错误。
您能帮我澄清一下混乱吗?
谢谢!
好,在本例中,.setFocus不是子类,也不是函数。
子是一个单独的代码,您这样称呼它
Call MySub
((或更短的形式会跳过单词“ call”-这是可选的)例如:
MySub
或者,如果有参数,您可能会去:
Call MySub(InvoiceNumber)
如果是函数?这又是外部代码。您可以使用返回值的函数,也可以使用返回值的IGNORE。
所以
MyVar = MyFunction()
就像潜艇一样,该函数可以接受参数:
MyVar = MyFunction(InvoiceNumber)
并且正如我指出的,您可以“忽略”这样的函数的返回值:
MyFuncton InvoiceNumber
如果按上述方式编写,则您正在传递值,但是该函数的返回值未“放置”或放入任何东西中。因此您可以“使用”返回值的函数。您还可以在传递的值附近跳过()的使用。
但是,在以上两个示例中,我们正在谈论您编写的VBA子和功能。
SomeTextBox.SetFocus不是子元素,也不是函数。
上面叫什么?它称为对象的方法。
因此,当您使用Access对象时,说记录集,控件等?好吧,“对象”将具有我们所谓的属性(通常是您可以设置或从中获得值的事物)。
所以,对于一个文本框,您有:
MyControl.Value = "Hello"
以上将文本框的值(文本)设置为Hello。因此,“。value”是该文本框的属性。它也恰好是默认属性。所以你可以去:
MyControl = "Hello"
现在,如果您去:
Msgbox("Value of MyControl = " & MyControl.Value)
因此,通常可以将“事物”(对象)的属性设置为值,而您可以获取(检索)值。这称为属性。
但是,这些对象也具有所谓的方法。方法是一个“动作”,类似于子功能(但您没有编写该方法)。
这些方法是作为对象一部分运行的“某些代码”。因此,有时对象的属性与对象的方法之间的区别是“灰色”。某些方法可以接受值和返回值,但是两者(方法和属性)之间的区别在于,使用方法设置值可能更多。 (因此,不仅限于获取和设置)。
“一种方法”可以被认为是一些“动作”和代码。倾向于假定将使用某些方法来运行该方法。 (在大多数情况下,它不是您的代码-它是“代码”附加到内置对象上。
所以
MyTextBox.SetFocus
这是文本框控件或有问题的给定控件的方法。并非所有必要的控件都可能具有此“方法”。
因此.SetFocus不是子函数,不是函数,但实际上是所涉及控件的方法。
函数不一定必须返回值。您可以像调用子程序一样调用函数。自己尝试:编写一个函数,在子目录中逐步浏览该函数,然后检查您的本地窗口。
函数具有返回值的附加好处,但不必这样做。
编辑:除了需要返回值外,我确定还有理由在另一个值上使用它,但是我通常根据任务的复杂性来确定是使用子函数还是使用函数。我使用函数执行简单的任务,并使用subs执行更复杂的任务。
如果您是search the Microsoft Documentation (MSDN) for SetFocus
,则会发现它定义为:
用户界面控件对象上的method,将焦点移到该对象上...使用无返回值
(以上引用未按字面意思,但传达了含义)
因此它不是VBA语法中的功能。此外:VBA中的函数的返回值 是可选的。参见SetFocus method (Microsoft Forms):
可选。函数的返回值。
在大多数编程语言中,适用方法的常见命名约定(忽略大小写):
get
(通常使用参数作为要设置的值)来设置新状态(或值)。通常没有返回值,因为新值或状态由传递的参数(其参数)预测。这种方法称为setter或mutator。set
,is
,has
,exists
,contains
,starts
等返回布尔值值。此类方法用于检查标志(打开/关闭,是/否,是/否)。ends
,calculate
,locate
,indexOf
,find
,fetch
,lookup
等(通常带有参数)以返回基于指定参数的某些处理结果) (通过某种逻辑,数学算法或通过数据检索查询)