2

该程序创建一个数字表,然后尝试逐行汇总。我IsBlank()用来测试最上面的单元格是否为空白。如果它是空白的,它应该结束循环,但如果不是,循环应该继续。但是,它在第​​一次通过循环后一直结束。这是为什么?

我有一种感觉,这真的很明显。

编辑:我应该注意到整个“计数器”的东西都在那里,因为如果这有效,我将开始玩弄它。它没有用,所以我在这里!

Option Explicit
Dim Counter As Long
Dim i As Long
Dim col As Long
Dim row As Long

Sub SumRange()
    For col = 1 To 8
        For row = 1 To 6
            Cells(row, col) = Rnd
        Next row
    Next col
    Counter = 6
    For i = 1 To 9
        If IsEmpty(Cells(1, i)) = False Then
            Cells(Counter + 1, i) = Application.WorksheetFunction.Sum(Range(Cells(1, i), Cells(Counter, i)))
        Else
            End If
        End
    Next
    MsgBox Cells(4, 5)
End Sub
4

2 回答 2

5

有两个问题:

  1. End说法不正确。如果我没记错的话,End意思是结束程序。您必须明确说明要结束的内容(End If, End With, ...)。在这种情况下,您的意思是End If.

  2. 你需要使用Exit For来跳出for循环。我认为您的意思是您当前的End If声明所在的位置。

我不确定您要做什么,但您也可以考虑使用带有条件的 while 循环,While Not IsEmpty(Cells(1, i))然后i从循环内递增计数器。对我来说,这比带有跳转的 for 循环要好一些。

于 2012-07-25T18:51:43.517 回答
4

从您的代码(仅包含这些语句的行)中删除ElseEnd您的循环执行九次。

End语句指示 VBA ...结束您的代码。所以它只是退出。

我强烈建议重构你的代码,它可以变得更有效率:

Sub SumRange()

  Dim values(1 To 6, 1 To 8) As Double
  Dim i As Long, j As Long

  ' populate array
  For i = LBound(values) To UBound(values)
    For j = LBound(values, 2) To UBound(values, 2)
      values(i, j) = Rnd
    Next j
  Next i

  ' blast array onto worksheet in one go
  Range("A1").Resize(UBound(values), UBound(values, 2)).value = values

  ' add sum formulas in one go
  Range("A1").Resize(, UBound(values, 2)).Offset(UBound(values)).FormulaR1C1 = _
  "=SUM(R[-" & UBound(values) & "]C[0]:R[-1]C[0])"

  MsgBox Cells(4, 5)
End Sub
于 2012-07-25T18:57:39.013 回答