返回列表 上一主題 發帖

[發問] excel VBA 自動更新篩選問題

[發問] excel VBA 自動更新篩選問題

Dear all,

麻煩大家幫幫忙
我自己參考網路上的VBA語法寫了一段語法

想法是:
1.AF欄位有設定"資料驗證:待料,待生產,生產中,機台異常,結批,暫停"
Noname.jpg
2021-7-21 08:55


2.AF欄位起初設定是將"結批"的選項勾選取消。
**** 此時AF欄位下並無資料有"機台異常"

3.若AF欄位下,選擇"結批"時,此時VBA會自動篩選掉

4.但AF欄位下,選擇"機台異常"時,結果也會被VBA會自動篩選掉

我要怎麼設定VBA參數
1.希望在AF欄位在做篩選時,之前勾選取消之項目會自動被篩選掉,
2.但之前未點選過的選項如設備異常,希望不要被框選取消。
error.gif
2021-7-21 09:02


error.rar (21.16 KB)
Just do it.

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
   If .Column = 32 And .Row >= 2 And .Count = 1 Then
      If ActiveSheet.FilterMode = True Then
         If .Value <> "機台異常" Then
            .Rows(.Count).EntireRow.Hidden = True
         End If
      End If
   End If
End With
End Sub

參考!

TOP

回復 2# Andy2483
Dear Andy2483,
抱歉我表達的不清楚,

1.在AF欄位有設定"資料驗證(下拉式選單):待料,待生產,生產中,機台異常,結批,暫停"這6個選項
2.在AF欄位下只有"待料,待生產,生產中,結批"這些資訊
3.我在AF欄位用篩選的方式,先把"結批"這取消勾選掉。
4.此時"結批"欄位會被自動隱藏掉。
5.這時我在AF欄位中,若點選下拉式選單選擇"機台異常"或"暫停"時,VBA一樣會把它們給予自動隱藏

我錄了一段過程,當我選擇"待料"VBA一樣會把它們給予自動隱藏
111111111111111111111111.gif
2021-7-21 15:44


我發現大概是因為當我在做-->AF欄位用篩選的方式,先把"結批"這取消勾選掉時。
此時AF欄位下只有"生產中,待生產,暫停"這3個選項,
將結批勾選取消.jpg
2021-7-21 15:44

所以當我在AF選擇除了"生產中,待生產,暫停"這3個選項外的資訊,基本上都會被VBA自動隱藏

我是想說,有甚麼方式是可以讓VBA只認定我第一次取消的選項,而其他選項出來時,是無作動的
Just do it.

TOP

本帖最後由 n7822123 於 2021-7-22 00:01 編輯

回復 3# jsc0518

我是想說,有甚麼方式是可以讓VBA只認定我第一次取消的選項,而其他選項出來時,是無作動的

篩選條件不會去記錄 你 "取消" 的,只會記錄"現有" 的

如果你原本有 A、B、C ,3個條件,你把C取消了,Excel的篩選條件會紀錄成 "要A、也要B",而不是 "不要C"

資料篩選的本意=從現有的資料去過濾

如果資料只有A、B、C,就算用VBA寫篩選條件,多一個D條件,Excel也是不認帳的

所以當資料有變動時,只能用VBA "重寫條件"

程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 3# jsc0518


2個以下篩選取消項有效
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
   Dim Qx$, Af&, Sc$, i&
   Af = 32
   Sc = ""
   Qx = ""
   If .Column = Af And .Row >= 2 And .Count = 1 Then
      If ActiveSheet.FilterMode = True Then
         For i = 2 To ActiveSheet.UsedRange.Rows.Count
            If Rows(i).EntireRow.Hidden = True Then
               If Sc = "" Then
                  Sc = Cells(i, "AF")
               End If
               If Qx = "" And Cells(i, "AF") <> Sc Then
                  Qx = Cells(i, "AF")
               End If
               If InStr(Sc & "," & Qx, Cells(i, "AF")) = 0 Then
                  GoTo 99
               End If
            End If
         Next
         Selection.AutoFilter Field:=Af, Criteria1:="<>" & Sc, Operator:=xlAnd, Criteria2:="<>" & Qx
         ActiveSheet.AutoFilter.ApplyFilter
         
99
      End If
   End If
End With
End Sub

參考!

TOP

回復 5# Andy2483
Dear Andy2483,
早安!感謝您的回覆!
試過後可以使用,感恩!
可否教我一下VBA語法大概內容是怎麼做的呢?
謝謝你!!!
Just do it.

TOP

回復 4# n7822123
Dear n7822123,
早安您好,感謝您的回覆,知道囉!
Thank you.
Just do it.

TOP

回復 6# jsc0518


1.如果可以用! 代表方向對了!
2.Andy學很久了!進步很慢!這是用土方法拼湊出來的
2.1.只是用迴圈判斷篩選後隱藏了什麼項目
2.2.如果篩選後隱藏超過兩項就不適用!
      如果兩項以下就以自訂篩選的方式取代取消勾選的篩選
3.應該有更高明的方法! 請高手前輩們指導!

TOP

回復 6# jsc0518


篩選1~5個項目均適用
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
   Dim Qx$, Af&, Sh$, S1$, S2$, S3$, S4$, S5$, i&
   Af = 32
   Sh = ""
   S1 = ""
   S2 = ""
   S3 = ""
   S4 = ""
   S5 = ""
   If .Column = Af And .Row >= 2 And .Count = 1 Then
      If ActiveSheet.FilterMode = True Then
         For i = 2 To ActiveSheet.UsedRange.Rows.Count
            If Rows(i).EntireRow.Hidden = True Then
               If Sh = "" Then
                  Sh = Cells(i, "AF")
                  ElseIf InStr(Sh, Cells(i, "AF")) = 0 Then
                     Sh = Sh & "," & Cells(i, "AF")
               End If
               ElseIf InStr(Sh, Cells(i, "AF")) <> 0 Then
                  GoTo 999
               ElseIf S1 = "" Then
                  S1 = Cells(i, "AF")
               ElseIf S2 = "" And InStr(S1, Cells(i, "AF")) = 0 Then
                  S2 = Cells(i, "AF")
               ElseIf S3 = "" And InStr(S1 & S2, Cells(i, "AF")) = 0 Then
                  S3 = Cells(i, "AF")
               ElseIf S4 = "" And InStr(S1 & S2 & S3, Cells(i, "AF")) = 0 Then
                  S4 = Cells(i, "AF")
               ElseIf S5 = "" And InStr(S1 & S2 & S3 & S4, Cells(i, "AF")) = 0 Then
                  S5 = Cells(i, "AF")
                  Exit For
            End If
            
999
         Next
         If InStr(Sh, .Value) <> 0 Then
            .Rows(.Count).EntireRow.Hidden = True
            Else
               Selection.AutoFilter Field:=Af, Criteria1:=Array( _
                  S1, S2, S3, S4, S5), Operator:=xlFilterValues
               ActiveSheet.AutoFilter.ApplyFilter
         End If
      End If
   End If
End With
End Sub

參考!

TOP

回復 8# Andy2483
請問一下,

If InStr(Sc & "," & Qx, Cells(i, "AF")) = 0 Then
GoTo 99 --> 這是甚麼用意、意思呢?
Just do it.

TOP

        靜思自在 : 脾氣嘴巴不好,心地再好也不能算是好人。
返回列表 上一主題