【问题标题】:Do Until Loop, If Then VBA Excel做直到循环,如果然后 VBA Excel
【发布时间】:2018-08-07 08:20:55
【问题描述】:

更新: 我得到的代码正是我想要它做的事情(粘贴在下面),尽管有些人可能不同意我的方法(我会接受反馈,因为我是 100% 的新手)。

我正在尝试创建一个简单的 VBA 代码来运行带有 if then 语句的循环 - 如果该语句为真则停止循环。如果该语句直到最后才为真,则在单元格为 IsEmpty() 时停止循环。

这是我目前所拥有的。这显然是不正确的并且没有运行,但我希望这次尝试能帮助您了解我正在尝试做什么。

Sub runoutDateLoop()
r = 8
Do Until IsEmpty(Cells(r, 1))
c = 24
Do Until Cells(r, c - 1).Value < 1 = True
 If Cells(r, c).Value < 1 Then
 Cells(r, 18).Value = Cells(7, c)
 Else
 Cells(r, 18).Value = Cells(7, c)
 End If
 c = c + 1
Loop
r = r + 1
Loop
End Sub

我正在尝试创建一个循环,直到 if 语句为真。 if then 语句很简单——如果数字是负数,那么我们希望单元格 r,18 复制到单元格 7,c。如果没有,则循环发生,直到有一个负数,或者如果从来没有一个负数,那么直到单元格为空。我希望这对每一行也有一个双 Do Until 循环。

请问大家有什么想法吗?

谢谢!

【问题讨论】:

  • 无关,但IsEmpty 可能不是您要查找的功能。对于导致“空”单元格的公式,它将返回 false,例如 =""
  • 您可能要考虑使用finding the last row with data,而不是Do Until 循环,然后改用For 循环。
  • If Cells(r, c).Value &lt; 1 Then 永远不会以这种方式执行,因为Do Until Cells(r, c).Value &lt; 1 = True 将在该条件下停止DO 循环。此外,不确定您想要 ELSE 语句的位置,但它应该在 IF : END IF 结构内。
  • 你是否更新了你说你必须工作的代码?此外,您的图片似乎不适用。
  • @Samantha 正如您所说的那样,vour 代码中有几个错误。尝试在 VBE 的 Debug 菜单中编译 VBA 项目。

标签: vba excel


【解决方案1】:

要提前退出Do 循环,请使用Exit Do。由于您有两个嵌套循环,因此您需要一个标志来退出外部循环。

Sub RunoutDateLoop()
    Dim r As Long, c As Long
    Dim Found As Boolean
    r = 8
    Do Until IsEmpty(Cells(r, 1))
        c = 24
        Do Until IsEmpty(Cells(r, c))
            If Cells(r, c).Value < 1 Then
                Cells(r, 18).Value = Cells(7, c)
                Found = True
                Exit Do 'Exit the inner do
            End If
            c = c + 1
        Loop
        If Found Then Exit Do 'exit the outer do
        r = r + 1
    Loop
End Sub

注意:我不对循环中的逻辑发表评论,有点不清楚您的数据是什么,以及您需要的确切逻辑(例如 如果数字是负数 vs @987654325 @)

【讨论】:

  • 您好,请问“Dim r As Long, c As Long Dim Found As Boolean”的目的是什么?
  • Re the Dim's 他们将变量声明为正确的数据类型。 See here for further reading。你应该使用Option Explicit来强迫自己这样做
【解决方案2】:

在每个人的 cmets 的帮助下,这就是我所拥有的,并且完全按照我的意愿工作。这可能有点令人困惑,因为我的数据非常复杂,如果没有实际看到电子表格就很难理解。

Sub RunoutDateLoop()
Dim r As Long, c As Long
Dim Found As Boolean
r = 8
Do Until IsEmpty(Cells(r, 1))
    c = 24
    Do Until IsEmpty(Cells(r, c))
        If Cells(r, c).Value < 1 Then
            Cells(r, 18).Value = Cells(7, c)
            Found = True
            Exit Do 'Exit the inner do
                Else
                Cells(r, 18).Value = Cells(7, c)
        End If
        c = c + 1
    Loop
    r = r + 1
Loop
End Sub

【讨论】:

  • 我认为这已经足够了,除非您需要接受 Chris 的建议,明确并正确引用您的对象。这提高了准确性并消除了大部分运行时错误
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2017-02-27
  • 2018-08-24
  • 1970-01-01
  • 2021-08-27
  • 2015-10-07
相关资源
最近更新 更多