Sub TEST_A4()
Dim Arr, Brr, Cr, xD, vD, i&, j%, R&, K, T1$, T2$, TT$, N&, V%, xA As Range
tm = Timer
Call 清除
Set xD = CreateObject("Scripting.Dictionary")
Set vD = CreateObject("Scripting.Dictionary")
Arr = Range([DATA!at1], [DATA!a65536].End(xlUp))
For i = 2 To UBound(Arr) If Arr(i, 46) <> "" Then GoTo i01
T1 = Arr(i, 11): T2 = Arr(i, 6): TT = T1 & T2
If T1 = "" Or T2 = "" Or xD(TT) > 0 Then GoTo i01
If xD(T1) = 0 Then Set vD(T1) = CreateObject("Scripting.Dictionary")
xD(T1) = 1: xD(TT) = 1: vD(T1)(i) = ""
i01: Next i
'--------------------------------
Application.ScreenUpdating = False
Set xA = [盤點表!A1]: Cr = Array(1, 3, 6, 8, 10, 14, 13, 12)
For Each K In vD.keys
R = vD(K).Count: N = N + 1
ReDim Brr(1 To R + 1, 1 To 10)
For i = 1 To R
V = vD(K).keys()(i - 1)
Brr(i + 1, 5) = "小計:": Brr(i + 1, 8) = Brr(i, 8) + Arr(V, 12)
For j = 1 To 8: Brr(i, j) = Arr(V, Cr(j - 1)): Next
Next i
[盤點表!A1:j3].Copy xA
xA(2, 2) = K: xA(2, 10) = "頁次:" & N & "/" & vD.Count
[盤點表!a4:j4].Copy xA(4).Resize(R, 10)
xA(4).Resize(R + 1, 10).Value = Brr
Set xA = xA(R + 5): xA.PageBreak = xlPageBreakManual '設定分頁線
Next
MsgBox Timer - tm
End Sub作者: shuo1125 時間: 2021-12-6 19:57
Sub TEST_A4()
Dim Arr, Brr, Cr, xD, vD, i&, j%, R&, K, T1$, T2$, TT$, N&, V%, xA As Range
tm = Timer
Call 清除
Set xD = CreateObject("Scripting.Dictionary")
Set vD = CreateObject("Scripting.Dictionary")
Arr = Range([DATA!at1], [DATA!a65536].End(xlUp))
For i = 2 To UBound(Arr)
If Arr(i, 46) <> "" Then GoTo i01
T1 = Arr(i, 11): T2 = Arr(i, 6): TT = T1 & T2
If T1 = "" Or T2 = "" Or xD(TT) > 0 Then GoTo i01
If xD(T1) = 0 Then Set vD(T1) = CreateObject("Scripting.Dictionary")
xD(T1) = 1: xD(TT) = 1: vD(T1)(i) = ""
i01: Next i
'--------------------------------
Application.ScreenUpdating = False
Set xA = [盤點表!A1]: Cr = Array(1, 3, 6, 8, 10, 14, 13, 12)
For Each K In vD.keys
R = vD(K).Count: N = N + 1
ReDim Brr(1 To R + 1, 1 To 10)
For i = 1 To R
V = vD(K).keys()(i - 1)
Brr(i + 1, 5) = "小計:": Brr(i + 1, 8) = Brr(i, 8) + Arr(V, 12)
For j = 1 To 8: Brr(i, j) = Arr(V, Cr(j - 1)): Next
Brr(i, 10) = "口人員 口地點 口功能"
Next i
[盤點表!A1:j3].Copy xA
xA(2, 2) = K: xA(2, 10) = "頁次:" & N & "/" & vD.Count
[盤點表!a4:j4].Copy xA(4).Resize(R, 10)
xA(4).Resize(R + 1, 10).Value = Brr
Set xA = xA(R + 5): xA.PageBreak = xlPageBreakManual '設定分頁線
Next
MsgBox Timer - tm
End Sub作者: 准提部林 時間: 2021-12-10 21:13
If Not IsArray(Crr) Then '判定Crr是不是陣列
'↑當i = 2:一開始Crr不是陣列!只是空的
'↑當i >= 3:Crr是陣列了!條件不成立,就跳到 End If
'↑直到i = 50:Crr又不是陣列!又只是空的
'↑到i = 59:Crr=xD(A2009001/c)是陣列條件不成立,就跳到 End If
Crr = Brr
'↑當i = 2:令Crr變成一個上述Brr(1 To 999, 1 To 9)空陣列
'↑直到i = 50:再令Crr變成一個上述Brr(1 To 999, 1 To 9)空陣列
' ,所以Brr從頭到尾都是一個空的容器
i01: Next i
'迴圈總結
'1.N=2,因為只有兩種專特案號,而且字典裡也加序號 與 專特案號
' KEY=1:ITEM=A2009001,KEY=2:ITEM=A2104001
'2.xD("A2009001")已累積到59,xD("A2104001")已累積到17
'--------------------------------
Application.ScreenUpdating = False
Set xA = [表單!A1]
'↑令 xA是 "表單" 工作表.[A1]儲存格,所以xA已經指向Sheets("表單")
[表單!C1:H1].Merge: [表單!C2:H2].Merge: [表單!C3:H3].Merge
For i = 1 To N
If i > 1 Then [表單!A1:I4].Copy xA
T1 = xD(i)
'↑當N = 1,T1=A2009001
'↑當N = 2,T1=A2104001