ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4730|回复: 12

[分享] 对Sub及Function语句的定义

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-24 11:14 | 显示全部楼层 |阅读模式
本帖最后由 cui26896 于 2019-6-25 20:10 编辑

   随着对VBA了解的程度逐渐深入,了解并使用Sub和Function这两个语句是不可回避的。但是找到网上所有的资源中,对这两个语句的解释,即使就是用了些实例来说明,最后看完了,还是一头雾水。去看大侠的实例,有些越看越湖涂。因为他们早已对基本的规则非常熟悉了,大量的简化写法,初学者根本不知道。本来想去找一个VBA的帮助文件,认真了解一下,但是,本论坛里的贴子中,下载连接早已失效,能下载的,解压错误,万般无奈。还好,突然想到了标准!所有围绕产品及产品相关的活动中,所有的终裁都是以标准为准则的!!VBA也一样,它的标准就官方的解释,具有最终裁定权。下面就把对Sub与Function官方的定义放在下面,为我类似的初学者们,提供一个裁定依据,你该怎样用,怎样用是对的。
Sub 语句
声明构成Sub 过程的主体的名称、参数和代码。
语法
[私有 | 公共 | 好友][静态]Sub名称[( arglist )]
[语句]
[ Exit Sub ]
[语句]
End Sub

Sub 语句语法包含以下部分: The Sub statement syntaxhas these parts:
        
PartPart
         
说明Description
     
      
PublicPublic
      
可选。Optional. 指示 Sub 过程对所有模块中的过程是可访问的。Indicates that the Sub procedure is accessible to all  other procedures in all modules. 如果在包括 Option Private 语句的模块中使用,则此过程在项目外部不可用。If used in a module that  contains an Option Private statement, the procedure is not available  outside the project.
   
     
PrivatePrivate
      
可选。Optional. 指示 Sub 过程仅对声明此过程的模块中的其他过程是可访问的。Indicates that the Sub  procedure is accessible only to other procedures in the module where it is  declared.
   
     
FriendFriend
      
可选。Optional. 仅在类模块中使用。Used only in a class  module. 指示 Sub 过程在整个项目中是可见的,但对对象的实例的控制器不可见。Indicates that the Sub  procedure is visible throughout the project,  but not visible to a controller of an instance of an object.
   
     
StaticStatic
      
可选。Optional. 指示在调用之间保留 Sub 过程的局部变量。Indicates that the Sub procedure's  local variables are preserved between calls. Static 属性不会影响在 Sub 外部声明的变量(即使在此过程中使用这些变量)。The Static attribute doesn't affect variables that  are declared outside the Sub, even if they are used in the procedure.
   
     
namename
      
必需。Required. Sub 的名称;遵循标准的变量命名约定。Name of the Sub; follows  standard variable naming conventions.
   
     
arglistarglist
      
可选。Optional. 表示在调用 Sub 过程时传递给它的参数的变量列表。List of variables representing  arguments that are passed to the Sub procedure when it is called. 多个变量之间使用逗号分隔。Multiple variables are separated by commas.
   
     
statementsstatements
      
可选。Optional. 任意一组可在 Sub  过程中执行的语句。Any group of statements  to be executed within the Sub procedure.
   
arglist 参数包含以下语法和部分:The arglist argument hasthe following syntax and parts:
[可选][ ByVal | ByRef][ ParamArray ]varname[()] [ As type ] [ = defaultvalue][ Optional ] [ ByVal | ByRef] [ ParamArray ] varname [ ( ) ] [ Astype ] [ =defaultvalue]


        
PartPart
         
说明Description
     
      
可选Optional
      
可选。Optional. 一个指示参数是非必需的关键字。Keyword indicating that an argument is  not required. 如果使用, 则_arglist_中的所有后续参数也必须是可选的, 并且使用optional关键字声明。If used, all subsequent arguments in arglist must also  be optional and declared by using the Optional keyword. 如果使用了 ParamArray,则不能将 Optional 用于任何参数。Optional can't be used for any argument  if ParamArray is used.
   
     
ByValByVal
      
可选。Optional. 指示按值传递参数。Indicates that the argument is passed by value.
   
     
ByRefByRef
      
可选。Optional. 指示按引用传递参数。Indicates that the argument is  passed by reference. 在 Visual Basic 中,ByRef 为默认值。ByRef is  the default in Visual Basic.
   
     
ParamArrayParamArray
      
可选。Optional. 仅用作_arglist_中的最后一个参数, 以指示 final 参数是可选Variant元素数组。Used only as the last argument  in arglist to indicate that the final argument is an Optionalarray of Variant elements. ParamArray 关键字允许您提供任意数目的参数。The ParamArray keyword allows you to  provide an arbitrary number of arguments. ParamArray  不能与 ByValByRefOptional  一起使用。ParamArray can't be used with ByVal,  ByRef, or Optional.
   
     
varnamevarname
      
必需。Required. 表示参数的变量的名称;遵循标准变量命名约定。Name of the variable representing the argument; follows  standard variable naming conventions.
   
     
typetype
      
可选。Optional. 传递给过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(当前不支持)、Date、String(仅可变长度)、Object、Variant 或特定对象类型。Data type of the argument passed to the procedure; may be Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal  (not currently supported), Date, String (variable-length only), Object, Variant, or  a specific object type. 如果参数不是 Optional,则还可以指定用户定义类型。If the parameter is not Optional, a user-defined type may also be specified.
   
     
默认defaultvalue
      
可选。Optional. 任意常量或常量表达式。Any constant or constant expression. 仅对 Optional 参数有效。Valid for Optional parameters only. 如果类型是一个 Object,则显式默认值只能为 NothingIf the type is an Object, an explicit default value can  only be Nothing.
   


备注Remarks



TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 11:16 | 显示全部楼层
本帖最后由 cui26896 于 2019-6-24 12:06 编辑

  
typetype
  
  
可选。Optional. 传递给过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(当前不支持)、Date、String(仅可变长度)、Object、Variant 或特定对象类型。Data type of the argument passed to the procedure; may be Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal  (not currently supported), Date, String (variable-length only), Object, Variant, or  a specific object type. 如果参数不是 Optional,则还可以指定用户定义类型。If the parameter is not Optional, a user-defined type may also be specified.
  
  
默认defaultvalue
  
  
可选。Optional. 任意常量或常量表达式。Any constant or constant expression. 仅对 Optional 参数有效。Valid for Optional parameters only. 如果类型是一个 Object,则显式默认值只能为 Nothing。If the type is an Object, an explicit default value can  only be Nothing.
  
备注Remarks
如果未使用publicPrivate或**Friend** 显式指定, 则默认情况下Sub过程是公共的。If not explicitly specified by using Public, Private,or Friend, Sub procedures arepublic by default.
如果未使用**Static** , 则不会在两个调用之间保留局部变量的值。If Staticisn't used, the value of local variables is not preserved between calls.
Friend 关键字只能用于类模块。The Friend keyword can onlybe used in class modules. 但是,项目的任何模块中的过程均可以访问 Friend 过程。However, Friend procedures can beaccessed by procedures in any module of a project. Friend过程既不会显示在其父类的类型库中,也不会成为稍后可绑定的 Friend 过程。A Friend procedure doesn't appear inthe type library of its parent class, nor can aFriend procedure be late bound.
Sub 过程可能是递归的;即,它们可调用自身来执行给定任务。Sub procedures can be recursive; that is, theycan call themselves to perform a given task. 但是,递归可能导致堆栈溢出。However, recursion can lead tostack overflow. Static 关键字通常不与递归 Sub 过程一起使用。The Static keyword usually is not usedwith recursive Sub procedures.
所有可执行代码必须在过程中。All executable code must be in procedures. 不能在另一个 SubFunctionProperty 过程中定义 Sub 过程。You can't define a Subprocedure inside another Sub, Function, or Propertyprocedure.
Exit Sub 关键字可导致立即退出 Sub 过程。The Exit Sub keywords cause animmediate exit from a Sub procedure. 程序将继续执行调用Sub 过程的语句后面的语句。Program execution continues withthe statement following the statement that called the Sub procedure. 任意数目的 Exit Sub 语句可出现在 Sub 过程中的任意位置。Any number of Exit Substatements can appear anywhere in a Sub procedure.
Function 过程一样,Sub 过程是一个单独的过程,可接受参数、执行一系列语句以及更改参数的值。Like a Function procedure,a Sub procedure is a separate procedure that can take arguments, performa series of statements, and change the value of its arguments. 但是,与可以返回值的 Function 过程不同的是,Sub 过程不能在表达式中使用。However, unlike a Functionprocedure, which returns a value, a Sub procedure can't be used in anexpression.
您可以使用后面跟有参数列表的过程名调用Sub过程。Youcall a Sub procedure by using the procedure name followed by theargument list. 有关如何调用Sub过程的具体信息, 请参阅**Call**语句。See the Call statement for specific information about howto call Sub procedures.
Sub 过程中使用的变量可分为两类:在过程中显式声明的变量和未显式声明的变量。Variables used in Sub procedures fallinto two categories: those that are explicitly declared within the procedureand those that are not. 在过程中显式声明的变量(使用 Dim 或等同项)始终是过程内的局部变量。Variables that are explicitlydeclared in a procedure (using Dim or the equivalent) are always localto the procedure. 在过程中使用但未显式声明的变量依然是局部变量,除非在过程外某些更高级别显式声明这些变量。Variables that are used but notexplicitly declared in a procedure are also local unless they are explicitlydeclared at some higher level outside the procedure.
过程可使用未在过程中显式声明的变量,但如果您在模块级别定义了使用相同名称的变量,则会发生命名冲突。A procedure can use a variable that is notexplicitly declared in the procedure, but a naming conflict can occur ifanything you defined at the module level hasthe same name. 如果您的过程引用使用与其他过程、常量或变量名称相同的未声明变量,则假定您的过程引用的是该模块级别的名称。If your procedure refers to anundeclared variable that has the same name as another procedure, constant orvariable, it is assumed that your procedure is referring to that module-levelname. 为了避免此类冲突,请显式声明变量。To avoid this kind of conflict, explicitlydeclare variables. 您可以使用 OptionExplicit 语句强制显式声明变量。You can use an Option Explicit statementto force explicit declaration of variables.
备注
不能使用 GoSubGoToReturn 进入或退出 Sub 过程。You can't use GoSub, GoTo,or Return to enter or exit a Sub procedure.
示例Example
此示例使用 Sub 语句定义构成 Sub 过程的主体的名称、参数和代码。This example uses the Sub statement to define the name,arguments, and code that form the body of a Sub procedure.
VB复制
' Sub procedure definition.
' Sub procedure with twoarguments.
Sub SubComputeArea(Length, TheWidth)
   Dim Area As Double ' Declare localvariable.
   If Length = 0 OrTheWidth = 0 Then
     ' If either argument = 0.
     Exit Sub' Exit Sub immediately.
   End If
   
  Area = Length * TheWidth ' Calculate area ofrectangle.
  Debug.Print Area ' Print Area to Debug window.
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 11:17 | 显示全部楼层
本帖最后由 cui26896 于 2019-6-24 12:07 编辑

按值
向过程传递参数的值而不传地址的方法。这允许过程访问变量的副本。 因此,变量的实际值不可由其传递到的过程更改。
按引用
向过程传递参数的地址而不传递值的方法。这允许过程访问实际变量。 因此,变量的实际值可由其传递到的过程更改。 除非另行指定,否则参数都按引用传递。
实参(这是微软给的定义,没有笼统的称为参数)
传递给过程的常量、变量或表达式。
过程
A named sequence of statements executed as a unit. Forexample, Function, Property, and Sub are types of procedures. A procedure nameis always defined at module level. All executable code must be contained in aprocedure. Procedures can't be nested within other procedures.
参考译文
一个被命名的一系列可执行陈述(也可以译作说明)单位。如Function, Property, 和 Sub的各种程序。一个程序的名称总是被定义为单元标准。程序不能嵌套在其他的程序中。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 11:20 | 显示全部楼层

Function 语句

声明构成Function 过程主体的名称、参数和代码。Declares the name, arguments, andcode that form the body of a Functionprocedure.

语法Syntax

[公共 | 私有 | 好友][静态]函数名称[( arglist )][ Astype ][Public | Private| Friend] [ Static ] Functionname [ ( arglist) ] [ Astype ]
[语句][ statements ]
[名称 = 表达式][ name=expression ]
[ Exit 函数][ Exit Function ]
[语句][ statements]
[名称 = 表达式][ name=expression]
End FunctionEnd Function


Function 语句的语法包含以下部分:The Function statementsyntax has these parts:

        
PartPart
         
说明Description
     
      
PublicPublic
      
可选。Optional. 指示 Function 过程可由所有模块中的所有其他过程访问。Indicates that the Function  procedure is accessible to all other procedures in all modules. 如果在包含 Option Private 的模块中使用,那么该过程不能在项目的外部使用。If used in a module that contains an Option Private, the  procedure is not available outside the project.
   
     
PrivatePrivate
      
可选。Optional. 指示 Function 过程仅能由声明它的模块中的其他过程访问。Indicates that the Function procedure is accessible only  to other procedures in the module where it is declared.
   
     
FriendFriend
      
可选。Optional. 仅在类模块中使用。Used only in a class  module. 指示 Function 过程在整个项目中可见,但是对于对象实例的控制器不可见。Indicates that the Function  procedure is visible throughout the project, but not visible to a controller  of an instance of an object.
   
     
StaticStatic
      
可选。Optional. 指示在两次调用之间保留 Function 过程的本地变量。Indicates that the Function  procedure's local variables are preserved  between calls. Static 属性不影响在 Function 外部声明的变量,即使在过程中使用它们也一样。The Static attribute  doesn't affect variables that are declared outside the Function, even  if they are used in the procedure.
   
     
namename
      
必需。Required. Function 的名称;遵循标准变量命名约定。Name of the Function; follows  standard variable naming conventions.
   
     
arglistarglist
      
可选。Optional. 代表调用 Function 过程时传递给该过程的参数的变量列表。List of variables representing arguments that are passed to the  Function procedure when it is called. 多个变量使用逗号分隔。Multiple variables are separated  by commas.
   
     
typetype
      
可选。Optional. Function过程返回的值的数据类型;可以是Byte、 Boolean、 Integer、 Long、  Currency、 Single、 Double、  Decimal (目前不支持)、 Date、 String (除固定长度)、对象、 Variant或 any用户定义类型。Data type of the value returned by the Function procedure;  may be Byte, Boolean,  Integer, Long,  Currency, Single,  Double, Decimal  (not currently supported), Date, String (except fixed length), Object, Variant, or  any user-defined type.
   
     
statementsstatements
      
可选。Optional. 任何一组要在 Function 过程中执行的语句。Any group of statements to be executed within the Function  procedure.
   
     
expressionexpression
      
可选。Optional. 返回 Function 的值。Return  value of the Function.
   

arglist 参数具有以下语法和组成部分:The arglist argument hasthe following syntax and parts:

[可选][ ByVal | ByRef][ ParamArray ]varname[()] [ As type ] [ = defaultvalue][ Optional ] [ ByVal | ByRef] [ ParamArray ] varname [ ( ) ] [ Astype ] [ =defaultvalue]


        
PartPart
         
说明Description
     
      
可选Optional
      
可选。Optional. 指示不需要参数。Indicates that an argument is not required. 如果使用, 则_arglist_中的所有后续参数也必须是可选的, 并且使用optional关键字声明。If used, all subsequent  arguments in arglist must also be optional and declared by using the Optional  keyword. 如果使用了 ParamArray,则不能将  Optional 用于任何参数。Optional can't be used for any argument  if ParamArray is used.
   
     
ByValByVal
      
可选。Optional. 指示按值传递参数。Indicates that the argument is passed by value.
   
     
ByRefByRef
      
可选。Optional. 指示按引用传递参数。Indicates that the argument is  passed by reference. 在 Visual Basic 中,ByRef 为默认值。ByRef is  the default in Visual Basic.
   
     
ParamArrayParamArray
      
可选。Optional. 仅用作 arglist 中的最后一个参数来指示最后的参数为 Variant 元素的 Optional 数组。Used  only as the last argument in arglist to indicate that the final  argument is an Optional array of Variant elements. ParamArray 关键字允许您提供任意数量的参数。The ParamArray keyword allows you to  provide an arbitrary number of arguments. 它无法用于  ByValByRefOptionalIt may not be used with ByVal,  ByRef, or Optional.
   

TA的精华主题

TA的得分主题

发表于 2019-6-24 11:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
其实没必要说这么复杂,两者总体上一致,唯一的、最大的区别是funciton可以有返回值!
简单的说:
    如果执行过程可能会出错,你需要知道执行情况的结果,那就用function,只有它才会将结果告诉你
   如果你确认所有过程都不会出错,不需要、不关注执行的情况,那就用sub
  除了主程序过程,建议其他用 function

当然,很多人会说 sub 也可以用返回值,是的,但那是 地址传参,不是真正意义上的返回值

TA的精华主题

TA的得分主题

发表于 2019-6-24 11:45 | 显示全部楼层
咱也看不懂,咱也不敢问
只知道 Function 编写公式用的,Sub 编写过程用的
标准不标准也不要紧,个人习惯,能达到目地就好
就如德国与印度电工,德国按过程做,印度按结果做

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 12:10 | 显示全部楼层

  
varnamevarname
  
  
必需。Required. 表示参数的变量的名称;遵循标准变量命名约定。Name of the variable representing the argument; follows  standard variable naming conventions.
  
  
typetype
  
  
可选。Optional. 传递给过程的参数的数据类型;可以是 ByteBooleanIntegerLongCurrencySingleDoubleDecimal(当前不受支持)、DateString(仅限可变长度)、ObjectVariant 或特定的对象类型。Data type of the argument passed to the procedure; may be Byte,  Boolean, Integer, Long, Currency, Single, Double,  Decimal (not currently supported) Date, String (variable  length only), Object, Variant, or a specific object type. 如果参数不是可选的,则还可以指定用户定义的类型。If the parameter is not Optional,  a user-defined type may also be specified.
  
  
默认defaultvalue
  
  
可选。Optional. 任何常量或常量表达式。Any constant  or constant expression. 仅对 Optional 参数有效。Valid for Optional parameters only. 如果类型是一个 Object,则显式默认值只能为 NothingIf the type is an Object, an explicit default value can  only be Nothing.
  

备注Remarks

如果未使用publicPrivate或**Friend** 显式指定, 则默认情况下Function过程是公共的。If not explicitly specified by using Public, Private,or Friend, Function proceduresare public by default.

如果未使用**Static** , 则不会在两个调用之间保留局部变量的值。If Staticisn't used, the value of local variables is not preserved between calls.

Friend 关键字只能用于类模块。The Friend keyword can onlybe used in class modules. 但是, Friend 过程可以由项目的任何模块中的过程访问。However, Friend procedurescan be accessed by procedures in any module of a project. 友元过程不会显示在其父类的类型库中, 也不能是晚期绑定的友元过程。A Friend procedure does not appear in the type library of its parent class, nor can a Friendprocedure be late bound.

Function 过程可以递归;即,它们可以自我调用以执行指定的任务。Function procedures can be recursive; thatis, they can call themselves to perform a given task. 但是递归可能会导致堆栈溢出。However, recursion can lead tostack overflow. Static 关键字通常不与递归 Function 过程配合使用。The Static keyword usually isn't usedwith recursive Function procedures.

所有可执行代码必须位于过程中。All executable code must be inprocedures. 不能在另一个functionSubProperty过程中定义Function过程。You can't define a Functionprocedure inside another Function, Sub,or Property procedure.

Exit 函数 语句导致立即从Function过程中退出。The Exit Functionstatement causes an immediate exit from a Function procedure. 程序将继续执行已调用 Function 过程的语句后面的语句。Program execution continues with the statement following the statementthat called the Function procedure. 任何数量的Exit Function 语句可以出现在 Function 过程中的任何位置。Any number of Exit Functionstatements can appear anywhere in a Function procedure.

Sub 过程一样,Function 过程是一个单独的过程,它可以获取参数、执行一系列语句和更改其参数的值。Like a Sub procedure, a Functionprocedure is a separate procedure that can take arguments, perform a series ofstatements, and change the values of its arguments. 但是,与Sub 过程不同,当您希望使用函数返回的值时,可以在表达式的右侧使用 Function 过程,就像使用任何固有函数(例如 SqrCosChr)一样。However, unlike a Subprocedure, you can use a Function procedure on the right side of an expression in the same way you use any intrinsicfunction, such as Sqr, Cos, or Chr, when you want to usethe value returned by the function.

您可以使用函数名称, 后跟括号中的参数列表, 在表达式中调用function过程。You call a Function procedure by using the function name,followed by the argument list in parentheses, in an expression. 有关如何调用Function过程的具体信息, 请参阅**Call**语句。See the Call statement for specific information about howto call Function procedures.

要从函数返回值,请为函数名称赋值。To return a value from a function,assign the value to the function name. 任意数量的此类赋值可以出现在过程中的任意位置。Any number of such assignments canappear anywhere within the procedure. 如果未对_名称_进行赋值,该过程将返回一个默认值:数字函数返回 0,字符串函数返回零长度的字符串 (""),Variant 函数返回 Empty。If no value is assigned to name, the procedure returns adefault value: a numeric function returns 0, a string function returns azero-length string (""), and a Variant function returns Empty. 如果在 Function 内没有为_名称_指定对象引用(使用 Set),那么返回对象引用的函数将返回NothingA function that returns an object reference returns Nothingif no object reference is assigned to name (using Set) within theFunction.

下面的示例演示如何向函数分配返回值。The following example shows how toassign a return value to a function. 在这种情况下,将为名称赋予False 以指示找不到某个值。In this case, False isassigned to the name to indicate that some value was not found.


Function BinarySearch(. . .) As Boolean

'. . .

' Value not found. Return a value of False.

If lower > upper Then

BinarySearch = False

  Exit Function

End If

'. . .

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 12:13 | 显示全部楼层

End Function

Function 过程中使用的变量分为两类:一类在过程中显式声明,另一类则不是。Variables used in Functionprocedures fall into two categories: those that are explicitly declared withinthe procedure and those that are not.

过程中显式声明(使用 Dim 或等效语句)的变量始终是该过程的局部变量。Variables that are explicitlydeclared in a procedure (using Dim or the equivalent) are always localto the procedure. 在过程中使用但未显式声明的变量依然是局部变量,除非在过程外某些更高级别显式声明这些变量。Variables that are used but notexplicitly declared in a procedure are also local unless they are explicitlydeclared at some higher level outside the procedure.

过程可以使用未在过程中显式声明的变量,但如果在模块级别定义的任何内容具有相同的名称,则会发生命名冲突。A procedure can use a variable that is notexplicitly declared in the procedure, but a naming conflict can occur ifanything you defined at the module level hasthe same name. 如果过程引用与其他过程、常量或变量具有相同名称的未声明变量,则假定该过程引用该模块级别名称。If your procedure refers to anundeclared variable that has the same name as another procedure, constant, orvariable, it is assumed that your procedure refers to that module-level name. 显示声明变量可避免此类型的冲突。Explicitly declare variables to avoid this kind of conflict. 可以使用**Optionexplicit** 语句强制显式声明变量。You can use an Option Explicitstatement to force explicit declaration of variables.

Visual Basic 可以重新安排算术表达式以提高内部效率。Visual Basic may rearrange arithmeticexpressions to increase internal efficiency. 当函数更改相同表达式中变量的值时,应避免在算术表达式中使用Function 过程。Avoid using a Functionprocedure in an arithmetic expression when the function changes the value ofvariables in the same expression. 有关算术运算符的详细信息, 请参阅运算符。Formore information about arithmetic operators, see Operators.

示例Example

此示例使用 Function 语句声明组成 Function 过程主体的名称、参数和代码。This example uses the Functionstatement to declare the name, arguments, and code that form the body of a Functionprocedure. 上一个示例使用初始化的硬类型 Optional 参数。Thelast example uses hard-typed, initialized Optional arguments.


' The following user-definedfunction returns the square root of the

' argument passed to it.

Function CalculateSquareRoot(NumberArg As Double) As Double

If NumberArg < 0 Then' Evaluate argument.

  Exit Function ' Exit to calling procedure.

Else

CalculateSquareRoot = Sqr(NumberArg) ' Returnsquare root.

End If

End Function


使用 ParamArray 关键字允许函数接受可变数量的参数。Using the ParamArray keyword enables a function to accepta variable number of arguments. 在以下定义中, 它通过值传递。Inthe following definition, it is passed by value.

Function CalcSum(ByValFirstArg As Integer,ParamArray OtherArgs())

Dim ReturnValue

' If the function is invoked asfollows:

ReturnValue = CalcSum(4, 3, 2, 1)

' Local variables are assignedthe following values: FirstArg = 4,

' OtherArgs(1) = 3,OtherArgs(2) = 2, and so on, assuming default

' lower bound for arrays = 1.



Optional 参数具有默认值和类型,而不是 VariantOptional arguments can have default values and types other than Variant.

VB复制

' If a function's arguments aredefined as follows:

Function MyFunc(MyStr AsString,OptionalMyArg1 As _

Integer = 5,OptionalMyArg2 = "Dolly")

Dim RetVal

' The function can be invokedas follows:

RetVal = MyFunc("Hello",2, "World") ' All 3 arguments supplied.

RetVal = MyFunc("Test",, 5) ' Second argument omitted.

' Arguments one and three usingnamed-arguments.

RetVal = MyFunc(MyStr:="Hello ", MyArg1:=7)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 12:36 | 显示全部楼层
了解命名参数和可选参数

当您调用**Sub** 或**Function** 过程时, 您可以按它们出现在过程定义中的顺序提供参数按位置, 也可以按名称提供参数, 而无需考虑位置。

例如, 以下Sub过程采用三个参数。


Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)
Debug.Print strName, intAge, dteBirth
End Sub





您可以通过在正确位置 (每个参数都以逗号分隔) 来调用此过程,如下面的示例所示。

VB 复制

PassArgs "Mary", 29, #2-21-69#





您也可以通过提供命名参数来调用此过程,每个参数之间用逗号隔开。

VB 复制

PassArgs intAge:=29,dteBirth:=#2/21/69#,strName:="Mary"





命名参数由参数名称后跟一个冒号和一个等号 (:=) 然后是参数值组成。

当您调用具有可选参数的过程时,命名参数尤其有用。如果使用命名参数,则不必包括逗号来指示缺失位置的参数。 使用命名参数更便于跟踪传递的参数和省略的参数。

可选参数在过程定义中以可选关键字开头。 您也可以在过程定义中为可选参数指定一个默认值。 例如:

  

Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")
. . .
End Sub





当您使用可选参数调用过程时,可以选择是否指定可选参数。如果不指定可选参数,则会使用默认值(如果有)。 如果未指定默认值, 则参数将为指定类型的任何变量。

下面的过程包含两个可选参数, varRegion即varCountry和变量。 IsMissing 函数确定是否已将可选的 Variant 参数传递给该过程。

  

Sub OptionalArgs(strState As String, Optional varRegion As Variant, _
Optional varCountry As Variant = "USA")
If IsMissing(varRegion) And IsMissing(varCountry) Then
Debug.Print strState
ElseIf IsMissing(varCountry) Then
Debug.Print strState, varRegion
ElseIf IsMissing(varRegion) Then
Debug.Print strState, varCountry
Else
Debug.Print strState, varRegion, varCountry
End If
End Sub





可以使用命名参数来调用此过程, 如下面的示例所示。

  

OptionalArgs varCountry:="USA", strState:="MD"

OptionalArgs strState:= "MD", varRegion:=5


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-24 12:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cui26896 于 2019-6-24 13:20 编辑

Call 语句

将控制转移到**Sub** 过程、 Function 过程或动态链接库 (DLL)过程。Transfers control to a Subprocedure, Function procedure, or dynamic-linklibrary (DLL) procedure.

语法Syntax

[ Call ]名称[ argumentlist ][ Call ] name [ argumentlist]


Call 语句语法具有下列部分:The Call statement syntaxhas these parts:

[td]  
   
PartPart
   
   
说明Description
   
  
CallCall
  
  
可选;关键字。Optional; keyword. 如果指定,则必须将_ argumentlist_ 用括号括起。If specified, you must enclose argumentlist  in parentheses.
  
  例如:Call MyProc(0)
For example: Call  MyProc(0)
  
  
namename
  
  
必需。Required. 要调用的过程的名称。Name of the procedure to call.
  
  
argumentlistargumentlist
  
  
可选。Optional. 要传递到过程的变量、数组或表达式的以逗号分隔的列表。Comma-delimited list of variables, arrays,  or expressions to pass to the procedure. argumentlist 的组件可能包含关键字 ByValByRef,这两个关键字介绍调用过程如何对待参数。Components of argumentlist may include the keywords ByVal  or ByRef to describe how the arguments  are treated by the called procedure.
  
  但是,ByValByRef 仅当调用 DLL  过程时才能与 Call 一起使用。However, ByVal and ByRef  can be used with Call only when calling a DLL procedure. 在 Macintosh 上,ByValByRef 可在发出对 Macintosh 代码资源的调用时与 Call 一起使用。
On  the Macintosh, ByVal and ByRef can be used with Call  when making a call to a Macintosh code resource.
  

备注Remarks

调用过程时无需使用 Call 关键字。You are not required to use the Callkeyword when calling a procedure. 但是,如果使用 Call 关键字调用需要参数的过程,则 argumentlist 必须以括号结尾。However, if you use the Callkeyword to call a procedure that requires arguments, argumentlist mustbe enclosed in parentheses. 如果您省略 Call 关键字,则还必须省略 argumentlist 周围的括号。If you omit the Callkeyword, you also must omit the parentheses around argumentlist. 如果使用 Call 语法调用任何内部或用户定义的函数,则将丢弃该函数的返回值。If you use either Callsyntax to call any intrinsic or user-defined function, the function's returnvalue is discarded.

若要将整个数组传递到过程,请使用后跟空括号的数组名称。To pass a whole array to aprocedure, use the array name followed by empty parentheses.

示例Example

本示例演示如何使用Call语句将控制转移到Sub过程、内部函数和动态链接库 (DLL) 过程。Thisexample illustrates how the Call statement is used to transfer controlto a Sub procedure, an intrinsic function, and a dynamic-link library(DLL) procedure. 在 Macintosh 上不使用 Dll。DLLsare not used on the Macintosh.

VB复制

' Call a Sub procedure.

Call PrintToDebugWindow("HelloWorld")     

' The above statement causes control to bepassed to the following

' Sub procedure.

Sub PrintToDebugWindow(AnyString)

    Debug.PrintAnyString    'Print to the Immediate window.

End Sub


' Call an intrinsic function. The returnvalue of the function is

' discarded.

Call Shell(AppName, 1)   ' AppName contains the path of the  

        ' executable file.


' Call a Microsoft Windows DLL procedure.The Declare statement must be  

' Private in a Class Module, but not in astandard Module.

Private Declare Sub MessageBeep Lib"User" (ByValN As Integer)

Sub CallMyDll()

    Call MessageBeep(0)    ' Call WindowsDLL procedure.

    MessageBeep0    ' Callagain without Call keyword.

End Sub

另请参阅See also

·        数据类型Data types

·        语句



语句



语法完整的单元,表示一种操作、声明或定义。语句通常占用一行,但可以使用冒号 (:) 在一行中包含多个语句。 还可以使用行继续符 (_) 将单个逻辑行继续到第二个物理行。

为什么老手们都在用:,或者_ ,因为官方的标准中做出了这种规定。就法律,是合法的。



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 01:46 , Processed in 0.047097 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表