下面的这段代码来自于TheSpreadsheetGuru.com,类似数据透视表中的双击功能,可只显示组成SUMIFS函数结果的数据。代码如下:
代码语言:javascript复制Sub DetailForSUMIFS() '变量声明 Dim SumRange As Range Dim CriteriaRange As Range Dim CriteriaValue As Variant Dim DataSheet As Worksheet Dim TargetCell As Range Dim FormulaString As String Dim TestExpression As String Dim objRegEx As Object Dim Match As Object Dim RegExResult As Object Dim InputArray As Variant Dim x As Integer Dim FirstField As Integer '存储当前单元格 Set TargetCell = ActiveCell '确保单元格的公式包含SUMIFS函数 If Not TargetCell.Formula Like "*SUMIFS(*" Then MsgBox "没有找到SUMIFS函数引用. 中止..." Exit Sub End If '通过正则规则分离SUMIFS函数 Set objRegEx =CreateObject("VBScript.RegExp") objRegEx.IgnoreCase = True objRegEx.Global = True objRegEx.Pattern =""".*""" TestExpression = CStr(TargetCell.Formula) '分离"SUMIFS(" 和")"之间的文本 objRegEx.Pattern ="SUMIFS((.*?))" '正则规则的结果(仅使用第一个匹配项) If objRegEx.test(TestExpression) Then Set RegExResult =objRegEx.Execute(TestExpression) If RegExResult.Count > 0 Then For Each Match In RegExResult FormulaString = Match.Value Exit For Next Match End If Else Exit Sub '正则规则没有找到任何文本 End If '通过","拆分SUMIFS函数并存储在数组变量中 FormulaString = Replace(FormulaString,"SUMIFS(", "") FormulaString = Left(FormulaString,Len(FormulaString) - 1) InputArray = Split(FormulaString,",") '确定公式中的第一个条件区域 Set CriteriaRange = Range(InputArray(1)) '提取工作表引用 With CriteriaRange Set DataSheet =Workbooks(.Parent.Parent.Name).Worksheets(.Parent.Name) End With '移除任何已存在的筛选数据并打开筛选 If DataSheet.AutoFilterMode AndDataSheet.FilterMode Then DataSheet.ShowAllData '清除筛选 ElseIf Not DataSheet.AutoFilterMode Then CriteriaRange.CurrentRegion.AutoFilter '开启筛选 End If '对源数据应用SUMIFS筛选 For x = 1 To UBound(InputArray) '确保仅看到与条件区域相关的输入 If x Mod 2 <> 0 Then '确定源数据第一列的位置 FirstField =DataSheet.Range(InputArray(x)).Column -DataSheet.AutoFilter.Range.Columns(1).Column 1 '确定要筛选数据的条件值 CriteriaValue = Evaluate(InputArray(x 1)) DataSheet.Range(InputArray(x)).AutoFilterField:=FirstField, Criteria1:=CriteriaValue End If Next x '存储SUMIFS第一个输入 Set SumRange = Range(InputArray(0)) '选择汇总单元格区域以在Excel状态栏中显示汇总数值 Application.Goto SumRange '滚动到数据集顶部 ActiveWindow.ScrollRow = 1End Sub
下图1所示的工作表为使用SUMIF函数求得苹果的销售量之和。
图1
运行DetailForSUMIFS过程后,得到的结果如下图2所示。可以看出,仅显示了苹果的信息,其他水果的信息被隐藏了,并且在状态栏中显示了苹果销售的一些其他数值信息。
图2