2014-09-28 70 views
0

我以Excel中的VB開始;到目前爲止,我無法理解以下內容; 我有以下功能:Excel:Visual Basic:作爲函數輸入的範圍不起作用

Function testGetRange(myRange As Range) 
    Dim weekStart As Integer 
    Dim weekEnd As Integer 

    weekStart = myRange(1).Value 
    weekEnd = myRange(2).Value 
End Function 

如果我嘗試這樣執行它:

Sub CreationRapport() 
    Dim testRange1 As Range 
    Set testRange1 = Range("A5:B5") 

    testGetRange (testRange1) 
End Sub 

我有一個像「對象需要」錯誤(遺憾的錯誤消息是在法語:「objet requis」),當我嘗試執行該功能時停止。

因此:範圍被創建,函數將範圍作爲輸入;不知道爲什麼,這並不工作...

+1

函數通常會在最後返回一些東西,比如:'testGetRange = ...'。我使用「...」,因爲我無法說出你想要它返回或做什麼。也許你只需要一個Sub來執行一個動作。知道你想要發生什麼會很有幫助。 – 2014-09-28 16:29:03

+0

testGetRange(myRange As Range)As String [...] testGetRange = weekStart不會改變事物:/ – benichka 2014-09-28 17:34:39

+0

請閱讀有關VBA函數和子集的一些基本資料。另外,正如我所建議的那樣,告訴我們你希望發生的事情真的會有所幫助。否則,我們必須猜測。 – 2014-09-28 19:09:16

回答

2

要調用函數和括號表明您希望函數返回的東西:

testGetRange (testRange1) 

但你的函數不返回任何東西。您可以通過將此添加到testGetRange來解決此問題:

testGetRange ="My return output" 

...而且您不會將輸出放在任何地方。您可以通過改變CreationRapport解決這個問題:

MyOutput = testGetRange (testRange1) 
msgbox MyOutput 
+0

您的最後一部分是答案:MyOutput = testGetRange(testRange1)',初始化MyOutput後,使其工作。另外,設置'weekStart'和'weekEnd'時出錯。將在下面發佈我的解決方案:)謝謝! – benichka 2014-09-28 20:24:22

1

當你調用一個函數,但不想你需要要麼離開關括號

Sub CreationRapport() 
    Dim testRange1 As Range 
    Set testRange1 = Range("A5:B5") 

    testGetRange testRange1 
End Sub 

或使用調用的返回值

Sub CreationRapport() 
    Dim testRange1 As Range 
    Set testRange1 = Range("A5:B5") 

    Call testGetRange (testRange1) 
End Sub 

對於爲什麼你可以看到VBA如何處理控制轉移到一個子或函數here on MSDN

您在調用過程時不需要使用Call關鍵字。 但是,如果使用Call關鍵字調用需要 參數的過程,則參數列表必須括在圓括號中。如果使用 或者調用語法來調用任何內部函數或用戶定義的函數,則函數的返回值將被丟棄。

+0

感謝您的提示! – benichka 2014-09-28 20:21:06

0

OK,所以測試不同的答案後,這個工作:

Function testGetRange(myRange As Range) As String 
    Dim weekStart As String 
    Dim weekEnd As String 

    weekStart = myRange(1) 
    weekEnd = myRange(2) 

    testGetRange = weekStart 
End Function 

和副:

Sub CreationRapport() 
    Dim myOutput As String 
    Dim testRange1 As Range 
    Set testRange1 = Range("A5:B5") 

    myOutput = testGetRange(testRange1) 
    MsgBox myOutput 
End Sub 

的MSGBOX是不是強制性的,但部分myOutput = testGetRange(testRange1)是! 因此,正如Doug所建議的那樣,需要更多地瞭解VB,看看它爲什麼如此。謝謝大家:)