返回列表 上一主題 發帖

[發問] vba的篩選功能 (取消部分篩選)

[發問] vba的篩選功能 (取消部分篩選)

如何取消部分已被篩選的選項
篩選總共分成前後區段,分別是1~49 & 51~99,50的位置是中間分格
需求是在不影響51~99被篩選的部分,將1~49全部改為"全部"就是原始未篩選的狀態,反之亦然。

sub 篩選前端  ()
Dim var_min, var_max,i, j, s As Integer
var_min = 1  '前半段起
var_max = 49 '前半段迄
For i = var_min To var_max
i = i + 1
Selection.AutoFilter Field:=i
Next i
End Sub

sub 篩選後端  ()
Dim var_min, var_max,i, j, s As Integer
var_min = 51  '後半段起
var_max = 99  '後半段迄
For i = var_min To var_max
i = i + 1
Selection.AutoFilter Field:=i
Next i
End Sub
由錄製可以得到,一般的篩選指令是
Selection.AutoFilter Field:=5, Criteria1:="W" '將第5欄篩選為W
但是選擇取消該欄位的篩選,選擇全部則只會是
Selection.AutoFilter Field:=i
'從錄製看起來沒有給後面這串指定值就是全部了
'將該格篩選為"全部"


所以有了上面的程式碼,但看起來是沒有效果的。
想請問取消篩選的指令是? (Criteria1:= ?)
還有如果不用迴圈有直接選取範圍的方法嗎?
或是只能用迴圈,有用文字而非欄位數的方法?
像目前1~49其實是A~AX,51~99其實是AY~CU
可以直接指定文字下去迴圈嗎?
畢竟直接看到的是文字,比再去換算數字直觀。

本帖最後由 wei9133 於 2020-10-6 20:28 編輯

回復 2# ikboy

如附件
    對戰統計 - 複製 - 複製.rar (35.99 KB)

還有,忘了講,版本是 excel2003
麻煩了!
我是沒看懂你說的,我是想不動已被篩選的部分(指定範圍)
將另外剩下的被篩選部分全部重置為全部狀態(未被篩選過的狀態)

TOP

本帖最後由 wei9133 於 2020-10-7 00:13 編輯

回復 4# ikboy
Microsoft_Excel_-_TEST.xls-2020-10-06-23-57-45.png
附件右半邊已篩選,想在不動到右半邊已篩選的條件
將左半邊被篩選的條件重置為全部
TEST.rar (32.89 KB)


A 已篩選 V
B 已篩選 W
F 已篩選 空格
W 已篩選 W
X 已篩選 空格

反方向亦然 (左半選取狀況下,右半邊全部重置為原始未篩選狀態)

;===============================================


上面這個AY~CU要篩選的已經確定了
就是要把A~AW的全部重置為未篩選狀態

TOP

回復 9# 軒云熊
你好,我沒有測試你的巨集
不過看就知道不對,因為東西是在同一個活頁簿裡
只是分成前面跟後面而已
詳細可以看看上面的附件
應該這樣講
假設有A~Z欄 (實際上更多)
把A~L全部篩選好了
要把M~Z的篩選條件全部清空為預設
大概就只是這樣而已

TOP

本帖最後由 wei9133 於 2020-10-7 20:00 編輯

回復 6# ikboy

不對,我直接講我要的結果
其實原本就是要把所有相同的行標示出來,然後加總起來
我沒有要拆開他的意思
每一行都是一個對戰紀錄(在附件CZ行有星象)
所以要比對的其實是,是否有A~CV都長得一樣的列(需要包含CZ),因為不同星象也會有A~CV想的一樣的狀態出現
不過因為還有CW~CY是不會相同的值,所以無法直接比對
現在我是手動把A~AW的挑選出來後,再去一個一個把AY~CU篩選出來,一樣的合併(連星象都一樣的部分),然後勝場+1
所以想要我在固定A~AW篩選條件的狀況下,去重置AY~CU的篩選條件


還是看不懂的麻煩移駕影片
https://sendvid.com/kvj69nqz
超連弄不出來,請自己複製網址到網址列吧
實際是就是要最後幾秒那個動作而已
只是不只點的那幾個,而是後方全部都點成全部

TOP

回復 12# 軒云熊
你好
在最初的需求中我沒有要刪任何資料
我是要比對是否有相同的資料(列)
才要固定[左|右]一邊的已篩選條件


應該怎麼說才能讓你理解呢0.0a

A~L 原本的資料格式要保留嗎?  還是只保留篩選後的?
M~Z 不做任何動作?


A~L已經篩選過了,都不要動它
M~Z每一個都把篩選選單拉開來點"全部"
Microsoft_Excel_-_對戰統計.xls-2020-10-08-00-41-45.png

我覺得我們溝通的問題應該出在這個"全部"上面...

感謝你花時間幫我想解決方案 m(_ _)m

TOP

回復 14# jcchiang

其實我實際上就是比對,不過是人工比對
所以才會想要固定一邊的篩選後條件,將另外半邊全部點回原始未被篩選的狀態
這樣方便看另一邊是否有一樣的組合
這張圖表裡面顯示不出敗局,因為敗局是紀錄的時候發現輸了手動填上的
所以實際比對目標應該是
A~CV都長得一模一樣且CZ也一樣的部分
A~CV分別應對勝敗方的出場人物,而CZ是星象(這個參數雙方共用)
A~AW是敗方組合,AY~CU是敗方組合
AX跟CV這兩格出戰人數是勝敗方的出戰人數,以確保未統計錯誤
(正常為5,若錯了有用格式化標出以發現輸入錯誤)

目前我人工統計的流程是
先固定左邊的篩選條件,這樣篩選出來的敗方角色就被固定了 (反之就是固定勝方篩選條件再去挑選敗方角色)
再從右邊挑選條件篩選,發現兩條長的一模一樣的(A~CV & CZ),確認一下備註(CX)的顏色階級
(有可能A~CV都一樣但ZC是不同的)

(現在看起來短是因為隱藏了中間的部分)
然後把這幾條一樣的勝場(CW)敗場(CY)加起來填到要留下的那一條的勝場(CW)敗場(CY)欄位
(這個時候我會看一下備註決定要留哪一條)
然後把留下之外的其他條刪除。

TOP

回復 16# 軒云熊
我其實也沒看懂你的東西,只有一個活頁簿的東西怎麼變成兩個了
而且我執行它還報錯了



我要比對的始終在一個活頁簿裡
目前是人工挑選A~CV都長得一模一樣且CZ也一樣的部分
然後加總敗場跟勝場數填入其中一列的該格中留存
剩下刪除

TOP

本帖最後由 wei9133 於 2020-10-9 01:16 編輯

回復 17# wei9133

我把我具體的操作錄成影片了,看一下或許能懂?

https://sendvid.com/suu270r2

其中整欄直接篩選成V或W的部分因為我已經錄成巨集所以沒有去拉下拉式選單
  1. Sub 篩選為V() '^U
  2. Dim i As Integer
  3. i = ActiveCell.Column '獲取欄位值
  4. Cells(1, i).Select
  5.     Selection.AutoFilter Field:=i, Criteria1:="V"
  6.     '將該格篩選為"V"
  7. End Sub
  8. Sub 篩選為W() '^I
  9. Dim i As Integer
  10. i = ActiveCell.Column '獲取欄位值
  11. Cells(1, i).Select
  12.     Selection.AutoFilter Field:=i, Criteria1:="W"
  13.     '將該格篩選為"W"
  14. End Sub
  15. Sub 篩選為空格() '^B
  16. Dim i As Integer
  17. i = ActiveCell.Column '獲取欄位值
  18. Cells(1, i).Select
  19.     Selection.AutoFilter Field:=i, Criteria1:="="
  20.     '將該格篩選為"空格"
  21. End Sub
  22. Sub 篩選為非空格() 'O
  23. Dim i As Integer
  24. i = ActiveCell.Column '獲取欄位值
  25. Cells(1, i).Select
  26.     Selection.AutoFilter Field:=i, Criteria1:="<>"
  27.     '將該格篩選為"非空格"
  28. End Sub

  29. Sub 篩選為全選() '^+Q
  30. Dim i As Integer
  31. i = ActiveCell.Column '獲取欄位值
  32. Cells(1, i).Select
  33.     Selection.AutoFilter Field:=i ' Criteria1:="<>" ,看起來沒有給後面這串指定值就是全部了
  34.     '將該格篩選為"全部"
  35. End Sub
複製代碼
一開始我需要的功能需求其實是這個
在我選完某一邊之後,把另一邊全部由篩選下拉式選單選回"全選"

https://sendvid.com/3ifimegq

所以才會出現這種東西
  1. sub 篩選後端  ()
  2. Sub 篩選後端()
  3. Dim var_min, var_max, i, j, s As Integer
  4. var_min = 51  '後半段起
  5. var_max = 99  '後半段迄
  6. For j = var_min To var_max
  7. j = j + 1
  8. Cells(1, j).Select
  9. Selection.AutoFilter Field:=j
  10. Next j
  11. End Sub
複製代碼
但是這組代碼好像沒用,所以才會來問

TOP

本帖最後由 wei9133 於 2020-10-15 06:56 編輯

回復 22# 軒云熊

你好,因為後面這個已經變成比對了,所以跟一開始的作法已經不一樣
然後這兩天又增加新英雄,所以格子又不一樣了..

而比對的部分因為後面還加上整合成一行的部分
那就又必須考慮到幾個條件
1.A~CX(敗勝雙方出陣) & DB(星象)長的一模一樣的列
2.有些比較常出現的組合會有暫存的篩選快捷,裡面也有值的
  具體是CZ(備註)DC跟DE有雙方出陣的簡寫方便篩選後快速辨識
  (看不懂的話執行 "Sub 暫存篩選()"快捷鍵 ctrl+L,會比較好理解)
  或著這樣講判斷 上面這三個其中一個有值的,合併的基本就是它,把其他的勝敗場都加到這一列上面
  
3.所以是把符合"條件一"的列去比對,全部加在符合"條件二"的列上面,然後把該列的勝敗場都加起來填在各自的勝敗場
  要被合併的勝場該欄位數字要加1,因為出現這一列本身就是勝了一場,多勝一場才會在在勝場數上加上數字
  而敗場則否
  譬如
  共有三列符合上述所有條件 A~CX相同、DB相同
  而勝場部份的值則分別為3、空格、1,敗場的值則為1、空格、空格
  算出來合併的勝場欄位應為"6",敗場則為"1"
  算法是這樣的,假設3那格保留,而空格代表勝1場,勝場填入1的實際上是"當列"加"勝1場"
  所以加出來是"6"

https://mega.nz/file/7dQmCLjI#QCQsI9fga6rZlsXJYLfrfaGz2ZUVmFLaCXtTOLFNvqI
我直接附上檔案,你用此檔案測試即可,有原始檔案也有助於你理解我說的到底是甚麼
當然如果有更好的方法也請提出
至於如果有幸有寫出vba程式碼的話
煩請直接回覆於帖子之中
(因為後續還會有新英雄加入,所以麻煩幫我註解若格子往後推的話要改哪個地方)


上面檔案中已有巨集,如有疑慮可以不開啟
巨集功用分別為Module2 塗底色(格式化條件)
Module1 篩選(V|W|空格|非空格|取消篩選)/字型顏色加粗

P.S.要注意版本用的是EXCEL 2003,我不清楚VBA的版本是否通用。

TOP

        靜思自在 : 心中常存善解、包容、感思、知足、惜福。
返回列表 上一主題