我会直言不讳;我正在尝试在Visual Basic中定义一个函数,可以简单地调用它而不必在“等式的另一边”上有一些东西。基本上我希望能够定义一个例程,该例程可以传递一系列变量并根据这些变量执行例程。
我目前定义了以下功能:
Function ImportData(WebAddress As String, OutputCell As Range)
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;" & WebAddress & _
"bin/excelget.exe?TICKER=msft", _
Destination:=OutputCell)
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:=False
.SaveData = True
End With
End Function
我希望能够做的只是调用此函数,但不一定要使某些东西等于或使用此函数来操作某些东西。因此,举例来说,我希望能够做到以下几点:
Private Sub ExampleButton_Click()
ImportData("http://www.exampleURL.com/examplejsonhtmlformat","A3")
End Sub
调用此函数时,它只是使用定义的变量逐步执行函数。 OutputCell中已经定义了一个输出,因此单元格不需要“等于”该函数的输出。
如果有人有任何意见,我们将不胜感激。
感谢。
答案 0 :(得分:4)
您希望将其设为Sub
- 这正是您所描述的:可以调用但不返回值的代码。请注意,调用时不要将sub的参数放在括号中。如果你有
Sub myTest(a,b)
然后用
调用它myTest thing1, thing2
而不是
myTest(thing1, thing2)
根据@hnk和@Ioannis的优秀评论更新:
可以使用
调用Sub
Call myTest(thing1, thing2)
但是有一个微妙之处,它与通过值或引用传递变量之间的区别有关。传递值时,您可以复制:更改程序中的参数不会更改原始值。但是,当您通过引用传递时,可以更改子内部参数的值,并在子返回后成为参数的新值。我原型说您希望通过引用传递值:
Sub MyTest(ByRef a)
然后您可以按如下方式覆盖此行为:
Call with Passing by
MyTest a Reference
MyTest (a) Value
Call MyTest(a) Reference
Call MyTest((a)) Value
一般来说,最好在函数原型中明确指定 - 指定是否需要byVal
或byRef
,如果调用程序出错,则会得到编译器的警告。有关详情,请访问Hidden features of VBA
如果你在此之后至少对微软感到困惑或者至少对此感到恼火,那么你就没有注意了......
后记 Rory指出,可以在不指定返回值的情况下调用函数。所以你可以拥有
X = myFunc(y)
或者
myFunc y
两者都会调用该函数 - 但请注意,当您不期望返回值时,不要使用括号。哦,微软,你在想什么......