標題:
[發問]
VBA依條件自動篩選
[打印本頁]
作者:
msmplay
時間:
2016-12-14 20:06
標題:
VBA依條件自動篩選
本帖最後由 msmplay 於 2016-12-14 20:11 編輯
想請教網大高手們~~~~~~~
請問如何使用VBA達到以下自動篩選功能:
1.按下「逾期數TOP 5」按鈕時,CZ欄可自動篩選出逾期數前5名。例如圖一
2.按下「完成率低於90%」按鈕時,DA欄可自動篩選出完成率低於90%以下。例如圖二
3.按下「作業天數TOP 5」按鈕時,DB欄可自動篩選出作業天數前5名。例如圖三
說明:
1. 第223列工作數總計不列入篩選條件範圍內
2. 第1與第3條件,如果同時有2個以上均有第5名的相同數據時,則均需篩選出來
3. 因為數據會不斷更新,所以以上三個條件數據均可能不同,故無法使用目前的固定數據錄製成巨集
[attach]26099[/attach]
作者:
GBKEE
時間:
2016-12-15 08:27
回復
1#
msmplay
[attach]26101[/attach]
2003 可用圖示 前10 項 錄製你所需的看看
Operator 選擇性的 XlAutoFilterOperator 資料類型。
XlAutoFilterOperator 可以是這些 XlAutoFilterOperator 常數之一。
xlAnd default
xlBottom10Items '後面(項目)
xlBottom10Percent '後面(百分比)
xlOr
xlTop10Items '前面(項目)
xlTop10Percent '前面(百分比)
可使用 xlAnd 和 xlOr 將 Criteria1 和 Criteria2 建構複合準則。
複製代碼
試試看
Sub 篩選測試()
With Sheets("工作完成率統計")
If .FilterMode Then
.ShowAllData
Else
.Range("$B$3:$DB$222").AutoFilter
End If
.Range("$B$3:$DB$222").AutoFilter Field:=102, Criteria1:="5", Operator:=xlTop10Items
'測試前5項紀錄但會差一項,因 資料的最後是工作數總計列也計算進去了
' 所以 Criteria1:="6" ,才會顯示測試前5項紀錄
.ShowAllData
.Range("$B$3:$DB$222").AutoFilter Field:=103, Criteria1:="5", Operator:=xlTop10Items
.ShowAllData
.Range("$B$3:$DB$222").AutoFilter Field:=104, Criteria1:="<90%"
' 工作數總計列也有計算進去但 >90%,會顯示
.AutoFilterMode = False
End With
End Sub
複製代碼
作者:
msmplay
時間:
2016-12-15 12:47
回復
2#
GBKEE
G大~~~~感謝熱心幫忙ㄛ!不過小妹試了不行ㄟ,按一下任何一個鍵,都會有在出現篩選的動作,但最後又回復到沒有篩選的樣子!你測試可以成功嗎?
作者:
GBKEE
時間:
2016-12-16 19:16
回復
3#
msmplay
將你3個按鈕的程式放在一起了,你可拆開成你要的3個巨集,
作者:
msmplay
時間:
2016-12-17 00:37
本帖最後由 msmplay 於 2016-12-17 00:40 編輯
回復
4#
GBKEE
原來如此丫~~~~~真是太感謝您了G大!!不過可以再請教一下~~~~就是小妹自己改好之後如附件,但遇到以下問題
1.逾期數會顯示223列總計,完成率、作業天數是否也可以同樣篩選後固定顯示
223列總計呢?
2.作業天數篩選後發現同樣TOP10的數字10共有3個,但因為顯示為TOP10,所以並列為第10大的數字10只顯示了2個,列193反而沒辮法顯示(已反紅),請問這是否有其他解決方法呢?
非常感謝~~~~~~~
[attach]26114[/attach]
作者:
GBKEE
時間:
2016-12-17 05:49
回復
5#
msmplay
193列時際上是9.5,因你格式上採用數值小數點0位,所以顯示為10
可修改公式=IF(SUM(G193:CX193)=0,"-",ROUND(AVERAGE(G193:CX193),0))
作者:
准提部林
時間:
2016-12-17 11:38
假如第1名有2個, 第2名有3個, 前5大, 應是8個???
作者:
msmplay
時間:
2016-12-17 14:04
回復
7#
准提部林
准大沒錯沒錯!!!
作者:
msmplay
時間:
2016-12-17 14:06
回復
6#
GBKEE
原來如此丫!!謝謝你ㄛG大~~~~~
作者:
准提部林
時間:
2016-12-17 19:47
Dim FilArea As Range
Sub 逾期數()
Dim R&, xClmn As Range, i&, LG, GG, N%
Call 取消篩選
Set xClmn = FilArea.Columns(103)
R = Application.CountIf(xClmn, ">0")
If R = 0 Then Exit Sub
Sheets("工作完成率統計").AutoFilterMode = False
For i = 1 To R
LG = Application.Large(xClmn, i)
If GG <> LG Then N = N + 1: GG = LG
If N = 5 Then Exit For
Next
FilArea.AutoFilter Field:=103, Criteria1:=">=" & GG
End Sub
Sub 低於90()
Call 取消篩選
Sheets("工作完成率統計").AutoFilterMode = False
FilArea.AutoFilter Field:=104, Criteria1:="<90%"
End Sub
Sub 作業天數()
Dim R&, xClmn As Range, i&, LG, GG, N%
Call 取消篩選
Set xClmn = FilArea.Columns(105)
R = Application.Count(xClmn)
If R = 0 Then Exit Sub
Sheets("工作完成率統計").AutoFilterMode = False
For i = 1 To R
LG = Application.Large(xClmn, i)
If GG <> LG Then N = N + 1: GG = LG
If N = 5 Then Exit For
Next
FilArea.AutoFilter Field:=105, Criteria1:=">=" & GG
End Sub
Sub 取消篩選()
Dim R&
With Sheets("工作完成率統計")
.AutoFilterMode = False
R = .UsedRange.Rows.Count - 1
If R <= 4 Then Exit Sub
Set FilArea = .Range("B3:DB" & R)
FilArea.AutoFilter
End With
End Sub
複製代碼
[attach]26115[/attach]
作者:
msmplay
時間:
2016-12-17 22:25
回復
10#
准提部林
謝謝准大~~~~~~~~~~~~~~~~
作者:
GBKEE
時間:
2016-12-18 08:09
本帖最後由 GBKEE 於 2016-12-18 08:11 編輯
回復
11#
msmplay
[attach]26117[/attach]
Option Explicit
Sub Ex_作業天數()
Ex_篩選 "作業天數", 10, 3 'xlTop10Items=3 請看圖示
End Sub
Sub Ex_完成率()
Ex_篩選 "完成率", "<0.9", 0
End Sub
Sub Ex_逾期數()
Ex_篩選 "逾期數", 10, 3
End Sub
Sub Ex_篩選(篩選 As String, 篩選準則 As String, xl_Operator As Integer)
Dim Rng As Range
With Sheets("工作完成率統計")
Set Rng = .Rows("1:3").Find(篩選, lookat:=xlWhole)
If Rng Is Nothing Then MsgBox "找不到 " & 篩選: Exit Sub
Set Rng = Range(Rng.Range("A3"), Rng.Range("A4").End(xlDown).Offset(-1))
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False ' 取消 [自動篩選]
If xl_Operator > 0 Then
Rng.AutoFilter Field:=1, Criteria1:=篩選準則, Operator:=xl_Operator ', VisibleDropDown:=False
Else
Rng.AutoFilter Field:=1, Criteria1:=篩選準則 ', VisibleDropDown:=False
End If
'** VisibleDropDown:=False :不在工作表上顯示有 [自動篩選] 下拉箭號
Rng(1).Select
End With
End Sub
複製代碼
作者:
msmplay
時間:
2016-12-18 23:29
回復
12#
GBKEE
謝謝G大熱心幫忙ㄟ~~~~~~~~~~
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)