2017-01-05 95 views
3

這個問題是根據我最後一個問題構建的,主要是因爲我想避免使用全局變量,因爲它的侷限性。請參閱此處鏈接的答案:How do I call upon an array created by a different function?將第一個函數中創建的數組傳遞給第二個函數

我正嘗試使用從另一個用戶定義函數中的用戶定義函數創建的數組。我想避免將數組設置爲Global,因爲第二個函數不會自動重新計算。對於這個練習,我有兩個獨立的功能。

第一個函數將根據範圍輸入創建一個數組並對這些數值求和。

第二個函數將調用在第一個函數中創建的數組,並將值與第二個範圍輸入相加。請參閱以下代碼。

  Option Explicit 
      Function first_funct(list_1 As range) As Double 
       Dim extent As Integer, i As Integer 
       extent = list_1.rows.Count 
       Dim main_array() As Variant 
       ReDim main_array(1 To extent) As Variant 
       ' main_array() was changed from double to variant to avoid potential problems. 
       first_funct = 0 

       For i = 1 To extent 
        main_array(i) = list_1(i).Value 
        ' main_array will be used again in second function 
        first_funct = first_funct + main_array(i) 
       Next i 

       Call second_funct(main_array) 

      End Function 

      Function second_funct(list_2 As range, ByRef main_array() As Variant) As Double 
       Dim extent As Integer, i As Integer 
       extent = list_2.rows.Count 
       ' Assume the extent of list_2 is equal to extent of list_1 in first function. 
       Dim main_array() As Variant 
       ReDim main_main_array(1 To extent) As Variant 
       second_funct = 0 

       For i = 1 To extent 
        second_funct = second_funct + main_array(i) + list_2(i).Value 
        ' How do I call upon main_array created from list_1 in the first function? 
       Next i 

      End Function 

第一個函數給我錯誤「ByRef參數類型不匹配」。我的想法是,調用語句會將數組傳遞給第二個函數,而ByRef語句會將其選中。我現在也不確定第二個函數是否正確,因爲第一個函數給了我錯誤。

在此先感謝。

+0

我幾乎總是使用簡單的'Variant'變量都陣列輸入和輸出數組,幾乎從來沒有一個問題。數組實際上由指針和變體傳遞,自動處理隱式指針。無論如何 - 聲明'main_array'的方式和位置(不僅限於在哪裏重新定義)?希望它被宣佈在某個地方。如果不是 - 它是一個變量變量(並且你沒有使用Option Explicit),這會導致類型不匹配。 –

+0

哎呀忘了包含'選項顯式'。我跟着你的其他建議,我仍然得到同樣的錯誤。 – Soto

回答

1

你的數組都是用強類型聲明的,而且你以正確的方式傳遞它們。你的問題不在於數組的類型,而在於順序,或者是對第二個函數的參數省略。

second_funct函數需要2個參數list_2 As Range, ByRef main_array() As Double,但是你只提供一個參數:

Call second_funct(main_array) 

假設你的意思是通過一系列數組,嘗試改變,爲:

Call second_funct(list_1, main_array) 

或者更好的是,除去Call語句,只需使用:

second_funct list_1, main_array 
+0

我認爲使用first_funct中的'list_1'使它傳遞給second_funct中的'list_2',這不是我想要做的。我想讓它可以在不使用'list_1'的情況下使用新的範圍輸入,但要保持'main_array'的值。 – Soto

+0

當然,但我不知道你的其他範圍引用來自哪裏,所以你需要將它作爲參數添加到'Function first_funct(list_1 As range,list_2 As range)',然後在'first_funct'調用中'second_funct list_2,main_array' – ThunderFrame

0

函數和子程序在使用時應該是正確的。代碼

Call second_funct(main_array) 

在傳遞main_array時有錯誤,而second_funct中的定義需要範圍作爲提供的第一個參數。

建議#1修改first_funct如下

Function first_funct(list_2 As Range, list_1 As Range) As Double 

你會路過兩個範圍中的第一個函數。

建議#2 呼叫second_funct(list_2,main_array)

相關問題