我想在我的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"声明选项可以在这里吗?
答案 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 1.4.3中存在一些已知错误,而v2.0即将推出,但我认为这可能会让您感兴趣。我不知道VBA的任何其他重构工具。请注意,Option Explicit
对于此工作来说几乎是一项艰难的要求,因为Rubberduck可以解决声明并且无法解析未声明的变量。
答案 1 :(得分:4)
为此目的使用即时IF(IIF)。
FilterTypeArray = IIF(FilterArray(i, 2) = 1, InvCodeArray, BoardMonthArray)