返回列表 上一主題 發帖

[原創] 以關鍵字篩選多個sheets的資料

[原創] 以關鍵字篩選多個sheets的資料

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

sonny1.gif
search record by keyword - Sonny_VER1.rar (21.89 KB)
ss

回復 1# sunnyso


    挺妙的東西,的確是有創意的想法
字典兩各字 還真難理解

TOP

本帖最後由 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()。

TOP

回復 9# GBKEE

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

TOP

本帖最後由 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)=“”, 來觸動更有效率.
謝謝.
ss

TOP

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


Cells.ClearContent並不會觸動 worksheet_change
ss

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 6# ML089

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

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

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

sonny2.gif
ss

TOP

回復  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

TOP

回復 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. 上方預留五行用高級篩選方處理,資料填完後按鈕由巨集來啟動高級篩選(半自動方式)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

        靜思自在 : 能幹不幹,不如苦幹實幹。
返回列表 上一主題