- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
34#
發表於 2023-11-13 08:43
| 只看該作者
本帖最後由 Andy2483 於 2023-11-13 16:05 編輯
回復 30# 准提部林
謝謝論壇,謝謝前輩指導
後學學習前輩的方案,心得註解如下,請前輩再指導
Sub 流水編號1()
Dim Arr, i&, V&, N&, Y&, T1$, T2$, TT$, P%, x%, SS(2)
'↑宣告變數:Arr是通用型變數,(i,V,N,Y)是長整數變數,(T1,T2,TT)是字串變數,
'(P,x)是短整數變數,SS是一維陣列(索引號0~2)
Arr = Range([c1], [b65536].End(xlUp)(1, 0))
'↑令Arr這通用型變數是二維陣列,以[C1]到 B欄最後有內容儲存格左側格(A欄),
'以這範圍儲存格值帶入陣列中
For i = 3 To UBound(Arr)
'↑設順迴圈!i從3到Arr陣列縱向最大索引列號
If Arr(i, 1) = "合計" Then Exit For
'↑如果i迴圈列第1欄Arr陣列值是 "合計"? True就結束迴圈執行
N = N + 1: Arr(i - 2, 1) = ""
'↑令N這長整數變數累加 1
'令(i迴圈-1)列第1欄Arr陣列值是 空字元
P = Val(Arr(i, 2)): V = Val(Arr(i, 3))
'↑令P這短整數是i迴圈列第2欄Arr陣列值
'令V這長整數是i迴圈列第3欄Arr陣列值
x = Switch(P = 100, 1, P = 200, 2, P = 500, 2, P = P, 0)
'↑令x這短整數是Switch()函式回傳值
https://learn.microsoft.com/zh-t ... elp/switch-function
If P = 0 Or V = 0 Or x = 0 Then GoTo i01
'↑如果P變數是0 或V是0 又或x是0,其中一條件成立!就跳到 標示i01的位置繼續執行
Y = Array(64564, 81140)(x - 1): TT = Array("A", "B")(x - 1)
'↑令Y這長整數變數是 一維陣列的索引號(x變數-1)陣列值
'令TT這字串變數變數是 一維陣列的索引號(x變數-1)陣列值
T1 = TT & Format(Y + SS(x) + 1, "0000000")
'↑令T1變數是 TT變數連接 (Y變數+x索引號SS陣列值再+1)轉成7碼數值,所組成的新字串
T2 = TT & Format(Y + SS(x) + V, "0000000")
'↑令T2變數是 TT變數連接 (Y變數+x索引號SS陣列值再+V變數)轉成7碼數值,所組成的新字串
Arr(i - 2, 1) = T1 & IIf(T1 = T2, "", "-" & T2)
'↑令(i迴圈-2)列第1欄Arr陣列值是 T1變數連接 空字元或 ("-"連接T2變數組成字串)
'IIf():如果T1變數同T2變數(即張數是1張)!就回傳 空字元,否則回傳字串
SS(x) = SS(x) + V
'↑令x變數索引號SS陣列值是 累加V變數的數值
i01: Next i
[d3].Resize(N) = Arr
'↑令[D3]擴展向下 N變數列儲存格值 以Arr陣列值帶入
End Sub
'============================================================
Option Explicit
Sub TEST()
Dim Brr, E, P, Q&, i&, H&, c, K%, S&(1), T$, Ts$, Te$
c = Application.Match("合計", [A:A], 0)
If IsError(c) Then Exit Sub
Brr = [B3].Resize(c - 3, 3)
E = Array(64564, 81140): P = Array("A", "B")
For i = 1 To UBound(Brr)
Q = Val(Brr(i, 1)): H = Val(Brr(i, 2))
K = Switch(Q = 100, 0, InStr("200/500", Q), 1, Q = Q, -1)
T = P(K) & "0000000": Brr(i, 1) = ""
If (Q = 0) + (H = 0) + (K = -1) < 0 Then GoTo i01
S(K) = E(K) + 1: E(K) = E(K) + H
Ts = Format(S(K), T): Te = Format(E(K), T)
Brr(i, 1) = Ts & IIf(S(K) = E(K), "", "-" & Te)
S(K) = E(K)
i01: Next
[I3].Resize(UBound(Brr)) = Brr
End Sub |
|