VBA实现Excel模块筛选高级应用场景!

做过项目管理或者产品管理的小伙伴或多或少都会对Excel比较依赖,那么你了解过什么是VBA吗?

复杂场景下对Excel的高级应用可能需要借助VBA代码才能实现。有些小伙伴可能了解VBA,有些可能还没接触过。今天我给大家讲一个复杂场景下通过VBA实现Excel模块筛选的高级应用。

这里我们先通过图片和文字描述一下需要实现的一个需求场景:

首先有一个Excel,其中有两个Sheet,Sheet1是所有模块的汇总表,Sheet2是通过Sheet1整理出来所有模块的事件处理。

要求点击Sheet2中模块列中某一项,可以动态跳转到Sheet1中且需要实现对Sheet1进行对应模块项的筛选。

附带Sheet1如图:

附带Sheet2如图:

点击Sheet2中模块列的某一项,例如‘A1模块’,需要动态跳转到Sheet1中且需要实现对Sheet1进行‘A1模块’的筛选。

跳转Sheet1且展示的效果:

就是这样的一个需求场景。我这里采用VBA代码实现,如下。

' Sheet2点击事件
' 可以同时为对应的Sheet2做多个点击事件
' PS:SelectionChange、Activate、Change、BeforeDelete、BeforeDoubleClick事件等
' Author: 小辉哥 2019-09-01 pm 17:25


'********************************全局变量声明BEGIN********************************

'声明变量接收合并单元格Adress
Dim tempAddressValue As String


'声明变量接收合并单元格Replace后Adress
Dim tempAddressReplaceValue As String


'声明变量接收合并单元格Replace+Split后Adress
Dim tempAddressSplitValue As String


'声明变量接收类型合并的单元格的Value
Dim moreTypeValue As String


'声明变量接收类型非合并的单元格Value
Dim singleTypeValue As String


'声明变量接收moreTypeValue匹配后的值
Dim matchMoreTypeValue As String


'声明变量接收singleTypeValue匹配后的值
Dim matchSingleTypeValue As String

'********************************全局变量声明END********************************



'说明:Worksheet SelectionChange点击事件
'作用: Sheet2点击对应的所属模块, 自动让sheet1的用例汇总表格案子对应的所属模块筛选显示
'备注:该触发选择的做法是采用包含的策略, 后期需求变动可以任意调整
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   '每次进入SelectionChange点击事件,初始化全局变量
   tempAddressValue = ""
   tempAddressReplaceValue = ""
   tempAddressSplitValue = ""
   moreTypeValue = ""
   singleTypeValue = ""
   matchSingleTypeValue = ""
   matchMoreTypeValue = ""
   
   '区分是否是合并单元格,不然获取Target.Value 会报错
   If Target.MergeCells = True Then
   
        '合并单元格处理方式
        'MsgBox Target.Address
        '格式$I$13:$I$14
        tempAddressValue = Target.Address
        tempAddressReplaceValue = Replace(tempAddressValue, "$", "")
        tempAddressSplitValue = Split(tempAddressReplaceValue, ":")(0)
        
        '得到合并单元格左上角第一列的值即为合并单元格的值
        moreTypeValue = Range(tempAddressSplitValue).Value
    
        '条件逻辑判断,对用例汇总sheet筛选(目前针对"A4模块"合并单元格的逻辑处理)
        If moreTypeValue = "A4模块" Then
             '代码中用变量通配代替减少代码工作量
             matchMoreTypeValue = "=*" + moreTypeValue + "*"
        
             '用例汇总sheet选中,创建自动过滤
             Sheets("汇总").Select
             'Selection.AutoFilter
             ActiveSheet.ListObjects("表1").Range.AutoFilter Field:=3, Criteria1:= _
             matchMoreTypeValue, Operator:=xlAnd
        
        Else
             '暂时不做处理代码启用后显示所有table内容,根据自己业务决定
             'ActiveSheet.ListObjects("表1").Range.AutoFilter Field:=3, Operator:=xlAnd
        End If
        
   Else
        '非合并单元格处理方式
        'MsgBox Target.Address 输出对应的地址
        'MsgBox Target.Value 输出对应非组合单元格的值
        
        '变量赋值
        singleTypeValue = Target.Value
        
        
        '条件逻辑判断,对用例汇总sheet筛选
        If singleTypeValue = "A1模块" Or singleTypeValue = "A2模块" Or singleTypeValue = "A3模块" Or singleTypeValue = "A5模块" Or singleTypeValue = "A6模块" Or singleTypeValue = "A7模块" Or singleTypeValue = "A8模块" Or singleTypeValue = "B1模块" Or singleTypeValue = "B2模块" Or singleTypeValue = "B3模块" Or singleTypeValue = "C1模块" Or singleTypeValue = "C2模块" Or singleTypeValue = "C3模块" Then
             '代码中用变量通配代替减少代码工作量
             matchSingleTypeValue = "=*" + singleTypeValue + "*"
             
             '用例汇总sheet选中,创建自动过滤
             Sheets("汇总").Select
             'Selection.AutoFilter
             ActiveSheet.ListObjects("表1").Range.AutoFilter Field:=3, Criteria1:= _
             matchSingleTypeValue, Operator:=xlAnd
        
        Else
             '暂时不做处理代码启用后显示所有table内容,根据自己业务决定
             'ActiveSheet.ListObjects("表1").Range.AutoFilter Field:=3, Operator:=xlAnd
        End If
    
    
   End If
   
   
End Sub


特别提示:

含有VBA代码的Excel,打开时候是需要开启‘宏’。有些VBA代码不同Excel版本略有差异。当然上面的VBA代码还有待很多优化的部分,考虑到大家对VBA了解程度不同,我这里就很简单的实现了。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章