做过项目管理或者产品管理的小伙伴或多或少都会对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了解程度不同,我这里就很简单的实现了。
以上代码仅供参考,如有不当之处,欢迎指出!!!
更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!