Board logo

標題: [原創] 以關鍵字篩選多個sheets的資料 [打印本頁]

作者: sunnyso    時間: 2013-5-10 01:33     標題: 以關鍵字篩選多個sheets的資料

這是使用VBA的方法, 過幾天再做個用函數(不用VBA)的方法

[attach]14940[/attach]
[attach]14941[/attach]
作者: ML089    時間: 2013-5-11 09:19

回復 1# sunnyso

寫的不錯,構想也不錯

如果一開始沒有篩選關鍵字時,如何改為全部顯示

目前一列關鍵字的關係式是 AND,是否能多幾列為 OR
作者: sunnyso    時間: 2013-5-11 16:10

回復  sunnyso

寫的不錯,構想也不錯

[1] 如果一開始沒有篩選關鍵字時,如何改為全部顯示

目前一列關 ...
ML089 發表於 2013-5-11 09:19


[1] 在 For Each sh In all_datasheets的Next 前加入, "Cells(dst_row, 1).Resize(src_rows, clmn1) = tmp_data" 即可

[2] 若要用OR 就要改動多一些代碼, 過兩天改一下放上來.
  1.     For Each sh In all_datasheets
  2. ......
  3. ......
  4.         Cells(dst_row, 1).Resize(src_rows, clmn1) = tmp_data
  5.     Next
複製代碼

作者: ML089    時間: 2013-5-11 16:19

回復 3# sunnyso


    改成這樣好用多了

表頭我設好字型與顏色,只要一執行VBA後就會被清除? 有辦法不被清除嗎?
作者: sunnyso    時間: 2013-5-12 02:50

回復  sunnyso


    改成這樣好用多了

表頭我設好字型與顏色,只要一執行VBA後就會被清除? 有辦法不 ...
ML089 發表於 2013-5-11 16:19


1. 在AA欄設計表頭的字型與顏色等 (VBA Sheet)
2. 添加VBA OR篩選,在關鍵字前加#
3. 添加非VBA方法,當中沒有使用陣列和陣列函數(如small, min等),以及盡量避免使用IF函數(因此篩選後的資料順序是3個sheets交錯)。以免資料增加會令計算過長。

請指教。

[attach]14952[/attach]
[attach]14953[/attach]
作者: ML089    時間: 2013-5-12 06:36

回復 5# sunnyso

>1. 在AA欄設計表頭的字型與顏色等 (VBA Sheet)
沒有試成功

>2. 添加VBA OR篩選,在關鍵字前加#
這部分用的有點不順
如能像高階篩選方式比較簡單,同一列為AND,不同列為OR
VBA可以再同一列以 ";" 區分為不同列方式,
例如
小項=早;午,S=A 表示取出 OR(AND(小項=早,S=A), AND(小項=午,S=A))
小項=早;午,S=A;B 表示取出 OR(AND(小項=早,S=A), AND(小項=午,S=B))

>3. 添加非VBA方法,當中沒有使用陣列和陣列函數(如small, min等),以及盡量避免使用IF函數(因此篩選後的資料順序是3個sheets交錯)。以免資料增加會令計算過長。
公式大概只能這樣做,全部先引用過來篩選   


以前用巨集練習過此類問題,看你使用VBA來處理所以特別有興趣。如果你累了不用管我的需求。謝謝
以前是分解動作
1. 將各Sheets資料複製再一起
2. 上方預留五行用高級篩選方處理,資料填完後按鈕由巨集來啟動高級篩選(半自動方式)
作者: c_c_lai    時間: 2013-5-12 19:54

回復  sunnyso

寫的不錯,構想也不錯

如果一開始沒有篩選關鍵字時,如何改為全部顯示

目前一列關 ...
ML089 發表於 2013-5-11 09:19

回復 3# sunnyso
Private Sub Worksheet_Activate()
    ' ....
    ' ....
    Cells.ClearContents
    ' ....
    ' ....
    ' ....
    Next
    '  設定無篩選關鍵字輸入,每次啟動該頁面即顯示全部內容
    '  以下Null("")宣告,系統會自動觸發Worksheet_Change()
    Cells(4, 1) = ""   
    Application.ScreenUpdating = True
End Sub
作者: sunnyso    時間: 2013-5-12 19:54

回復 6# ML089

1. 設置表頭格式 (見下圖)

2. 很好的建議, 有時間再作修改

3. 由於某種特殊情況下, 不能使用有巨集的檔案, 所以才設計該方案, 放上來跟大家分享.

[attach]14955[/attach]
作者: GBKEE    時間: 2013-5-12 21:34

本帖最後由 GBKEE 於 2013-5-12 21:36 編輯

回復 5# sunnyso
你的程式改用自動篩選 試試看
  1. Option Explicit
  2. Private Sub Worksheet_Activate()
  3.     Dim Sh As Worksheet, E As Integer
  4.     Application.ScreenUpdating = False
  5.     Application.EnableEvents = False
  6.     AutoFilterMode = False
  7.     E = Cells(Rows.Count, "A").End(xlUp).Row
  8.     E = IIF(E = 5, 6, E)
  9.     Range("A6:E" & E).Clear
  10.     For Each Sh In Sheets(Array("DataSheet2", "DataSheet3", "DataSheet3"))
  11.         Sh.UsedRange.Offset(1).Copy Cells(Cells(Rows.Count, "A").End(xlUp).Row + 1, "A")            '合併資料
  12.     Next
  13.     E = Cells(Rows.Count, "A").End(xlUp).Row
  14.     Range("A5:E" & E).AutoFilter                '範圍設立,自動篩選.
  15.     For E = 1 To 5
  16.         Range("A5").AutoFilter E, , , , False   '自動篩選: 取消箭頭
  17.     Next
  18.     Application.EnableEvents = True
  19.     Application.ScreenUpdating = True
  20. End Sub
  21. Private Sub Worksheet_Change(ByVal Target As Range)
  22.     Dim M As Variant
  23.     Application.EnableEvents = False
  24.     If Target.Row = 4 And Target.Column <= 5 Then
  25.         M = Split(Target, "#")
  26.         If UBound(M) >= 1 Then   '
  27.            '自動篩選: 在關鍵字詞前加入【#】將以OR來篩選該欄。
  28.             Range("A5").AutoFilter Target.Column, "=*" & M(0) & "*", xlOr, "=*" & M(1) & "*"
  29.         Else
  30.             Range("A5").AutoFilter Target.Column, "=*" & Target & "*"
  31.         End If
  32.     End If
  33.     Application.EnableEvents = True
  34. End Sub
  35. Private Sub Worksheet_SelectionChange(ByVal Target As Range)  '第4列輸入後返回第4列
  36.     Application.EnableEvents = False
  37.     If Target.Row = 5 And Target.Column <= 5 Then
  38.         Selection.Offset(-1).Select         'Target.Offset(-1).Select
  39.     End If
  40.     Application.EnableEvents = True
  41. End Sub
複製代碼

作者: sunnyso    時間: 2013-5-12 22:25

回復  sunnyso
Private Sub Worksheet_Activate()
    ' ....
    ' ....
    Cells.ClearContent ...
c_c_lai 發表於 2013-5-12 19:54


Cells.ClearContent並不會觸動 worksheet_change
作者: sunnyso    時間: 2013-5-12 22:32

本帖最後由 sunnyso 於 2013-5-12 22:34 編輯
Cells.ClearContent並不會觸動 worksheet_change
sunnyso 發表於 2013-5-12 22:25

回復 7# c_c_lai

對不起沒有寫完就按錯鍵
Cells.ClearContent並不會觸動 worksheet_change
用Cells(4,1)=“”, 來觸動更有效率.
謝謝.
作者: sunnyso    時間: 2013-5-12 23:10

回復 9# GBKEE

感謝GBKEE大大的code, 效率更高
有一點小小的地方,就是如果datasheet(i) 的A欄最後一列假如因爲輸入錯誤為空白會出錯
如果把
    Cells(Rows.Count, "A").End(xlUp).Row
改爲
    UsedRange.Rows.Count
好像可以避免。不知道這樣改妥當嗎?
作者: c_c_lai    時間: 2013-5-13 06:54

本帖最後由 c_c_lai 於 2013-5-13 07:01 編輯
Cells.ClearContent並不會觸動 worksheet_change
sunnyso 發表於 2013-5-12 22:25

你寫的內容真的很不錯,也蠻有構思的。 GBKEE 的補充也蠻具體實用。
不好意是、補充一下我指的是紅色的 Cells(4, 1) = "",而非   
Cells.ClearContent,因為在一開始所有內容均被清除掉了,
之後當  Cells(4, 1) Cells(4, 2) Cells(4,3) Cells(4, 4)
或者是 Cells(4, 5) 內容中有所任何一組異動時,便會觸發
worksheet_change()。
作者: freeffly    時間: 2013-6-21 13:18

回復 1# sunnyso


    挺妙的東西,的確是有創意的想法




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