【发布时间】:2021-11-06 11:00:46
【问题描述】:
我需要在一个范围内循环(在我的情况下是 A 列)以获得以下结果:
A B
1 = 2 - 1
2 = 3 - 1
3 = 3 - 2
4 = 4 - 1
5 = 4 - 2
= 4 - 3
= 5 - 1
= 5 - 2
= 5 - 3
= 5 - 4
我希望数字 5 被 4, 3, 2 ,1 减去,然后数字 4 被 3, 2, 1 等等。 我以某种方式能够通过收集来实现这一点,但由于数据集相当大,脚本运行了 30 多分钟。
此时我正在尝试找出数组,但我不知道如何获得所需的结果。我主要关心的是我是否可以从下到上循环(从数字 5 到 1,而不是从 1 到 5)以及如何固定最后一行(固定数字 5,进行扣除然后固定数字 4,做数学魔术并循环到 3等等)。
我当前的代码是:
Dim Arr As Variant
Dim lastc, lastr As Long
lastc = FindColNumber
lastr = ws.Cells(ws.Rows.count, lastc).End(xlUp).Row
Arr = ws.Range(ws.Cells(2, last), ws.Cells(lastr, lastc))
For i = LBound(Arr, 1) To UBound(Arr, 1) - 1
If (Arr(i, 1) > 0) And (Arr(i + 1, 1) > Arr(i, 1)) Then
Arr(i, 1) = Arr(i, 1) - Arr(i + 1, 1)
代码进行如下扣除:5-4、4-3、3-2、2-1,这不是我需要的。
有什么建议吗?
谢谢。
【问题讨论】:
-
你需要两个循环,第二个将从 Lbound 循环到 i -1
-
您可以在 VBA 中向后循环。
For i = 5 To 1 Step -1,如果你想在一个范围内向后循环,你可以做For i = MyRng.Cells.Count To 1 Step -1,然后使用MyRng.Cells(i)引用单个单元格 -
您还需要第二个数组来保存输出。
-
@Toddleson 循环范围很慢。 OP 应保留变量数组和批量分配。
-
@Thayskills 你需要
Step -1部分。喜欢For i = UBound(Arr, 1) to LBound(Arr, 1) Step -1。我只是在帖子“我主要关心的是我是否可以从下到上循环”中回答你的问题