Excel Visual Basic调用函数作为独立的例程
我会直指点; 我试图在Visual Basic中定义一个函数,可以简单地调用它,而不必像在“方程的另一边”那样有东西。 本质上,我希望能够定义一个可以传递一系列variables的例程,并根据这些variables执行一个例程。
我目前有以下function定义:
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
当这个函数被调用时,它使用定义的variables简单地遍历函数。 在OutputCell中已经定义了一个输出,所以一个单元不需要“等于”这个函数的输出。
如果有人有任何意见,将不胜感激。
谢谢。
你想使它成为一个Sub
– 它正是你所描述的:可以调用但不返回值的代码。 请注意,在调用它时,不要将子参数放在括号内。 如果你有
Sub myTest(a,b)
然后你用它来打电话
myTest thing1, thing2
而不是与
myTest(thing1, thing2)
根据来自@hnk和@Ioannis的精彩评论进行更新 :
有可能调用一个Sub
Call myTest(thing1, thing2)
但有一个微妙之处,就是与通过价值或参照传递variables之间的差异。 当您按值传递时,您将复制:在程序中更改参数不会更改原始内容。 但是,当通过引用传递时,可以更改子内部参数的值,并且在子返回后成为参数的新值。 我原型说你期望的价值是通过引用传递:
Sub MyTest(ByRef a)
然后,您可以覆盖此行为,如下所示:
Call with Passing by MyTest a Reference MyTest (a) Value Call MyTest(a) Reference Call MyTest((a)) Value
一般情况下,最好在函数原型中明确 – 指定是否需要byVal
或byRef
,如果调用程序出错,则会向编译器发出警告。 有关VBA隐藏function的更多信息
如果在这之后,你至less还有点困惑,或者至less对微软感到恼火,那你就没有注意到了。
后来 Rory指出,可以调用函数而不用分配它们的返回值。 所以你可以有
X = myFunc(y)
要么
myFunc y
两者都会调用函数 – 但请注意,如果不期望返回值,则不要使用括号。 哦,微软,你在想什么?