|
把代码作了一些简化,结果是一样的,但没原代码直观。- Sub 计算New1() '目的:让每一期的 “期初+销售-回款”尽量向0值靠近
- arr = Range("a4:z" & [a65536].End(3).Row)
- Set d = CreateObject("scripting.dictionary")
- x = 0
- For i = 1 To UBound(arr)
- bm = arr(i, 2) '以编码为key
- d(arr(i, 2)) = d(arr(i, 2)) & "," & i
- Next
- For Each bm In d.keys
- hsrr = Split(d(bm), ","): r = UBound(hsrr)
- xsum = 0
- If r > 1 Then
- For i = 1 To r - 1
- k = Val(hsrr(i))
- a = arr(k, 5 + x): b = arr(k, 6 + x): c = arr(k, 7 + x)
- For j = i + 1 To r
- k1 = Val(hsrr(j))
- For p = 5 To 7
- xp = IIf(p < 7, arr(k1, p + x), -arr(k1, p + x))
- If (a + b - c) * xp < 0 Then '“期初+销售-回款”分别与下面的期初、销售、回款(取负)对比
- If Abs(a + b - c) > Abs(xp) Then
- a = a + xp: xp = 0
- Else
- xp = xp + (a + b - c): a = c - b
- End If
- End If
- arr(k1, p + x) = IIf(p < 7, xp, -xp)
- Next
- Next
- arr(k, 5 + x) = a: arr(k, 6 + x) = b: arr(k, 7 + x) = c
- Next
- End If
- For i = 1 To r
- k = Val(hsrr(i))
- arr(k, 8 + x) = arr(k, 5 + x) + arr(k, 6 + x) - arr(k, 7 + x)
- Next
- Next
- Range("h4:h" & [a65536].End(3).Row) = Application.Index(arr, , 8 + x)
- End Sub
复制代码 |
|