[VBA]大小編號自動編碼
有時候編號會有階層,大階層編號+小階層編號如何判斷編號的起終點是最關鍵的地方
步驟
自動編號的部分分為兩個部分來做,首先先將大項(1)、(2)……自動編碼,然後再針對(1)、(2)與(2)、(3)……之間的小項目編碼。
大項目編碼
針對大項目編碼可以參考項次編碼的方式來處理,但這次的設定上有括號,所以增加了NumberFormatLocal
來定義儲存格格式。
1'起始編號,一般從0開始
2p3 = 1
3'設定開始執行自動編碼的列數,可自行修正,因為Do迴圈的關係這邊一定要先輸入一個值
4prw2 = 7
5Do While prw2 <= r
6 If Cells(prw2, 2).HorizontalAlignment = xlLeft And Cells(prw2, 2).Font.Bold = True Then
7 '顯示會有括號,但是儲存格仍為數字
8 Cells(prw2, 1).NumberFormatLocal = "(G/通用格式)"
9 Cells(prw2, 1).Value = p3
10 p3 = p3 + 1
11 End If
12prw2 = prw2 + 1
13Loop
接著就可以利用大項目編碼作為小項目的執行邊界。
小項目編碼
小項目介於大項目編碼與大項目編碼之間,所以利用這個特性抓取迴圈的起終點,例如在(1)、(2)與(2)、(3)……等大項目之間的小項目從1開始自動編號,基於此可利用兩個if
來判斷。因為大項目的排列由小而大,利用這個特性採用下列判斷式抓取起終點。
xxxxxxxxxx
131 prw1 = 7
2 prs = 1
3 pre = 1
4 p1 = 1
5 p2 = 2
6Do While prw1 <= r
7 '當儲存格等於1且字體為粗體的時候,將prs就等於當下的列數prw1
8 If Cells(prw1, 1).Value = p1 And Cells(prw1, 1).Font.Bold = True Then
9 prs = prw1
10 End If
11 '當儲存格等於2且字體為粗體的時候,將pre就等於當下的列數prw1
12 If Cells(prw1, 1).Value = p2 And Cells(prw1, 1).Font.Bold = True Then
13 pre = prw1
利用上述方程式可以得到起點prs
及終點pre
分別代表的列數,之後就能做迴圈來自動編碼小項目
xxxxxxxxxx
121xc2 = 1
2'判斷是否為小項目,是的話就填入值,起始值為1。正確填入的話就+1
3For q1 = prs To pre
4 If Cells(q1, 2).HorizontalAlignment = xlLeft And Cells(q1, 2).Value <> "" And Cells(q1, 2).Font.Bold <> True Then
5 Cells(q1, 1).Value = xc2
6 xc2 = xc2 + 1
7 End If
8 Next
9'第一組邊界抓完之後將原起點改為原終點,然後將p2+1作為抓取下一個邊界的終點
10 prs = pre
11 p2 = p2 + 1
12end if
當迴圈執行到最後一行,通常是小項目的最後一行,沒辦法透過大項目定位終點的行數,所以這邊單獨拿出來再寫一個
xxxxxxxxxx
151'當prw1=最後一行的時候,自動將最後一行視為pre(終點)
2If prw1 = r Then
3 pre = prw1
4For q1 = prs To pre
5 If Cells(q1, 2).HorizontalAlignment = xlLeft And Cells(q1, 2).Value <> "" And Cells(q1, 2).Font.Bold <> True Then
6 Cells(q1, 1).Value = xc2
7 xc2 = xc2 + 1
8 End If
9 Loop
10 End If
11'在最大的迴圈增加xc2=1,讓每次小迴圈的xc2都能從1開始
12xc2 = 1
13'DO迴圈的增加數量,判斷儲存格用FOR迴圈就不用這一行
14prw1 = prw1 + 1
15Loop