返回列表 上一主題 發帖

[發問] 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
可以直接指定文字下去迴圈嗎?
畢竟直接看到的是文字,比再去換算數字直觀。

回復 59# wei9133

剛才試了一下發現 106星象有問題 改了一下  ,有空再幫我試試看 有沒有問題,感謝

javascript:;

對戰統計 -1120_.rar (652.91 KB)

TOP

回復 59# wei9133

這會比較快一點 但是還是很慢... 有空幫我試試看有沒有問題   感謝
  1. Public Sub 練習1118()
  2. Sheets(2).Select
  3. Rows(2).Select
  4. ActiveWindow.FreezePanes = False
  5. Application.ScreenUpdating = False
  6. Sheets(2).[A1].CurrentRegion.Clear
  7. Sheets(1).Select
  8. Dim Arr, D, xD, x&, y&, k&, T1$, T3$, E()
  9. Set xD = CreateObject("Scripting.Dictionary")
  10. Arr = Range(Cells(Rows.Count, 1).End(xlUp), Cells(1, 115))
  11. For x = 2 To UBound(Arr, 1)
  12.     T1 = ""
  13.     For y = 1 To 51
  14.         T1 = T1 & Arr(x, y)
  15.         If Arr(x, y) = "" Then T1 = T1 & "|"
  16.     Next y
  17.     T3 = ""
  18.     For y = 52 To 102
  19.         T3 = T3 & Arr(x, y)
  20.         If Arr(x, y) = "" Then T3 = T3 & "|"
  21.     Next y
  22.     T1 = T1 & T3 & Arr(x, 106)
  23.     ReDim Preserve E(x)
  24.     E(x) = T1
  25.     T3 = ""
  26.     If Arr(x, 103) = "" Then
  27.         Arr(x, 103) = 1
  28.         xD(T1) = xD(T1) + Arr(x, 103)
  29.     ElseIf Arr(x, 103) <> "" Then
  30.         xD(T1) = xD(T1) + Arr(x, 103) + 1
  31.     End If
  32.     xD(T1 & 105) = xD(T1 & 105) + Arr(x, 105)
  33.     xD(Arr(x, 106)) = xD(Arr(x, 106)) + 1
  34. Next x
  35. T1 = "": k = 2
  36. For Each D In xD
  37.     For x = 2 To UBound(Arr, 1)
  38.         If D = E(x) Then
  39.             Arr(x, 103) = xD(D) - 1
  40.             Arr(x, 105) = xD(D & 105)
  41.             If Arr(x, 107) <> "" Or Arr(x, 109) <> "" _
  42.             Or Arr(x, 115) <> "" Or Arr(x, 104) <> "" Then
  43.                  For y = 1 To UBound(Arr, 2)
  44.                      Arr(k, y) = Arr(x, y)
  45.                  Next y
  46.             k = k + 1
  47.             Exit For
  48.             End If
  49.         End If
  50.         If D = E(x) And xD(D) = 1 _
  51.         And Arr(x, 107) = "" And Arr(x, 109) = "" _
  52.         And Arr(x, 115) = "" And Arr(x, 104) = "" Then
  53.             For y = 1 To UBound(Arr, 2)
  54.                 Arr(k, y) = Arr(x, y)
  55.             Next y
  56.         k = k + 1
  57.         Exit For
  58.         End If
  59.     Next x
  60. If Arr(k - 1, 103) = 0 Then Arr(k - 1, 103) = ""
  61. If Arr(k - 1, 105) = 0 Then Arr(k - 1, 105) = ""
  62. Next D
  63. Set xD = Nothing: Erase E
  64. Sheets(2).Range("A1").Resize(k - 1, UBound(Arr, 2)) = Arr
  65. Erase Arr
  66. Application.ScreenUpdating = True
  67. Sheets(2).Select
  68. Rows(2).Select
  69. ActiveWindow.FreezePanes = True
  70. Cells(Rows.Count, 106).End(xlUp).Select
  71. End Sub
複製代碼

TOP

回復 59# wei9133

有空幫我試試看  這個應該可以  但是有一個很大的問題 ...如果資料很多 會跑非常慢....
  1. Public Sub 練習1116()
  2. Sheets(2).Select
  3. Rows(2).Select
  4. ActiveWindow.FreezePanes = False
  5. Application.ScreenUpdating = False
  6. Sheets(2).[A1].CurrentRegion.Clear
  7. Sheets(1).Select
  8. Dim Arr, D, xD, x&, y&, k&, T1$, T2$, T3$, T4$
  9. Set xD = CreateObject("Scripting.Dictionary")
  10. Arr = Range(Cells(Rows.Count, 1).End(xlUp), Cells(1, 115))
  11. For x = 2 To UBound(Arr, 1)
  12.     T1 = ""
  13.     For y = 1 To 51
  14.         T1 = T1 & Arr(x, y)
  15.         If Arr(x, y) = "" Then T1 = T1 & "-"
  16.     Next y
  17.     T3 = ""
  18.     For y = 52 To 102
  19.         T3 = T3 & Arr(x, y)
  20.         If Arr(x, y) = "" Then T3 = T3 & "-"
  21.     Next y
  22.     T1 = T1 & T3 & Arr(x, 106)
  23.     T3 = ""
  24.     If Arr(x, 103) = "" Then
  25.         Arr(x, 103) = 1
  26.         xD(T1) = xD(T1) + Arr(x, 103)
  27.     ElseIf Arr(x, 103) <> "" Then
  28.         xD(T1) = xD(T1) + Arr(x, 103) + 1
  29.     End If
  30.     xD(T1 & 105) = xD(T1 & 105) + Arr(x, 105)
  31.     xD(Arr(x, 106)) = xD(Arr(x, 106)) + 1
  32. Next x
  33. T1 = "": k = 2
  34. For Each D In xD
  35.     For x = 2 To UBound(Arr, 1)
  36.         T2 = ""
  37.         For y = 1 To 51
  38.             T2 = T2 & Arr(x, y)
  39.             If Arr(x, y) = "" Then T2 = T2 & "-"
  40.         Next y
  41.         T4 = ""
  42.         For y = 52 To 102
  43.             T4 = T4 & Arr(x, y)
  44.             If Arr(x, y) = "" Then T4 = T4 & "-"
  45.         Next y
  46.         T2 = T2 & T4 & Arr(x, 106)
  47.         T4 = ""
  48.         If D = T2 Then
  49.             Arr(x, 103) = xD(D) - 1
  50.             Arr(x, 105) = xD(D & 105)
  51.             If Arr(x, 107) <> "" Or Arr(x, 109) <> "" _
  52.             Or Arr(x, 115) <> "" Or Arr(x, 104) <> "" Then
  53.                  For y = 1 To UBound(Arr, 2)
  54.                      Arr(k, y) = Arr(x, y)
  55.                  Next y
  56.             k = k + 1
  57.             Exit For
  58.             End If
  59.         End If
  60.         If D = Arr(x, 106) And xD(D) = 1 _
  61.         And Arr(x, 107) = "" And Arr(x, 109) = "" _
  62.         And Arr(x, 115) = "" And Arr(x, 104) = "" Then
  63.             For y = 1 To UBound(Arr, 2)
  64.                 Arr(k, y) = Arr(x, y)
  65.             Next y
  66.         k = k + 1
  67.         Exit For
  68.         End If
  69.     Next x
  70. If Arr(k - 1, 103) = 0 Then Arr(k - 1, 103) = ""
  71. If Arr(k - 1, 105) = 0 Then Arr(k - 1, 105) = ""
  72. Debug.Print k
  73. Debug.Print D
  74. Next D
  75. T2 = "": Set xD = Nothing
  76. Sheets(2).Range("A1").Resize(k - 1, UBound(Arr, 2)) = ""
  77. Sheets(2).Range("A1").Resize(k - 1, UBound(Arr, 2)) = Arr
  78. Erase Arr
  79. Application.ScreenUpdating = True
  80. Sheets(2).Select
  81. Rows(2).Select
  82. ActiveWindow.FreezePanes = True
  83. Cells(Rows.Count, 106).End(xlUp).Select
  84. End Sub
複製代碼

TOP

回復 59# wei9133

如果左右不用比對 那就直接比對星象 再進行勝場 跟 敗場 加總可以嗎?

TOP

本帖最後由 軒云熊 於 2020-11-14 22:05 編輯

回復 59# wei9133

左右不用比對了嗎?    我把左右比對註解掉了  有空你再試試看 結果是否可以 感謝


javascript:;

對戰統計 -1114_.rar (30.91 KB)

TOP

本帖最後由 wei9133 於 2020-11-13 03:52 編輯

回復 58# 軒云熊


    你好,目前測試還有些問題,勝場加總部分對了
不過比對部分有些問題。
詳細請你看圖片







問題從這裡開始




如果論壇的圖不方便看的話
麻煩移駕相簿
(請從最後一張往前看)

TOP

回復 57# wei9133
幫我看一下 這結果 可不可以  感謝

javascript:;

對戰統計 -1111_.rar (33.61 KB)

TOP

回復 56# 軒云熊


  你好,粗略直接測試你給的檔案,你可能沒有比對到106(星象)欄
直接將檔案載回,並將星象欄以數列下拉
讓其變成1~17,執行之後理論上來講,因為17個星象位置都不同所以至少應該要有17列

實際效果卻是
有兩個14,16、17消失,代表這個在這裡已經是有問題的了

TOP

本帖最後由 軒云熊 於 2020-11-2 20:39 編輯

回復 55# wei9133

你有新增 工作表嗎?  用這個試試看  
我有把 jcchiang前輩的也放進去了  Sub ex5()  結果不太一樣  
再看看我哪裡有問題在告訴我 感謝

javascript:;

對戰統計 -1102_.rar (32.4 KB)

TOP

        靜思自在 : 時時好心就是時時好日。
返回列表 上一主題