有常在用進階篩選的我,要抓篩選後的資料,剛開始學習時,顯示篩選後的藍色區域(參圖1.)的可視範圍,一時半刻不知道該怎樣抓,後來再摸索後發現Cells有一個屬性SpecialCells,透過SpecialCells搜尋MSDN就找到答案了
如圖1.紅框,篩選後字體會反藍色,但是一般抓資料的方式,卻無法直接抓取篩選後的資料。
這時候我們就要來利用一下Cells.SpecialCells的屬性;這個屬性有一個設定,為xlCellTypeVisible。
基本語法: SET a=ActiveSheet.Cells.SpecialCells(xlCellTypeVisible), 用宣告的方式來設置,必免記憶體爆了,要注意。
取得位置:上面宣告完了,透過即時運算就a.address取得位置。(如圖2)
簡單操作大概以上。
最近在某版刊到一個應用的例子。
圖3.案例(資料亂貼的狀態)
我借這個例子變化一下ActiveSheet.Cells.SpecialCells+迴圈+排序就搞定了。
新增一個ActiveX按鈕,將隨機資料貼在工作表1,並確認工作簿有工作表2,貼上以下CODE後,點選執行,再去看工作表2(如圖4),完工。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Private Sub CommandButton1_Click() | |
Set a = ActiveSheet.Cells.SpecialCells(xlCellTypeConstants) '這邊是用常數設定(xlCellTypeConstants)取得資料非用可視部分(xlCellTypeConstants) | |
Total = "" '資料堆壘用 | |
For Each a_out In a '迴圈堆壘資料 | |
If Total = "" Then | |
Total = a_out.Value | |
Else | |
Total = Total & "@" & a_out.Value | |
End If | |
Next | |
Sheets("工作表2").Range("a1:" & "a" & a.Count) = WorksheetFunction.Transpose(Split(Total, "@")) '寫入上資料 | |
'排序資料 | |
Sheets("工作表2").Range("a1:" & "a" & a.Count).Sort Key1:=Sheets("工作表2").Range("a1:" & "a" & a.Count), Order1:=xlAscending, Header:=xlNo, _ | |
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ | |
:=xlStroke, DataOption1:=xlSortNormal | |
End Sub |
沒有留言:
張貼留言