• 3

各位好,想請問關於Excel篩選功能配合VBA使用,有沒有辦法達成「跳到下一個項目」

misser wrote:
何不乾脆把程式碼變得更有「彈性」(通用)一點


說彈性,我2樓給的範例也很有彈性,跑一次就全分類好了
欄位也只要改一個字,看是要用inputbox,還是ActiveCell.Column…

至於,工作表另存獨立新檔案、工作表內容新增(複製)到舊檔案
用outlook寄信、工作表另存pdf…等等
之後只要加個副程式就行,而這些功能隨便google一下,就一大堆範例
只是樓主最後決定用同一頁切來切去的,所以該範例不適用


另外,發現您的範例有一個小bug,您可以試試先篩選a欄、再篩選b欄



misser wrote:
如果還要為每個表格手動操作樞紐分析表


不需要樞紐分析表的方法,請參考
只有更換欄位時,才更新篩選條件
可避免同欄位連續篩選時,因大量迴圈,造成效能降低的問題


Dim List_Index As Integer, Col_Old As Integer, Col_New As Integer, List()

Sub test2()

Col_New = ActiveCell.Column
If Cells(1, Col_New) = "" Then
List_Index = 0
Sheets("sheet1").Shapes("Bevel 5").TextFrame.Characters.Text = "請選擇任一有資料欄位" & Chr(13) & "(可選空白儲存格)"
Exit Sub
End If
Dim Source As Range, LastRow As Long, LastCol As Integer

LastRow = Sheets("sheet1").UsedRange.Rows.Count
LastCol = Sheets("sheet1").Cells(1, Columns.Count).End(xlToLeft).Column
Set Source = Sheets("sheet1").Range(Sheets("sheet1").Cells(1, Col_New), Sheets("sheet1").Cells(LastRow, Col_New))

If Col_New = Col_Old Then
'use old list
Else
If Col_Old > 0 Then Sheets("sheet1").Range(Columns(1), Columns(LastCol)).AutoFilter Field:=Col_Old
Call Get_List(Source, LastRow)
Col_Old = Col_New
List_Index = 0
End If

If List_Index > UBound(List()) Then List_Index = 1 Else List_Index = List_Index + 1
Sheets("sheet1").Range(Columns(1), Columns(LastCol)).AutoFilter Field:=Col_New, Criteria1:=List(List_Index - 1, 0)
'注意:如果要用時間當篩選條件
'List(List_Index - 1, 0)需另外處理成和工作表相同的時間格式,才能正常篩選

'debug

Sheets("sheet1").Shapes("Bevel 5").TextFrame.Characters.Text = "test2:" & "欄位=" & Chr(96 + Col_New) & _
",不重覆項目:" & UBound(List()) + 1 & "筆" & Chr(13) & _
List(List_Index - 1, 0) & ":篩選第" & List_Index & "筆,合計=" & List(List_Index - 1, 1) & "筆)"


End Sub


Sub Get_List(Source As Range, LastRow As Long)

Dim dic As Object, i As Long
Set dic = CreateObject("Scripting.Dictionary")

For i = 2 To LastRow
dic(Source(i, 1).Value) = dic(Source(i, 1).Value) + 1
Next i

ReDim List(dic.Count - 1, 1)
For i = 0 To dic.Count - 1
List(i, 0) = dic.keys()(i)
List(i, 1) = dic.items()(i)
Next i

Set dic = Nothing

End Sub



[點擊下載]
misser wrote:
呃,我想,如果你的篩(恕刪)

snare wrote:
說彈性,我2樓給的範(恕刪)


感謝Misser大和Snare大特地修改範例
M大說的沒錯,確實很多不同表格聽起來似乎更需要可以時常修正所需套用欄位的功能,不過目前我會經手的資料還算是固定內容,我是用很簡單的VBA將傳來的資料全部整理好,做成我要的格式,然後依照內容整理再一起,最後再依照姓名一個個分開

簡單說來源模式是固定的,只是最後一個步驟太花時間,所以才會想可以用VBA來簡化

而最後一個步驟分開存檔的檔案,每天都一定要做的大概五種,目前M大漢S大協助我可以簡單完成的是第一種

所以我才會想說只要能修改套用的欄位,我就可以讓每天的五種都自動分開了

不過說真的,目前用到M大一開始寫的全部分成新頁籤的功能確實是已經非常方便了呢

但按鈕跟自動切換篩選功能也是用得很開心

現在都要想哪一個會更快呢



真是太感謝兩位了

稻草人到處草人 wrote:
目前用到M大一開始寫的全部分成新頁籤


呃,我有寫過這個嗎?你指的會不會是snare大一開始提供給你的參考範例?............

稻草人到處草人 wrote:
更需要可以時常修正所需套用欄位的功能


我會提到,是因為怕把程式寫死了(col_f=2 '固定篩B欄),你每次套用時都改在程式裡修改(今天篩B欄,明天新資料換篩C欄....),所以我最後提供給你的修改範例,是用你當下的作用儲存格,來作為本次篩選欄的依據,讓你(使用者不用)進程式改成 col_f=3


snare wrote:
說彈性,我2樓給的範例也很有彈性,跑一次就全分類好了
欄位也只要改一個字,看是要用inputbox,還是ActiveCell.Column…


所以我跟版主提過,未來還是朝向:一個按鍵把所有工作完成(從A模式進階成B模式)是最好的策略。(包括收集,整理,分檔...),不過這部分就留給版主「練手」囉,畢竟資料範圍、步驟如何、成果怎麼做才對.....這些都是版主最了解,也才能找出最佳解決策略。

(比如:篩選的欄位名稱有沒有規律?假設就是:名字、OO、XX三種可能,那甚至可以讓程式自動判斷.....今天打開新表格,程式自動找出表格裡有沒有符合的欄位來做篩選....使用者連先選欄位的步驟都省下.......之類)。

整個流程的「眉眉角角」了解越多,越能夠修正到符合自己的需求。

這過程經驗累積是很重要的,先預祝版主「功力大成」囉。

snare wrote:
您可以試試先篩選a欄、再篩選b欄


這問題我有先想到耶,不過昨晚時間關係,我想從版主的問題來看,應該會是一直切換篩選到底(新資料才考慮換欄位),所以就直接偷懶「跳過」囉。(哈哈.....)
Der,misser1
misser wrote:
呃,我有寫過這個嗎?(恕刪)

抱歉抱歉,看來是我搞錯名字了,分頁功能是S大提供以前的範例當作參考的
不過因為M大S大的功能都有牽涉到宣告、變數,感覺幾乎沒基礎的我真的要花不少時間才能徹底了解涵義功能善用方法

  • 3
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?