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瞭解程度不同,我這裏就很簡單的實現了。

以上代碼僅供參考,如有不當之處,歡迎指出!!!

更多幹貨,歡迎大家關注和聯繫我。期待和大家一起更好的交流、探討技術!!!

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