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 

一般情况下,最好在函数原型中明确 – 指定是否需要byValbyRef ,如果调用程序出错,则会向编译器发出警告。 有关VBA隐藏function的更多信息

如果在这之后,你至less还有点困惑,或者至less对微软感到恼火,那你就没有注意到了。

后来 Rory指出,可以调用函数而不用分配它们的返回值。 所以你可以有

 X = myFunc(y) 

要么

 myFunc y 

两者都会调用函数 – 但请注意,如果不期望返回值,则不要使用括号。 哦,微软,你在想什么?