Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2327|回复: 1

[已解决]帮忙优化代码

[复制链接]
发表于 2017-6-20 09:03 | 显示全部楼层 |阅读模式
A列为开票数据,由于一张开票金额不能超过117000,所以将其分割成几张。
要求1:每张金额不能超过117000
要求2:每张最后一个序号是5的倍数
附件中有一段代码,请各位老师能否提供更简便的思路,谢谢!
Sub 测试()
Dim arr, brr
Dim s, n
Dim x As Range, y As Range
Set x = Application.InputBox("选择区域", , , , , , , 8)
Set y = Application.InputBox("存放单元格", , , , , , , 8)
arr = x
ReDim brr(1 To UBound(arr), 1 To 2)
i = 1
For i = i To UBound(arr)
     Do
       s = s + arr(i, 1)
       n = n + 1
       brr(i, 1) = n
       i = i + 1
        If i > UBound(arr) Then Exit Do
     Loop While n Mod 5 And s <= 117000
     If n Mod 5 = False And s <= 117000 Then t = s: h = i - 1
     If s > 117000 Then: brr(h, 2) = t: brr(h + 1, 1) = 1: n = 0: s = 0: i = h + 1
     i = i - 1
     If i = UBound(arr) Then brr(h + 1, 2) = s
Next i
y.Resize(, 2).ClearContents
y.Resize(UBound(arr), 2) = brr
End Sub


最佳答案
2017-6-20 20:09
  1. Sub 测试()
  2. Dim arr, brr
  3. Dim s, n, k
  4. Dim x As Range, y As Range
  5. Set x = Application.InputBox("选择区域", , , , , , , 8)
  6. Set y = Application.InputBox("存放单元格", , , , , , , 8)
  7. arr = x
  8. ReDim brr(1 To UBound(arr), 1 To 2)
  9. For i = 1 To UBound(arr)
  10.        s = s + arr(i, 1)
  11.        n = n + 1
  12.        brr(i, 1) = n
  13.        If s > 117000 Then
  14.           For k = i To i - 4 Step -1
  15.             s = s - arr(k, 1)
  16.             If k Mod 5 = 0 Then
  17.                 s = s + arr(k, 1)
  18.                 brr(k, 2) = s
  19.                 i = k
  20.                 s = 0: n = 0
  21.                 Exit For
  22.             End If
  23.           Next k
  24.         End If
  25. Next i
  26. brr(i - 1, 2) = s
  27. y.Resize(, 2).ClearContents
  28. y.Resize(UBound(arr), 2) = brr
  29. End Sub
复制代码

tq2017.6.20.rar

10.25 KB, 下载次数: 9

发表于 2017-6-20 20:09 | 显示全部楼层    本楼为最佳答案   
  1. Sub 测试()
  2. Dim arr, brr
  3. Dim s, n, k
  4. Dim x As Range, y As Range
  5. Set x = Application.InputBox("选择区域", , , , , , , 8)
  6. Set y = Application.InputBox("存放单元格", , , , , , , 8)
  7. arr = x
  8. ReDim brr(1 To UBound(arr), 1 To 2)
  9. For i = 1 To UBound(arr)
  10.        s = s + arr(i, 1)
  11.        n = n + 1
  12.        brr(i, 1) = n
  13.        If s > 117000 Then
  14.           For k = i To i - 4 Step -1
  15.             s = s - arr(k, 1)
  16.             If k Mod 5 = 0 Then
  17.                 s = s + arr(k, 1)
  18.                 brr(k, 2) = s
  19.                 i = k
  20.                 s = 0: n = 0
  21.                 Exit For
  22.             End If
  23.           Next k
  24.         End If
  25. Next i
  26. brr(i - 1, 2) = s
  27. y.Resize(, 2).ClearContents
  28. y.Resize(UBound(arr), 2) = brr
  29. End Sub
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 12:26 , Processed in 0.244439 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表