停止excel do循环,直到

停止excel do循环,直到,excel,vba,Excel,Vba,我有两列A和B,数字作为值 在C1中,我希望=A1+B1 在C2中,我希望=A2+B2 等等。我已经编写了下面的VBA代码-当它工作时,它会在范围中最后一行的末尾添加“0” 让我们假设我的最后一行是A10。当我运行代码时,它会在C11中添加“0”。 我如何防止这种情况 Sub macro() Dim R As Long R = 1 Do Cells(R, "C").Select R = R + 1 ActiveCell.Formula = "=sum(" & ActiveCell.

我有两列A和B,数字作为值

  • 在C1中,我希望
    =A1+B1
  • 在C2中,我希望
    =A2+B2
等等。我已经编写了下面的VBA代码-当它工作时,它会在范围中最后一行的末尾添加“0”

让我们假设我的最后一行是A10。当我运行代码时,它会在C11中添加“0”。 我如何防止这种情况

Sub macro()

Dim R As Long
R = 1
Do
Cells(R, "C").Select
R = R + 1
ActiveCell.Formula = "=sum(" & ActiveCell.Offset(0, -2) & "," & 
ActiveCell.Offset(0, -1)    & ")"
Loop Until IsEmpty(ActiveCell.Offset(0, -2))

End Sub

我绝对不是vba方面的专家,但您可以这样做:

Sub macro()


    Dim R As Long
    R = 1
    Do While Not IsEmpty(ActiveCell.Offset(0, -2))
        Cells(R, "C").Select
        R = R + 1
        ActiveCell.Formula = "=sum(" & ActiveCell.Offset(0, -2) & "," & 
        ActiveCell.Offset(0, -1)    & ")"
    Loop

End Sub

只需将Until条件替换为以下字符串:

循环直到IsEmpty(ActiveCell.Offset(1,-2))


这将检查正确的单元格是否为空。您的代码的其余部分应该保持不变。

我想我会推荐一种稍微不同的做法,只是给您一些想法:):

看一看

如果你真的想在单元格上迭代,你可以继续。但是这里有一种使用
数组的方法
,这将尽可能减少在单元上循环时出现的任何性能下降

Option Explicit

Sub AddToRigh()
Dim i As Integer
Dim vArr As Variant
Dim LastRow As Long

'--assume you are working on Sheet 1
LastRow = Sheets(1).Cells(Rows.Count, Range("A1").Column).End(xlUp).Row
ReDim vArr(1 To LastRow)

For i = LBound(vArr) To UBound(vArr)
    vArr(i) = "=Sum(RC[-2]:RC[-1])"
Next i

'--output this entire array with formulas into column C
Sheets(1).Range("C1").Resize(UBound(vArr)) = Application.Transpose(vArr)

End Sub
输出:


尝试在循环结束时,即循环开始前,增加RUntil@rick. 这也没什么区别,你的代码得到的结果是一样的。它在范围内的最后一行后添加“0”值,即公式“=sum(,)”。@Koenyn对于宏运行前选择的
A1
,在循环开始时(
Do While
line)会看到“应用程序定义或对象定义错误”,因为活动单元格尚未严格定义-请在选择前检查它。对不起,朋友,但是投反对票。是的,上面的评论也是正确的。就像我说的,我不是vba专家,我只是觉得使用while循环比使用do-while循环更好。这是完全相同的代码,只是有一个while循环。…@Peter。非常感谢。.您的解决方案非常有效,只对我的代码进行了一次修改,但我仍然无法获得其背后的逻辑。@user1449596您的初始代码已检查为空,a列中的单元格与您将公式放在C列的同一行中,也就是说,您选择sell C10,将公式放在那里,检查A10是否为空,如果为空则继续。如果第10行是数据位于A&B中的最后一行,您将收到一个不需要的循环。我的偏移量检查列A中的单元格,但行比列A低1步,即对于上述情况,它将检查空的A11,因此这是周期的结束。希望这有助于理解逻辑!)+1向上投票以恢复看似与现已删除的帖子相关的细小向下投票。感谢@brettdj,我理解这种情绪,尽管我并不十分担心代表:)。此外@AnandKumar,我确实欠你一些道歉;昨天去afk之前我意识到你的回答只比Koenyn晚了一分钟。我肯定在我否决你之前我已经检查过了,但不知为什么我弄错了。不过,当时我并不那么喜欢道歉。我明白你现在不能逆转你的反对票,我也不能。我想说的是,每个人都会有点情绪化,犯错误,我这边没有什么不好的感觉。如果这篇文章是由你或其他人编辑的,那么投票是可以改变的。说得好,但现在我们进入了烦躁不安的领域,我会忘记它的。再次感谢。
Option Explicit

Sub AddToRigh()
Dim i As Integer
Dim vArr As Variant
Dim LastRow As Long

'--assume you are working on Sheet 1
LastRow = Sheets(1).Cells(Rows.Count, Range("A1").Column).End(xlUp).Row
ReDim vArr(1 To LastRow)

For i = LBound(vArr) To UBound(vArr)
    vArr(i) = "=Sum(RC[-2]:RC[-1])"
Next i

'--output this entire array with formulas into column C
Sheets(1).Range("C1").Resize(UBound(vArr)) = Application.Transpose(vArr)

End Sub