为什么这个程序应该对每列进行求和,仅在一列之后停止?

时间:2012-07-25 18:37:19

标签: excel vba excel-vba excel-2010

此程序创建一个数字表,然后尝试逐行汇总。我正在使用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

2 个答案:

答案 0 :(得分:5)

有两个问题:

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

  2. 您需要使用Exit For跳出for循环。我认为你的意思是你当前的End If陈述。

  3. 我不确定您要做什么,但您也可以考虑使用条件为While Not IsEmpty(Cells(1, i))的while循环,然后在循环内递增计数器i。对我而言,这比跳过它的for循环感觉要好一些。

答案 1 :(得分:4)

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

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