我可以有一个"如果"函数参数中的语句?

时间:2016-01-29 18:06:02

标签: arrays excel vba excel-vba

我想在我的VBA代码中使用IF语句,我在其中调用一个Function并向其传递两个参数。我需要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(i,2)等于" 1"或不。是" IF"声明选项可以在这里吗?

2 个答案:

答案 0 :(得分: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块),{{{ 3}}的最后一个版本(v1.4.3)正确地将选定的内部循环提取到自己的方法中:

Rubberduck

Rubberduck 1.4.3中存在一些已知错误,而v2.0即将推出,但我认为这可能会让您感兴趣。我不知道VBA的任何其他重构工具。请注意,Option Explicit对于此工作来说几乎是一项艰难的要求,因为Rubberduck可以解决声明并且无法解析未声明的变量。

  

免责声明:Rubberduck's Extract Method refactoring tool

答案 1 :(得分:4)

为此目的使用即时IF(IIF)。

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