2016-01-29 103 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

相关问题