Excel Visual Basic调用函数作为独立例程

时间:2014-07-01 23:06:53

标签: excel vba excel-vba

我会直言不讳;我正在尝试在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中已经定义了一个输出,因此单元格不需要“等于”该函数的输出。

如果有人有任何意见,我们将不胜感激。

感谢。

1 个答案:

答案 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

一般来说,最好在函数原型中明确指定 - 指定是否需要byValbyRef,如果调用程序出错,则会得到编译器的警告。有关详情,请访问Hidden features of VBA

如果你在此之后至少对微软感到困惑或者至少对此感到恼火,那么你就没有注意了......

后记 Rory指出,可以在不指定返回值的情况下调用函数。所以你可以拥有

X = myFunc(y)

或者

myFunc y

两者都会调用该函数 - 但请注意,当您不期望返回值时,不要使用括号。哦,微软,你在想什么......