- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
5#
發表於 2022-12-23 09:00
| 只看該作者
本帖最後由 Andy2483 於 2022-12-23 09:11 編輯
回復 4# mdr0465
謝謝前輩回復
今天複習修改了一下,請前輩再試試看,心得註解請參考
請各位前輩指導,謝謝
執行結果:
Option Explicit
Sub 項相分類重整_20221222_1()
Application.DisplayAlerts = False
'↑不要問是不是真的要刪除工作表!乾脆點!
Application.ScreenUpdating = False
'↑螢幕不要跟著程序做變化!偷偷做就好了
Dim i&, j&, N&, St$, Arr, Brr, Y, Z, Ra, Sh
'↑宣告變數:(i,j,N)是長整數變數,St是字串變數,其他是通用型變數
Set Y = CreateObject("Scripting.Dictionary")
Set Z = CreateObject("Scripting.Dictionary")
'↑令Y,Z各是 字典
Set Sh = Sheets("結果")
'↑令Sh是 "結果"工作表
Arr = Range([分類帳!H1], [分類帳!A1].Cells(Rows.Count, 1).End(xlUp))
'↑令Arr是 二維陣列!倒入從 "分類帳"工作表的[H1]到該表的A欄最後一個有內容儲存格之間,
'擴展成為最小方正區域儲存格的值
With Sheets.Add
'↑以下是有關於新增工作表的程序
With .[A1].Resize(UBound(Arr), UBound(Arr, 2))
'↑以下是有關於新增工作表從[A1]擴展縱向Arr陣列最大列號數,橫向Arr陣列最大欄號數,
'這些儲存格的程序
.Value = Arr
'↑儲存格值以 Arr陣列值倒進去
.Sort _
KEY1:=.Item(1), Order1:=xlAscending, _
Key2:=.Item(2), Order2:=xlAscending, _
Header:=xlYes, Orientation:=xlTopToBottom
'↑令以第1欄做第一層做有標列的上下順排序,第2欄同時做第二層上下順排序
Arr = .Value
'↑令Arr陣列倒掉原來的值,裝入這排序好的儲存格值
End With
.Delete
'↑令這新增工作表刪除
End With
'我想將所有的" 本日合計" 和"本年累計" 都刪除
St = "/本日合計/本年累計/關鍵字|/關鍵字|/"
'↑令St這字串變數是雙引號裡的這些字,關鍵字|是用來給使用者追加的
For i = 1 To UBound(Arr)
'↑設順迴圈!i從1到Arr陣列最大列號數
Y(Arr(i, 1)) = ""
'↑令以迴圈列第1欄Arr陣列值當key,item是空字元,放入Y字典裡,
'這是要統計共有幾種 明細科目,才知道要增加多少標題列
If InStr(St, "/" & Replace(Arr(i, 4), " ", "") & "/") <> 0 Then
'↑如果用InStr()函式判斷是不等於 0,怎麼判斷?
'先用Replace()函式將i迴圈列第4欄Arr陣列值,用""空字元置換掉" "空白字元,
'再用"/"符號在前後包住這字串,以免誤判
'去比對St字串變數裡有沒有包含這串字
'https://learn.microsoft.com/zh-tw/office/vba/language/reference/user-interface-help/instr-function
Z("合計累計") = Z("合計累計") + 1
'↑令以"合計累計"字串當key,item累加 1
End If
Next
ReDim Brr(1 To UBound(Arr) + Y.Count * 3 - 1 - Z("合計累計"), 1 To UBound(Arr, 2))
'↑宣告Brr陣列的範圍大小,縱向從1到Arr陣列最大索引列號數+Y字典key數量*3,減1,
'再減掉 "合計累計"字串當key查Z字典得到的item值
'橫向從1到Arr陣列最大索引欄號數
Set Ra = Sh.[A1:H1]
'↑令Ra這通用型變數是 Sh工作表變數裡的[A1:H1]儲存格
For i = 2 To UBound(Arr)
'↑設外順迴圈!i從2到Arr陣列最大列號數
If Arr(i, 1) <> Arr(i - 1, 1) Then
'↑如果i迴圈列第1欄Arr陣列值 不等於(i-1)迴圈列第1欄Arr陣列值
N = IIf(i = 2, N + 1, N + 2)
'↑令N這長整數變數的值用 IIf()函式決定,
'如果i迴圈數是 2時N = N + 1,否則N = N + 2
Set Ra = Union(Ra, Range(Sh.Cells(N, 1), Sh.Cells(N, 8)))
'↑令Ra這通用型變數用Union()函式 累積儲存格集,
'規則是Ra自身 再加入 從"結果"工作表 N列第1欄儲存格到 該表N列第8欄儲存格,
'這兩格之間的所有儲存格
Brr(N, 2) = Arr(i, 1)
'↑令N變數列第2欄Brr陣列值是 i迴圈列第1欄Arr陣列值 (明細科目)
N = N + 1
'↑令N這長整數變數X累加 1 (加1列)
Set Ra = Union(Ra, Range(Sh.Cells(N, 1), Sh.Cells(N, 8)))
'↑同上
For j = 1 To UBound(Arr, 2)
'↑設內順迴圈!j從1到Arr陣列最大欄號數
Brr(N, j) = Arr(1, j)
'↑令N變數列第j迴圈欄Brr陣列值是 第1列第j迴圈欄Arr陣列值
Next
End If
If InStr(St, "/" & Replace(Arr(i, 4), " ", "") & "/") <> 0 Then
'↑同上
GoTo Hi
'↑就去找 Hi
End If
N = N + 1
'↑同上
Set Ra = Union(Ra, Range(Sh.Cells(N, 1), Sh.Cells(N, 8)))
'↑同上
For j = 1 To UBound(Arr, 2)
'↑同上
Brr(N, j) = Arr(i, j)
'↑令N變數列第j迴圈欄Brr陣列值是 第i迴圈第j迴圈欄Arr陣列值
Next
Brr(N, 2) = "'" & Format(Brr(N, 2), "yyyy-mm-dd")
'↑令N變數列第2欄Brr陣列值是"'" 符號連接自身日期轉為字串,
'以"yyyy-mm-dd"方式呈現
Brr(N, 3) = "'" & Brr(N, 3)
'↑令N變數列第3欄Brr陣列值是"'" 符號連接自身
Hi:
'Hi在這裡
Next
Sh.UsedRange.ClearContents
'↑令Sh變數工作表有使用的儲存格最小方正區域儲存格內容清除
Sh.Cells.Borders.LineStyle = 0
'↑令Sh變數工作表全部的格線都不要
Ra.Borders.LineStyle = 1
'↑令Ra這儲存格集的格線是 細實線
Sh.[A1].Resize(UBound(Brr), UBound(Brr, 2)) = Brr
'↑令Sh變數工作表從[A1]擴展縱向:Brr陣列縱向最大索引列號數,
'橫向:Brr陣列橫向最大索引欄號數,這範圍儲存格以 Brr陣列值倒入
'完工了
Set Y = Nothing
Set Z = Nothing
Set Arr = Nothing
Set Brr = Nothing
'工具容器要收一收,釋放掉變數
End Sub |
|