2017-02-14 54 views
2

以下問題讓我困惑。我已經創建了一個函數,以提供基於若干輸入的特定列的列索引:Excel VBA:元素不被存儲在循環中

  1. 的陣列(從列標題的範圍)
  2. 數據元素(整數)的數
  3. 的選定列名稱陣列
  4. 一個Array,用於保存傳回子結果的結果。
  5. 計數器(全局)

顯然,這裏的意圖是通過列索引的其他功能和程序用於偏移和額外的處理。

雖然函數本身正在工作,但它不適用於第二個數據元素。 K將用適當的索引記錄下來,但不會傳遞給陣列。有什麼我在這裏失蹤?

Public Function getIndex(ByRef all_names As Variant, ByVal Elements As Integer, check_names() As Variant, resultindex() As Variant) As Variant 
    ReDim resultindex(1 To Elements) 
    For i = LBound(all_names) To UBound(all_names) 
     For j = 1 To Elements 
      For k = LBound(all_names, 2) To UBound(all_names, 2) 
       If all_names(i, k) = check_names(j) Then         ' checks colName against dynamic names 
        resultindex(j) = k              ' colIndex takes index of selected column 
        Debug.Print resultindex(j) 
'     k = UBound(all_names, 2)            ' Jump to end? 
       End If 
      Next k 
     Next j 
    Next i 
End Function 

有爲什麼沒有存儲在第二個元素一個特別的原因?我已經嘗試了幾個不同的輸入,並取得了相同的結果。對於那些擅長嵌套循環的人來說,我會非常感謝能夠在正確的方向上點頭示意的人。謝謝。

編輯:它看起來像是在即時窗口中工作。正如預期的那樣,適當的指數被阻礙了,但第二個因素並沒有被傳遞出去。

驗證是否值傳遞:

results(i) = getIndex(subArray(), Elements, selNames(), results()) 
colIndex() = results() 

For i = 1 To Elements 
    Debug.Print colIndex(i) 
Next i 
Erase result 
+0

也許',爲ByRef resultindex爲Variant)'? – Slai

+2

與許多帶有「返回」語句的常見語言相比,VBA有點奇怪。 VBA創建一個與該函數名稱相同的自動變量,並且分配給此變量的任何內容都將返回。所以就在函數結束之前(假設你想返回數組'resultindex'),你可以添加'getIndex = resultIndex'這一行。 – Blackhawk

+0

哦,我明白了,所以你是通過引用返回的... – Blackhawk

回答

3

你永遠不分配一個返回值的函數。您似乎也使用resultindex作爲ByRef參數來保存結果。你不需要這樣做。

重構,試圖

Public Function getIndex(_ 
    ByRef all_names As Variant, _ 
    ByVal Elements As Integer, _ 
    check_names() As Variant) As Variant 

    Dim i As Long, j As Long, k As Long 
    Dim resultindex() As Variant 
    ReDim resultindex(1 To Elements) 
    For i = LBound(all_names) To UBound(all_names) 
    For j = 1 To Elements 
     For k = LBound(all_names, 2) To UBound(all_names, 2) 
      If all_names(i, k) = check_names(j) Then         ' checks colName against dynamic names 
       resultindex(j) = k              ' colIndex takes index of selected column 
       Debug.Print resultindex(j) 
       Exit For 
      End If 
     Next k 
    Next j, i 
    getIndex = resultindex 
End Function 

,並調用它像這樣

results = getIndex(subArray(), Elements, selNames()) 

For i = 1 To Elements 
    Debug.Print results(i) 
Next i