前景提要
平時的工作中我們經常要和Excel進行打交道,所以對於Excel方面的需求也是多種多樣的,有時候我們需要針對工作表進行合併操作,將多個工作表的內容合併到一個工作表中進行分析,這樣更加的高效,但是有時候我們有需要反過來,將總表的數據按照某種規則進行拆分,拆分成多個工作表,這樣我們就能夠針對個體進行分析了,所以今天我們就來學習下,如果通過VBA來實現工作表按照列來進行拆分的需求
需求說明
將總表按照某列進行拆分,肯定是我們手上的報表是一個總表,我們需要針對個體進行分析,所以這個時候就會使用到針對總表的拆分,我們看看手上的這份報表
我們現在需要將這個工作表按照班級來進行拆分,每個班級一個工作表這樣的形式,方便我們針對班級來進行成績分分析
如果手工操作,你會選擇怎麼操作呢?
將這班級這一列進行篩選,從上往下一個班級篩選一次,然後新建工作表,然後複製粘貼,然後來來一個循環,非常的麻煩,我們一直都強調高效辦公的,那麼碰到這樣的情況,用VBA來如何實現呢?
代碼區
Sub chai()
Dim rng As Range, trng As Range, arr, sthn As Worksheet
Set trng = Application.InputBox("請選擇標題欄", "標題欄的確定", , , , , , 8)
TitleR = trng.Rows.Count
TitleC = trng.Column
Set rng = Application.InputBox("請選擇要拆分的參照列", "參照列的確定", , , , , , 8)
num = ActiveSheet.Index
TargetCol = rng.Column - (TitleC - 1)
Worksheets.Add after:=Worksheets(Worksheets.Count)
rng.Copy Cells(1, 1)
With ActiveSheet.UsedRange
.RemoveDuplicates 1, xlNo
End With
l = Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range(Cells(2, 1), Cells(l, 1))
arr = rng
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
For i = 1 To UBound(arr)
Worksheets.Add after:=Worksheets(Worksheets.Count)
Set sthn = ActiveSheet
ActiveSheet.Name = arr(i, 1)
Worksheets(num).Activate
Rows(TitleR).AutoFilter Field:=TargetCol, Criteria1:="=" & arr(i, 1) & ""
With ActiveSheet.UsedRange
.SpecialCells(xlCellTypeVisible).Copy sthn.Cells(1, 1)
End With
Next i
Rows(TitleR).AutoFilter
End Sub
來看看代碼執行的過程
首先代碼會需要我們選擇表頭,這裡我們應該選擇所有的標頭範圍,而不是單獨標題欄這一行
然後需要選擇我們想要拆分的參照列,比方說我們這裡是按照班級來進行拆分的,所以這裡要選擇班級這一列。
然後稍等一小會之後,結果就出來了。
這裡我們選擇其中一個工作表來驗證下結果是否正確
數據都是完全相同的
代碼解析
我們來看看代碼是如何實現這樣的效果的
Set trng = Application.InputBox("請選擇標題欄", "標題欄的確定", , , , , , 8)
TitleR = trng.Rows.Count
TitleC = trng.Column
Set rng = Application.InputBox("請選擇要拆分的參照列", "參照列的確定", , , , , , 8)
num = ActiveSheet.Index
TargetCol = rng.Column - (TitleC - 1)
這一段就會經典中的經典了,利用inputbox來實現交互窗體,然後我門就可以代碼的使用者之間形成一個簡單的交互了,通過這個交互窗體我們得到了我們想要的數據,標頭總共有多少行多少列,還有參照列的位置也得到了了確定
然後進入今天的第一個重點
With ActiveSheet.UsedRange
.RemoveDuplicates 1, xlNo
End With
我們既然需要針對班級進行拆分,自然就需要拿到班級這一列的唯一值,我們通過篩選來進行篩選,也是間接得到唯一值的方法,那麼在代碼中我們如何實現這個唯一值的獲取呢?
就是上面的代碼
大家可以直接套用,這是簡單的套路,看看效果
這樣我們得到了班級列的唯一值,之後我們利用Excel自身的篩選功能來進行篩選
然後今天這是本篇的另外一個重點知識,如果針對篩選後的數據進行複製呢?
With ActiveSheet.UsedRange
.SpecialCells(xlCellTypeVisible).Copy sthn.Cells(1, 1)
End With
通用代碼,直接套用即可
然後就繼續循環下去,就得到了我們想要的結果了。