【问题标题】:Loop in range of cells with fixed last row在具有固定最后一行的单元格范围内循环
【发布时间】: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。我只是在帖子“我主要关心的是我是否可以从下到上循环”中回答你的问题

标签: arrays excel vba loops


【解决方案1】:

如 cmets 所述,您将需要两个循环和另一个输出数组:

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

【讨论】:

  • 仅供参考,顺序整数 1-n 的总和为 (n*(n+1))/2,因此您可以跳过第一个循环
  • @TimWilliams 谢谢,我知道有,但懒得找了。
  • @ScottCraner 谢谢斯科特,工作就像一个魅力。只是出于好奇,是否可以从 UBound 循环到 LBound?数组有这个功能吗?
  • 是的,你会For i = Ubound(arr,1) to Lbound(arr,1) Step -1
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多