Board logo

標題: AutoFilter 「讀出」Criteria的判別式 [打印本頁]

作者: mpegwmvavi    時間: 2015-6-18 13:29     標題: AutoFilter 「讀出」Criteria的判別式

一般常見的都是寫入criteria後進行篩選
譬如要篩選C欄是"甲"或"乙"或"丙"的儲存格
vba語法會是 Column("C:"C").Autofilter field:=1,Criteria1:=Array("甲","乙","丙")

現在我需要的是我有很多欄要進行篩選,
我想把篩選的條件紀錄下來,
之後在其他有同樣欄位的sheet用這些criteria進行篩選
下面語法除了篩選「時間」外運行都ok

思路:

先創建一陣列A,用來儲存每欄的篩選條件

1.先判斷該欄是否有篩選
2.如果是,再判斷Criteria1是否是陣列
若是陣列,則表示篩選數量>=3且criteria2無定義,
=>把criteria1讀入陣列A
3.如果criteria1不是陣列,則篩選數量不是1就是2,
接著判斷1或2的方法是利用operator,如果operator是0,表示篩選數量是1
4.else就一定是篩選數量=2,此時criteria1和criteria2各儲存一個值
  1. Sub 篩選條件()
  2. Range("A1:C10").Autofilter   '對A1至C10進行篩選
  3. Dim ConditionArray(1 to 3)   '創一陣列,儲存每欄的篩選條件

  4. With Range("A1:C10").Autofilter
  5. For i=1 to .Filters.Count   '逐欄判斷
  6.     If .Filters(i).On Then  '判斷該欄有無篩選
  7.         If isarray(.Filters(i).Criteria1) Then
  8.             ConditionArr(i)=.Filters(i).Criteria1   '該欄篩選數量>=3,以陣列方式存入ConditionArr
  9.         End if
  10.     Elseif .Filters(i).Operator Then  '如果是0(篩選數量=1)則返回false
  11.         ConditionArr(i)=.Filters(i).Criteria1
  12.     Else
  13.         Dim temp(1 to 2)    '創一暫存陣列,讓條件1和2存成陣列
  14.         temp(1)=.Filters(i).Criteria1
  15.         temp(2)=.Filters(i).Criteria2
  16.         ConditionArr(i)= temp  將暫存陣列存入ConditionArr陣列
  17.     End if
  18. Next

  19. End with

  20. End sub
複製代碼
之後再讀出即可
  1. For i = 1 To 3
  2.     If IsEmpty(CondiArr(i)) Then GoTo Jump
  3.       If IsArray(CondiArr(i)) Then   
  4.         ReDim RedoArr(1 To UBound(CondiArr(i)))   
  5.         For j = 1 To UBound(CondiArr(i))
  6.         
  7.             RedoArr(j) = Mid(CondiArr(i)(j), 2, Len(CondiArr(i)(j)) - 1)    '去除等號
  8.         Next j

  9.             ActiveSheet.Range(Cells(1, 1), Cells(Last_row, LC2)).AutoFilter Field:=i, Criteria1:=RedoArr, Operator:=xlFilterValues
  10.         Else
  11.             ActiveSheet.Range(Cells(1, 1), Cells(Last_row, LC2)).AutoFilter Field:=i, Criteria1:=CondiArr(i), Operator:=xlFilterValues
  12.      End If
  13. Jump:
  14. Next
複製代碼
我遇到的困難是,如果有某一欄是時間,
且時間譬如篩5月和6月,
這樣在一開始判斷isarray的criteria1時,會出現criteria1應用程式錯誤
且透過criteria2監看式,會發現criteria2也是應用程式錯誤
但透過錄製巨集(錄製篩選時間)會發現時間欄都存在criteria2
要如何才能把篩選時間的條件儲存下來呢?
作者: mpegwmvavi    時間: 2015-6-19 13:02

回復 1# mpegwmvavi


QQ",都沒人回

我自己做了個檔案(無時間的欄位篩選,和有時間的欄位篩選)
"篩選1"的工作表運行都ok
可以順利讀出篩選條件,並輸出篩選條件在"輸出篩選條件1"這個sheet
"篩選2"的工作表把第四欄換成時間
在要讀出篩選條件的時候,會出錯
出錯的語句截圖如下
http://iamjo.myweb.hinet.net/Error image.PNG
透過監看式可以得知程式跑到時間這一欄時,criteria1和2都沒有存取任何值
有人知道怎麼讀出時間的篩選條件嗎
希望有高手指點一下,謝謝

檔案:
(一直不能上傳excel,我放在我的空間裡)
http://iamjo.myweb.hinet.net/Autofilter.xls
作者: mpegwmvavi    時間: 2015-6-19 13:33

回復 2# mpegwmvavi


找到外國相關的帖子,發問者和我遇到一模一樣的問題XD
http://answers.microsoft.com/en-us/office/forum/office_2007-customize/autofilter-criteria-with-xlfiltervalues-and-dates/90da7c5a-c813-4182-9849-c57ab72dac63
錄製篩選時間欄會發現,篩選的條件儲存在criteria2
但是卻無法把criteria2讀進另一個陣列儲存起來
會出現應用程式錯誤1004
帖子到最後也是無解...
希望版主群能幫幫我啊~~:'(
謝謝




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)