此程序创建一个数字表,然后尝试逐行汇总。我正在使用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
答案 0 :(得分:5)
有两个问题:
End
语句不正确。如果我没记错的话,End
表示结束程序。您必须明确说明要结束的内容(End If
,End With
,...)。在这种情况下,您的意思是End If
。
您需要使用Exit For
跳出for循环。我认为你的意思是你当前的End If
陈述。
我不确定您要做什么,但您也可以考虑使用条件为While Not IsEmpty(Cells(1, i))
的while循环,然后在循环内递增计数器i
。对我而言,这比跳过它的for循环感觉要好一些。
答案 1 :(得分:4)
从代码中删除Else
和End
(仅包含这些语句的行),循环执行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