Vba 以这四种不同的方式输入参数有什么区别?

Vba 以这四种不同的方式输入参数有什么区别?,vba,Vba,我经常看到以四种不同的方式添加VBA参数: wks.Cells.Find(“*”,xlByRows,xlPrevious)-包含以逗号分隔的值的括号 vls.添加vl-后跟值的空间 copyRange.Copy Destination:=单元格(countD,2)-空格后跟标签、特殊符号:=和值 查找(查找:=“*”)-包含标签、特殊符号:=和值的括号 因此,似乎存在以下维度: 括号与否 标签:=值或值 我可以随时使用任何方法吗?当括号是否比其他括号更合适时,括号是vb惯例,如果要从函数

我经常看到以四种不同的方式添加VBA参数:

  • wks.Cells.Find(“*”,xlByRows,xlPrevious)-包含以逗号分隔的值的括号
  • vls.添加vl-后跟值的空间
  • copyRange.Copy Destination:=单元格(countD,2)-空格后跟标签、特殊符号:=和值
  • 查找(查找:=“*”)-包含标签、特殊符号:=和值的括号
因此,似乎存在以下维度:

  • 括号与否
  • 标签:=值或值

我可以随时使用任何方法吗?当括号是否比其他括号更合适时,括号是vb惯例,如果要从函数中获取返回值,则必须提供括号,如果对返回值不感兴趣,则必须省略括号

:=允许您以与声明参数的顺序不同的顺序指定参数

Sub Test()

    TestParams "hello", "there" ' not capturing the return value - no parenthesis

    r = TestParams("hello", "there") ' reading the return value - parenthesis needed

    TestParams w:="there", v:="hello" ' := supply the parameters in a different order

    r2 = TestParams(w:="there", v:="hello") ' := and () to supply the parameters in different order and get the return value


End Sub


Public Function TestParams(v As String, w As String)

    MsgBox v & " " & w

    TestParams = "ok" & " " & v & " " & w

End Function
括号与否

通常在下列情况下使用括号:

1) 将结果分配给变量:

正确:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))
不正确:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))
2) 做一些有结果的事情:

3) 与
调用一起使用
关键字:

正确:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))
不正确:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))

在下列情况下不使用括号:

1) 调用任何方法而不将结果分配给变量,或对结果执行操作,或使用
Call
关键字:

正确:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))
不正确:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))

标签:=值或值

此功能称为命名参数,非常方便

使用命名参数的函数调用与常规函数调用的不同之处在于,通过将每个值与参数名关联来传递值,而不是提供有序的值列表

当调用具有可选参数的过程时,命名参数特别有用。如果使用命名参数,则不必包含逗号来表示缺少的位置参数。使用命名参数可以更容易地跟踪传递的参数和省略的参数。看更多

例如,
Find
方法有9个参数(1个必需参数和8个可选参数),如果要指定
7th
参数,有两个选项:

选项1:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))
使用其顺序进行设置:

当您看到上面第行中的代码时,很难理解
True
的含义,因为您应该计算此参数的位置并查看详细信息

选项2:

Set rng = wks.Cells.Find("*", , , , xlByRows, xlPrevious)
Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy (Destination:=Range("C1"))
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy Destination:=Range("C1")
Call Range("A1:A5").Copy Destination:=Range("C1")
Range("A1:A5").Copy(Destination:=Range("C1"))
使用命名参数设置它:

Set rng = wks.Cells.Find(MatchCase:=True, What:="*")
这使您的代码更具可读性

此外,使用命名参数时,可以更改参数的顺序:

Set rng = wks.Cells.Find(MatchCase:=True, What:="*")

为什么使用:=而不是=?命名参数,还有一点值得一提的是,变量何时通过val传递,何时通过ref传递。不过,大多数语法只是偏好问题