返回列表 上一主題 發帖

VBA做篩選

回復  c_c_lai
.Replace E, "=XXX", xlWhole  的作用何在?  將資料庫要搜尋的字串一次變為無效的公式(錯 ...
GBKEE 發表於 2013-9-1 15:53

謝謝您的詮釋,字面上意義我都了解,
原本我要的是為何如此處哩,以及用意。
經實際 Debug 終於瞭解實際的巧妙應用,
謝謝你!

TOP

G大版主你好..不好意思..另有一個小問題想請教..如圖所示 :

9999999999999999.JPG (77.08 KB)

9999999999999999.JPG

檢查重覆.rar (18.39 KB)

TOP

回復 15# sillykin
  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     Dim D(1 To 6) As Object, i As Integer, R As Variant
  4.     For i = 1 To 6
  5.         Set D(i) = CreateObject("Scripting.Dictionary")
  6.         With Sheet1
  7.             For Each R In .Range("A2", .[A2].End(xlDown)) '
  8.                  D(i)(R.Offset(, i - 1).Value) = ""
  9.             Next
  10.         End With
  11.         Controls("ComboBox" & i).List = Application.Transpose(D(i).keys)
  12.         'ComboBox六個選項須重新,依序命名 ComboBox1(組別) ...-> ComboBox6(元)
  13.     Next
  14. End Sub
  15. Private Sub CommandButton1_Click() '篩選條件
  16.     Dim Rng As Range, i As Integer
  17.     Application.ScreenUpdating = False
  18.     Set Rng = ActiveSheet.Range("$A$1:$Q$300")
  19.     Rng.Parent.AutoFilterMode = False   '顯示全部資料 ->新的 多重篩選 才會確.
  20.     '多重篩選  ..........
  21.     For i = 1 To 6
  22.         With Controls("ComboBox" & i)
  23.             If .Value <> "" Then
  24.                 Rng.AutoFilter Field:=i, Criteria1:=.Value & "*" '
  25.             End If
  26.         End With
  27.     Next
  28.     Application.ScreenUpdating = True
  29. End Sub
  30. Private Sub CommandButton4_Click()
  31.     With ActiveSheet.Range("$A$1:$Q$300") '範圍
  32.         .Parent.AutoFilterMode = False   '顯示全部資料 ->取消 多重篩選
  33.     End With
  34. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

G大版主你好..不好意思在吵你一下..
For i = 1 To 6

22.        With Controls("ComboBox" & i)

23.            If .Value <> "" Then

24.                Rng.AutoFilter Field:=i, Criteria1:=.Value & "*" '

25.            End If

26.        End With
是控制ComboBox" & i (1~6的控制選項)
如果SHEET1欄位值為A~D欄位及F欄位及G欄位..要如何下VBA程式呢??
因FOR 1 TO 6 為連續ComboBox選A~F欄位
請G大版主點一下..小弟不才..謝謝

TOP

本帖最後由 GBKEE 於 2013-9-4 10:36 編輯

回復 18# sillykin
  1. Option Explicit
  2. Option Base 1  '<- 下限值為 1  ; 若要設下限值為 0,則 Option Base 陳述式是不需要的。

  3. Dim Ar(), Ax()                            '這模組中的程式可用之變數
  4. Private Sub UserForm_Initialize()
  5.     Dim D(1 To 6) As Object, i As Integer, R As Variant
  6.     '********如果SHEET1欄位值為A~D欄位及F欄位及G欄位..***
  7.     Ar = Array(1, 2, 3, 4, 6, 7)   '設定欄位
  8.     '****************************************************
  9.     Ax = Array(ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, ComboBox6)    'ComboBox六個選項內容依序為 組別,姓名1....
  10.     With Sheet1
  11.         .AutoFilterMode = False   '顯示全部資料 ->新的 多重篩選 才會確.
  12.         For i = 1 To 6
  13.             Set D(i) = CreateObject("Scripting.Dictionary")
  14.             For Each R In .Range("A2", .[A2].End(xlDown))
  15.                  '************ 若預設的下限值為 0  ->   i - 1   *******************************************************
  16.                  'D(i)(R.Offset(, Ar(i - 1) - 1).Value) = ""    'i = 1 時 若預設的下限值為0 則需Ar(i - 1)-> Ar(0) = 1'*
  17.                  '*****************************************************************************************************
  18.                  D(i)(R.Offset(, Ar(i) - 1).Value) = ""
  19.             Next
  20.             Ax(i).List = Application.Transpose(D(i).keys)
  21.         Next
  22.     End With
  23. End Sub
  24. Private Sub CommandButton1_Click() '篩選條件
  25.     Dim Rng As Range, i As Integer
  26.     Application.ScreenUpdating = False
  27.     Set Rng = ActiveSheet.Range("$A$1:$Q$300")
  28.     Rng.Parent.AutoFilterMode = False       '顯示全部資料 ->新的 多重篩選 才會確.
  29.     For i = 1 To 6                          '多重篩選  ..........
  30.         '************ 若預設的下限值為 0  ->   i - 1   *****************************************************
  31.         'If Ax(i - 1).Value <> "" Then Rng.AutoFilter Field:=Ar(i - 1), Criteria1:=Ax(i - 1).Value & "*"  '*
  32.         '***************************************************************************************************
  33.         If Ax(i).Value <> "" Then Rng.AutoFilter Field:=Ar(i), Criteria1:=IIf(i <> 5, Ax(i).Value & "*", Ax(i).Value)
  34.                                                                '元(F欗)為數值不可用 * 來篩選
  35.     Next
  36.     Application.ScreenUpdating = True
  37. End Sub
  38. Private Sub CommandButton4_Click()
  39.     With ActiveSheet.Range("$A$1:$Q$300") '範圍
  40.         .Parent.AutoFilterMode = False   '顯示全部資料 ->取消 多重篩選
  41.     End With
  42. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復  sillykin
試試看
GBKEE 發表於 1/9/2013 15:05



    g大版主你好..小弟不才..也謝謝版主耐心的教導
承前題回覆6的公式

01.Option Explicit

02.Sub Ex()

03.    Dim Rng(1 To 3) As Range, i As Integer, E As Range

04.    With Sheets("Sheet1")          ' "Sheet1" 工作表名稱

05.        .Cells.Interior.ColorIndex = xlNone

06.        Set Rng(1) = .Range("A:F").SpecialCells(xlCellTypeConstants)                              '資料庫

07.        .Range("G:G") = ""

08.        Set Rng(3) = Rng(1).Rows(1)

09.        For i = 3 To 5                                      'C欄、D欄、E欄位做為準則

10.            .Cells(1, .Columns.Count) = Rng(1).Cells(1, i)  '欄位做為準則

11.            Rng(1).Columns(i).AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True       '篩選不重複的資料

12.            Set Rng(2) = .Range(.Cells(2, .Columns.Count), .Cells(2, .Columns.Count).End(xlDown))  '篩選出的資料範圍

  For i = 3 To 5                                      'C欄、D欄、E欄位做為準則
如果更改為C欄、E欄位做為準則 ;D欄不做準則
那做法是不是跟你上一題的方式一樣呢????

TOP

回復 20# sillykin
可依樣畫葫蘆試試看,有問題可再提問(多練習VBA會進步的)
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 21# GBKEE


    G大版主..又一個小問題請教...
如果改為CheckBox勾選做為準則呢..這要如何去處理呢????

檢查重覆.rar (25.86 KB)

TOP

回復 18# sillykin
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng(1 To 3) As Range, i As Integer, E As Range
  4.     'With Sheets("Sheet1")          ' "Sheet1" 工作表名稱
  5.    
  6.     With Sheet1                     ' Sheet1  工作表物件名稱
  7.         .Cells.Interior.ColorIndex = xlNone
  8.         Set Rng(1) = .Range("A:F").SpecialCells(xlCellTypeConstants)                                    '資料庫
  9.         .Range("G:G") = ""
  10.         Set Rng(3) = Rng(1).Rows(1)
  11.         For i = 1 To 7                                                                                  'C欄、D欄、E欄位做為準則
  12.            MsgBox .OLEObjects("CheckBox" & i).Object
  13.             If .OLEObjects("CheckBox" & i).Object.Value = True Then     '有勾選=.Value = True       *****
  14.                 .Cells(1, .Columns.Count) = Rng(1).Cells(1, i)                                          '欄位做為準則
  15.                 Rng(1).Columns(i).AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True        '篩選不重複的資料
  16.                 Set Rng(2) = .Range(.Cells(2, .Columns.Count), .Cells(2, .Columns.Count).End(xlDown))   '篩選出的資料範圍
  17.                 For Each E In Rng(2)
  18.                     If Application.CountIf(Rng(1).Columns(i), E) > 1 Then                               ' 資料在資料庫裡的資料數大於1
  19.                         With Rng(1).Columns(i).Cells
  20.                             .Replace E, "=XXX", xlWhole                                                 '更改為錯誤值
  21.                             With .SpecialCells(xlCellTypeFormulas, xlErrors)                            '錯誤值的特殊範圍裡
  22.                                 .Value = E                                                              '置回原來的資料
  23.                                 Set Rng(3) = Union(Rng(3), .Cells)                                      '加入範圍
  24.                                 .Interior.Color = vbYellow
  25.                                 .Offset(, Rng(1).Columns.Count + 1 - i) = "重覆請查核"
  26.                             End With
  27.                         End With
  28.                     End If
  29.                 Next
  30.             End If
  31.         Next
  32.         .Cells(1, .Columns.Count).EntireColumn = ""
  33.         Set Rng(3) = Application.Intersect(.Cells, Rng(3).EntireRow)  '整合為整列
  34.     End With
  35.     With Sheets("Sheet2")
  36.         .Cells.Clear
  37.         Rng(3).Copy .Range("A1")
  38.         .Cells.Interior.ColorIndex = xlNone
  39.         .Cells.EntireColumn.AutoFit
  40.     End With
  41. End Sub
複製代碼


感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

謝謝g大版主的教導...小弟由衷感謝

TOP

        靜思自在 : 人的心地是一畦田,土地沒有播下好種子,也長不出好的果實。 -
返回列表 上一主題