2014-07-01 95 views
1

我會直接指出這一點;我試圖在Visual Basic中定義一個函數,這個函數可以簡單地調用,而不必像原來那樣在'方程的另一邊'有東西。本質上,我希望能夠定義一個可以傳遞一系列變量並根據這些變量執行例程的例程。作爲獨立程序的Excel 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 myTest(a,b) 

然後你

myTest thing1, thing2 

,而不是與

myTest(thing1, thing2) 

更新稱之爲基於來自@hnk和@Ioannis很好的意見:

p ossible調用Sub

Call myTest(thing1, thing2) 

但是有一個微妙,其具有由或通過參考與傳遞變量之間的差有關。當您按值傳遞時,您將製作副本:更改程序中的參數不會更改原始內容。但是,當您通過引用傳遞時,可以更改子內參數的值,並且在子返回後變爲參數的新值。我的原型說你所期望的價值要通過引用傳遞:

Call with     Passing by 
MyTest a     Reference 
MyTest (a)    Value 
Call MyTest(a)   Reference 
Call MyTest((a))   Value 

一般來說,最好是在功能明確:

Sub MyTest(ByRef a) 

然後你可以如下重寫此行爲原型 - 指定是否需要byValbyRef,如果調用程序出錯,則會向編譯器發出警告。更多的信息在Hidden features of VBA

如果你沒有至少有點困惑,或者至少在這之後微軟惱火,你沒有注意...

後記 Rory指出,可以在不指定返回值的情況下調用函數。所以,你可以有

X = myFunc(y) 

或者

myFunc y 

雙方將調用函數 - 但請注意,當你不希望返回值,你不要用括號括。哦,微軟,你在想什麼......

+0

實際上,如果你不喜歡'myTest thing1,thing2'風格,你也可以把它寫成'調用mytest(thing1,thing2)'。無論哪種方式,+1爲答案 – hnk

+1

@hnk除了樣式,'myTest thing1,thing2'通過引用傳遞參數,'myTest(thing1,thing2)'通過值傳遞參數。它在[這裏]討論(http://stackoverflow.com/questions/1070863/hidden-features-of-vba/1070942#1070942)。 – Ioannis

+0

好點。 Call的默認值會變成按值傳遞。 Tks糾正。 – hnk