使用可选参数VBA调用方法

问题描述:

我想通了,设置可选参数,需要“呼”的方法盈。使用可选参数VBA调用方法

Public Sub Test() 

    Call abc("aaa") 
    Call abc("aaa", 2) 

    abc("aaa") ' is fine 
    abc("aaa", 2) ' is a syntax error 

End Sub 


Function abc(a As String, Optional iCol As Long = 3) 

    MsgBox (iCol) 

End Function 

您可以添加“为什么这有意义吗?”我的新信息?

问候, 彼得

编辑:PS比简化问题没有其他使用功能ABC。

+0

大约有当一些很好的例子和解释'Call' * can *和* can not * below below but but the fact is:**实际上没有理由使用它** - 与[一个小例外](http://*.com/questions/2573597 /应-I-使用叩关键字在-VB-VBA#comment19036905_2573597)。所以请避免直到完全有必要。 – CallumDA

文档

Call是一个可选的关键字,但是一个需要注意的是,如果你使用它,你必须包括在围绕参数的括号,但如果你忽略它,你必须不包括括号。从MSDN

报价:

您不需要调用过程时使用Call关键字。

但是,如果使用Call关键字调用要求参数的过程,参数列表必须用括号括起来。如果您省略了Call关键字,则还必须省略参数列表的括号。如果使用Call语法来调用任何内部或用户定义的函数,则函数的返回值将被丢弃。

要传递一个整个阵列的过程,使用数组名后跟空括号。

链接:https://msdn.microsoft.com/en-us/library/office/gg251710.aspx


在实践

这意味着下面的语法被允许:

Call abc("aaa") 
Call abc("aaa", 2) 
abc "aaa", 2 
abc("aaa") ' <- Parantheses here do not create an argument list 
abc(((("aaa")))) ' <- Parantheses here do not create an argument list 

以下语法是不允许的:

Call abc "aaa", 2 
abc("aaa", 2) ' <- Parantheses here create an argument list 

函数的返回值

使用功能时得到一个返回值,如果你这样做,你需要括号以下这不生效,例如:

Function abc(a As String, Optional iCol As Long = 3) 
    abc = iCol 
End Function 

'## IMMEDIATE WINDOW ## 
?abc("aaa", 2)  'this works 
?abc "aaa, 2  'this will not work 
?Call abc "aaa", 2 'this will not work 
?Call abc("aaa", 2) 'this will not work 

如果你在一个Function使用Call然后再考虑将其更改为一个Sub相反,功能是为了返回一个值,如上面的情况。

像这样的工作:

Option Explicit 

Public Sub Test() 

    Dim strText As String 

    strText = "E" 
    Call Abc(strText, 3) 
    Call Abc(strText, 2) 

    Abc (strText) 
' Abc (strtext,5) 

    Abc strText, 2 
    Abc strText 


End Sub 

Public Sub Abc(strText As String, Optional iCol As Long = 5) 

    Debug.Print iCol 

End Sub 

完全不知道为什么注释掉的代码不工作...

Call是一个可选的关键字,如已经在详细的答案,如上所述。

你的第二个选项

abc("aaa", 2) ' is a syntax error 

只需使用:

abc "aaa", 2 

注意:很少有使用有Function如果不返回任何东西,你可以请改为使用常规Sub

Function返回例如(只是一些虚构的快)一String

Function abc(a As String, Optional iCol As Long = 3) As String      
    abc = a & CStr(iCol)   
End Function 

然后调用它:

Public Sub Test() 

    d = abc("aaa", 2) 
    MsgBox d 

End Sub 
+0

但为什么'abc(“aaa”)'有效? – Vityata

+0

因为当只有一个值时,遗留物不会做任何事情,它不会创建一个参数列表,它将内部的内容封装到一个值中。为了演示,这也将起作用:'(((((“aaa”)))))' – BenShelton