我需要在一个范围内循环(在我的例子中是列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,这不是我需要的。
有什么建议吗?
谢谢。
发布于 2021-09-09 20:34:27
正如注释中所述,您将需要两个循环和另一个输出数组:
Sub lkjlkjkdl()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim Arr As Variant
Dim lastc As Long, lastr As Long
lastc = 1 'FindColNumber
lastr = ws.Cells(ws.Rows.Count, lastc).End(xlUp).Row
Arr = ws.Range(ws.Cells(2, lastc), ws.Cells(lastr, lastc))
Dim cnt As Long
cnt = ((UBound(Arr, 1) - 1) * UBound(Arr, 1)) / 2
Dim k As Long
k = 1
Dim outarr As Variant
ReDim outarr(1 To cnt, 1 To 1)
For i = LBound(Arr, 1) + 1 To UBound(Arr, 1)
Dim j As Long
For j = LBound(Arr, 1) To i - 1
outarr(k, 1) = Arr(i, 1) - Arr(j, 1)
k = k + 1
Next j
Next i
ws.Range("B2").Resize(cnt, 1).Value = outarr
End Sub

https://stackoverflow.com/questions/69123929
复制相似问题