2020年12月22日 星期二

VBA:Cells.SpecialCells 簡單應用+ 資料排序

有常在用進階篩選的我,要抓篩選後的資料,剛開始學習時,顯示篩選後的藍色區域(參圖1.)的可視範圍,一時半刻不知道該怎樣抓,後來再摸索後發現Cells有一個屬性SpecialCells,透過SpecialCells搜尋MSDN就找到答案了


圖1.篩選後

如圖1.紅框,篩選後字體會反藍色,但是一般抓資料的方式,卻無法直接抓取篩選後的資料。
這時候我們就要來利用一下Cells.SpecialCells的屬性;這個屬性有一個設定,為xlCellTypeVisible。

基本語法: SET a=ActiveSheet.Cells.SpecialCells(xlCellTypeVisible), 用宣告的方式來設置,必免記憶體爆了,要注意。

取得位置:上面宣告完了,透過即時運算就a.address取得位置。(如圖2)


圖2.區域變數與即時運算內容


簡單操作大概以上。
最近在某版刊到一個應用的例子。
圖3.案例(資料亂貼的狀態)
我借這個例子變化一下ActiveSheet.Cells.SpecialCells+迴圈+排序就搞定了。
新增一個ActiveX按鈕,將隨機資料貼在工作表1,並確認工作簿有工作表2,貼上以下CODE後,點選執行,再去看工作表2(如圖4),完工。
圖4.結果(執行後)
vba code參如下:(VBA設定教學),下載

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
view raw gistfile1.txt hosted with ❤ by GitHub

沒有留言:

張貼留言

指數變化(2025.03.28)

 指數變化(2025.03.28) 上周焦點: 美國消費者信心指數 3/25 92.9 美國耐久財訂單月增率 3/26 1.4 PCE 月增 0.4 年增 2.8 (不多阿,最高還有5.5ㄝ)   本周愛看: 美國非農業就業人數變化 美國ISM製造業採購經理人指數 美國芝加哥FE...