- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
26#
發表於 2016-2-27 10:28
| 只看該作者
回復 24# 千暉尋
這是我的作業心得報告,或許能幫助你進一步之了解,
將它貼上提供參考,在此篇議題中我覺得准大的解題
申論非常之棒,單刀切入直接了當,一揪即成。
在此亦感謝 准提部林版大 的不吝指導。- ' 篩選法!!! 准提部林
- ' 使用此方法 "彙總表" 之初始內容不須先行排序 (Sorting),亦即在保持原始狀況下直接進行篩選處裡
- Sub ex2()
- Dim xArea As Range, i&, T$, TT$, Sht As Worksheet
-
- With Sheets("彙總表")
- .Select
- Set xArea = .Range([B1], Cells(Rows.Count, "B").End(xlUp)(1, 4))
- ' xArea : Range/Range : xArea.Address = "$B$1:$E$7" : String
- End With
-
- For i = 2 To xArea.Rows.Count ' xArea.Rows.Count : 7 : Long, xArea.DataSeries : True : Variant/Boolean
- T = xArea(i, 1): Set Sht = Nothing ' i = 2 : Long
- ' -------------------------------------------------------------------------
- ' 為觀察 InStr(TT & "/", "/" & T & "/") 以及 TT = TT & "/" & T 的處理方式,
- ' 特將 "彙總表" 內容之順序事先預作調整如下,以方便偵測 TT 過程中扮演的角色。
- ' -------------------------------------------------------------------------
- ' 2(i) : xArea(i, 1) = "A" : xArea(i, 2) = "香蕉" : xArea(i, 3) = 10 : xArea(i, 4) = 100 : Variant/Object/Range
- ' 3(i) : xArea(i, 1) = "B" : xArea(i, 2) = "青椒" : xArea(i, 3) = 50 : xArea(i, 4) = 500 : Variant/Object/Range
- ' 4(i) : xArea(i, 1) = "A" : xArea(i, 2) = "葡萄" : xArea(i, 3) = 30 : xArea(i, 4) = 300 : Variant/Object/Range
- ' 5(i) : xArea(i, 1) = "B" : xArea(i, 2) = "鳳梨" : xArea(i, 3) = 40 : xArea(i, 4) = 400 : Variant/Object/Range
- ' 6(i) : xArea(i, 1) = "C" : xArea(i, 2) = "芭樂" : xArea(i, 3) = 60 : xArea(i, 4) = 600 : Variant/Object/Range
- ' 7(i) : xArea(i, 1) = "A" : xArea(i, 2) = "蘋果" : xArea(i, 3) = 20 : xArea(i, 4) = 200 : Variant/Object/Range
-
- If T = "" Or InStr(TT & "/", "/" & T & "/") Then GoTo 101
- ' ----------------------------------------------------------------------------------------------
- ' 2(i) : TT & "/" = "/" : "/" & T & "/" = "/A/" : InStr(TT & "/", "/" & T & "/") = 0 : Long
- ' 3(i) : TT & "/" = "/A" : "/" & T & "/" = "/B/" : InStr(TT & "/", "/" & T & "/") = 0 : Long
- ' 4(i) : TT & "/" = "/A/B" : "/" & T & "/" = "/A/" : InStr(TT & "/", "/" & T & "/") = 1 : Long
- ' 5(i) : TT & "/" = "/A/B" : "/" & T & "/" = "/B/" : InStr(TT & "/", "/" & T & "/") = 1 : Long
- ' 6(i) : TT & "/" = "/A/B" : "/" & T & "/" = "/C/" : InStr(TT & "/", "/" & T & "/") = 0 : Long
- ' 7(i) : TT & "/" = "/A/B/C" : "/" & T & "/" = "/A/" : InStr(TT & "/", "/" & T & "/") = 1 : Long
- ' ----------------------------------------------------------------------------------------------
- ' InStr(TT & "/", "/" & T & "/") 的意思為當第一次讀取過的工作表名稱會寫入到變數 TT 的字串中,
- ' 因為已經做過篩選了, 所以當再次讀取到曾記錄過的名稱時跳過, 而 "/" 則是要區分各工作表名的區隔,
- ' 不會重覆,讓 InStr 容易判斷,而不會產生錯誤的判斷;
- ' InStr(TT & "/", "/" & T & "/") 用 "/' 分隔可以清楚分別 A, AA, AAA 或 A1, A11, A111,而不會誤判!
- ' 而且理論上, 工作表名稱不會有 "/" 字元,若用其它符號,就要考慮工作表表名稱是否含有這個符號,
- ' 例如: 用 "-" 分隔,就可能對 1-1, 1-11, 1-111 造成相似工作表名稱之誤判!!
- ' ----------------------------------------------------------------------------------------------
- On Error Resume Next
-
- Set Sht = Sheets(T)
- On Error GoTo 0
-
- If Sht Is Nothing Then Set Sht = Sheets.Add(after:=Sheets(Sheets.Count)): Sht.Name = T ' Sht 不存在
- Sht.UsedRange.Clear
-
- With xArea
- .Parent.Select ' xArea.Parent.Name = "彙總表" : Variant/String
- .AutoFilter Field:=1, Criteria1:=T ' T = "A" : T = "B" : T = "C" : String
- ' AutoFilter 會依據 Criteria1 的條件匯集,標題位置並不會異動
- .Copy Sht.[B1] ' 包含標題與內容一一複製到 "A"、"B"、"C" 各別的工作表單內
- End With
-
- TT = TT & "/" & T ' TT = "/A" : TT = "/A/B" : TT = "/A/B/C" : String (判斷字串 TT 逐一增加)
- 101:
- Next i
-
- ActiveSheet.AutoFilterMode = False ' 回復到原始最初的 "彙總表" 之排序前內容順序
- End Sub
複製代碼 |
-
1
評分人數
-
|