2016-01-29 147 views
2

我想在我的VBA代碼中使用IF語句,在該函數中調用一個Function並傳遞給它兩個參數。我需要IF語句的原因是因爲參數是我傳遞給函數的數組對象。下面是一個包含該問題的代碼的縮寫:我可以在函數參數中使用「If」語句嗎?

For i = 1 To UBound(FilterArray) 
    For j = LBound(ptsheets, 1) To UBound(ptsheets, 1) 
     Filter_PivotField_Master _ 
      pvtField:=ThisWorkbook.Worksheets(ptsheets(j, 1)).PivotTables(ptsheets(j, 2)).PivotFields(FilterArray(i, 1)), _ 
      FilterTypeArray:= If FilterArray(i, 2) = 1 Then 
           InvCodeArray 
           Else 
           BoardMonthArray 
           End If 
    Next j 
Next i 

正如你所看到的,我通過循環的ptsheets陣列,併爲每個條目,我打電話了Filter_PivotField_Master功能。該函數需要兩個輸入(一個pivotfield和一個字符串數組用於過濾)。名爲「FilterArray」的數組只包含傳遞給該函數所需的信息。因爲我似乎無法在內部的字符串數組(無論是InvCodeArray或BoardMonthArray)存儲「FilterArray,」我想用這個if語句,如果FilterArray根據任一陣列之間進行選擇(1,2)等於「1」或不。這裏是否可以使用「IF」聲明選項?

回答

5

不這樣做。從內部循環中提取一個方法/程序,並改爲參數化它。

For j = LBound(ptsheets, 1) To UBound(ptsheets, 1) 
     Filter_PivotField_Master _ 
      pvtField:=ThisWorkbook.Worksheets(ptsheets(j, 1)).PivotTables(ptsheets(j, 2)).PivotFields(thePivotField), _ 
      FilterTypeArray:= theFilterType 
    Next j 

然後讓調用代碼(外部循環)實現條件邏輯,該條件邏輯確定給它什麼參數。

Dim thePivotField 
Dim theFilterType 

For i = 1 To UBound(FilterArray) 
    thePivotField = FilterArray(i, 1) 
    If FilterArray(i, 2) = 1 Then 
     theFiltertype = InvCodeArray 
    Else 
     theFilterType = BoardMonthArray 
    End If 
    TheExtractedMethod i, thePivotField, theFilterType 
Next i 

您的代碼將更容易遵循 - 並進行調試。


與此相關的,我做了幾個假設只是爲了讓你的代碼片段,其中Option Explicit上(和IIf,而不是非法If...Else塊),並Rubberduck的最後一個版本(1.4.3)編譯正確提取的選擇內循環到它自己的方法:

Rubberduck's Extract Method refactoring tool

有幾個已知的bug與Rubberduck 1.4.3和2.0版即將十歲上下,但我想這可能感興趣。我不知道任何其他的VBA重構工具。需要注意的是Option Explicit幾乎是這個工作的硬要求,因爲Rubberduck工作過聲明並不能解決未聲明的變量。

Disclaimer: I wrote this refactoring tool.

+0

這個工作很完美。謝謝! – AGryckiewicz

+0

@AGryckiewicz僅供參考我剛剛使用我的Rubberduck VBE插件的* Extract Method *重構工具對其進行了測試,並且它工作正常。你可能想看看。 –

+0

不錯。我真的不明白'重構工具'是什麼,它的用途是什麼,但我有興趣學習更多。感謝您傳遞信息。 – AGryckiewicz

4

爲此目的而使用即時IF(IIF)。

FilterTypeArray = IIF(FilterArray(i, 2) = 1, InvCodeArray, BoardMonthArray) 
+1

@Fadi:謝謝。我寫*立即IF *,然後立即錯誤輸入函數名稱。謝謝你的收穫。 –

+1

請注意,'IIf'在返回之前評估*兩個值語句,所以最好避免使用常量表達式以外的任何其他值。 –

+0

謝謝。 IIF函數從語法角度的工作,但我得到一個編譯錯誤:「類型不匹配:數組或用戶定義類型預期」 的函數需要一個數組。我不能使用這種IIF方法傳遞數組嗎? – AGryckiewicz

相關問題