前景提要

好了今天我們來繼續玩一下工作表的拆分,之前我們已經嘗試了用指定列,指定行的方式來進行工作表的拆分,不知道有沒有點燃小夥伴們的拆分熱潮呢?之前我在寫按照工作表的指定行數進行拆分的時候,就想到一個問題,要是行數不確定,只能按照某個單元格的內存為參照物,如何進行拆分呢?我平時在進行工作表的拆分的時候,時不時也會碰到這樣的問題,一般是在月總結的時候會碰到,不知道大家有沒有這樣的需求,我先分享出來

場景說明

場景說明

這裡我們將之前的案例稍微修改一下,更換下場景,這次我們這裡放置的是某個班級所有學生歷次的考試成績,不過因為匯總的時候為了方便都是不斷的往下新增數據的,並且為了打字方便,姓名都是直接複製的,結果要進行分析的時候,發現這樣很難看出來每個學生的成績變化情況,所以現在我們需要針對總表進行拆分,我們已A1即第一個學生的名字為參照物進行拆分,我們來看看如何實現

代碼區

Sub chai()
Dim rng As Range, sth As Worksheet, sthn As Worksheet, pathn$, str$, a As Range
pathn = ActiveWorkbook.Path
Set sth = ActiveSheet
Set rng = Application.InputBox("請選擇表頭區域", "表頭區域的確定", , , , , , 8)
TitleR = rng.Rows.Count
TitleC = rng.Column
TitleColNum = rng.Columns.Count
str = InputBox("請輸入參照內容")
l = ActiveSheet.Cells(Rows.Count, TitleR).End(xlUp).Row
CountR = l - TitleR
Set a = Cells(TitleR + 1, TitleC)
For i = TitleR + 2 To l
If Cells(i, TitleC) = str Or i = l Then
k = k + 1
Worksheets.Add after:=Worksheets(Worksheets.Count)
Set sthn = ActiveSheet
rng.Copy sthn.Cells(1, 1)
sth.Activate
If i <> l Then
Range(a, Cells(i - 1, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)
Else
Range(a, Cells(i, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)
End If
sthn.Name = "第" & k & "次拆分"
Set a = Cells(i, TitleC)
End If
Next i
End Sub

來看看代碼執行的過程

這已經是套路了。不解釋了

輸入我們想要的的參照物

然後靜候佳音

為了檢查方便,我們抽取最後一次的數據來看看

代碼分析

來看看今天的代碼解析

Set rng = Application.InputBox("請選擇表頭區域", "表頭區域的確定", , , , , , 8)
TitleR = rng.Rows.Count
TitleC = rng.Column
TitleColNum = rng.Columns.Count

常規套路操作,表頭數據不規則,我們肯定要獲得表頭的區域的

str = InputBox("請輸入參照內容")

這裡就是我們要獲得輸入的參照物的內容,今天就簡單一點,使用inputbox函數來直接實現,相對於inputbox方法,函數的寫法要簡單多,但是如果有輸入內容限制的話,最好還是使用inputbox方法

然後進入我們的循環體

在進入循環之前,我們要先做一件事情

Set a = Cells(TitleR + 1, TitleC)

這一步非常的重要,在我們整個循環體中,a的作用也是非常的大的,他代表的就是我們的參照物A1所在的單元格位置,是不斷變化的,但是不管怎變,這個變數所代表的的意義是不變的。

來開始進入循環

我們的循環從A2開始,而不是A1,這裡注意這個關鍵點。

然後進入第一個小循環,不斷的往下走,當找到A1的位置之後,我們就有了數據區域,數據區域在哪裡呢?


Range(a, Cells(i - 1, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)

結合代碼來一起看看,找到A1的位置之後,A1的行數正好就是i的值,但是我們的數據區域不含新的這個A1

所以i-1才是上面的數據的區域的行數,這樣答應大家應該能夠理解了,後面的獲取列數的位置,前面已經說過很多次了,這裡容許我稍微偷懶下,略過

然後後面就是循環了,來進入最後一個難點,

就是最後一行的判斷,到了最後一行之後,肯定不會再往下循環了,所以也不會在找到一個A1了

這個時候我們既要判斷了,如果i=L,,就是總行數的時候,我們就直接將a和最後一行之間的區域放在最後一個工作表中,因為不存在另外一個A1了,所以這裡我們要判斷是否得到最後一行

這樣一來下面代碼中的不同,大家就應該能夠理解了。


推薦閱讀:
相关文章