做過項目管理或者產品管理的小夥伴或多或少都會對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瞭解程度不同,我這裏就很簡單的實現了。
以上代碼僅供參考,如有不當之處,歡迎指出!!!
更多幹貨,歡迎大家關注和聯繫我。期待和大家一起更好的交流、探討技術!!!