返回列表 上一主題 發帖

[發問] Excel 分拆數量。

本帖最後由 Andy2483 於 2023-11-14 10:14 編輯

回復 3# 准提部林


    謝謝論壇,謝謝前輩指導
後學學習前輩的方案,心得註解如下,請前輩再指導

Option Explicit
Sub TEST_A1()
Dim Arr, Brr, i&, N&, R&, j%, k%, Cn%, V%, V1%, V2%
'↑宣告變數:(Arr,Brr)是通用型變數,(N,R)是長整數,(j,k,Cn,V,V1,V2)是短整數
Sheets("Sheet2").[a:j].ClearContents
'↑令名為"Sheet2" 工作表的A:J欄儲存格清除內容
Arr = Range(Sheets("Sheet1").[j1], Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp)(2))
'↑令Arr這通用型變數是 二維陣列,以表1的[J1]到A欄最後有內容儲存格的下一格,以此範圍儲存格值帶入Arr陣列中
ReDim Brr(1 To 30000, 1 To 10)
'↑宣告Brr這通用型變數是二維空陣列,縱向範圍從索引號1到30000,橫向範圍從索引號1 到10
For i = 2 To UBound(Arr) - 1
'↑設順迴圈!i從2 到Arr陣列縱向最大索引列號-1
  V = IIf(Arr(i, 10) = "HT", 1000, 3000) '除數
    '↑令V這短整數是 IIF()回傳值:如果i迴圈列第10欄Arr陣列值自字串 "HT",True回傳數值1000,False回傳數值 3000
    V1 = Val(Arr(i, 7)) '數量
    '↑令V1這短整數是 i迴圈列第7欄Arr陣列值轉成數值
    Cn = Int(V1 / V) + 1 '分拆行數
    '↑令Cn這短整數是 V1變數除以V變數後去除小數的整數值+1
    V2 = V1 Mod V '餘數
    '↑令V2這短整數是 V1變數除以V變數的餘數
    If V2 < 101 And Cn > 1 Then Cn = Cn - 1: V2 = V + V2
    '↑如果V2變數<101 且Cn變數>1 ? True就令Cn變數-1:令V2變數是自身累加V變數
    For j = 1 To Cn
    '↑設順迴圈!j從1 到Cn變數
        N = N + 1
        '↑令N變數累加1
        For k = 1 To 10: Brr(N, k) = Arr(i, k): Next
        '↑設順迴圈!令k從1到10:將i列k變數欄Arr陣列值帶入 N變數列k變數欄Brr陣列中
        Brr(N, 7) = IIf(j = Cn, V2, V)
        '↑令N變數列第7欄陣列值是IIF()回傳值: 如果j變數同Cn變數!回傳V2變數,否則回傳V變數
    Next j
    If Arr(i, 8) <> Arr(i + 1, 8) And N Mod 2 = 1 Then N = N + 1
    '↑如果i迴圈列第8欄Arr陣列值與下一列第8欄Arr陣列值不同,且N變數除以2的餘數是1?
    'True就令N變數累加1

Next i
Sheets("Sheet2").[a1:j1] = Sheets("Sheet1").[a1:j1].Value
'↑令表2的標題列同 表1的標題列
Sheets("Sheet2").[a2].Resize(N, 10) = Brr
'↑令表2的[A2]擴展向下N變數列,擴展向右10欄的範圍儲存格值以Brr陣列值帶入
End Sub
===========================================================

Option Explicit
Sub TEST()
Dim Brr, Crr, V%, V1%, Q%, i&, j%, R&
Dim S1 As Worksheet, S2 As Worksheet
Set S1 = Sheets("Sheet1"): Set S2 = Sheets("Sheet2")
Brr = Range(S1.[J1], S1.Cells(Rows.Count, "A").End(3))
ReDim Crr(1 To 10000, 1 To 10)
For i = 2 To UBound(Brr)
   Q = Val(Brr(i, 7))
   V = IIf(Brr(i, 10) = "HT", 1000, 3000)
qq:
   If Q <= 0 Then GoTo i01 Else R = R + 1: V1 = Q - V
   For j = 1 To 10: Crr(R, j) = Brr(i, j): Next
   Crr(R, 7) = V * -(V1 >= 0) + Q * -(V1 < 0)
   Q = V1: GoTo qq
i01: Next
S2.[A:J].ClearContents
S2.[A1:J1] = S1.[A1:J1].Value
S2.[a2].Resize(R, 10) = Crr
Set S1 = Nothing: Set S2 = Nothing: Erase Brr, Crr
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 稻穗結得越飽滿,越會往下垂,一個人越有成就,就要越有謙沖的胸襟。
返回列表 上一主題