Excel 如果变量为空,如何结束循环

Excel 如果变量为空,如何结束循环,excel,vba,vba7,vba6,Excel,Vba,Vba7,Vba6,嗨,我正在尝试在我的范围内找到单词description,如果description是foudn,那么它应该运行宏,然后循环。但是如果变量为空,并且找不到变量描述,我希望循环结束并显示msgbox。我尝试使用loop结束循环,直到单元格为空,但它似乎不起作用。变量celling引用为空,因此我不确定这为什么不起作用。任何帮助都将非常感谢max,max,稍微猜猜你的意图-可能需要你的帮助。这能让你更亲近吗?我不认为我可以在GNU/Linux机器上做得更好 Sub max() Sheets(1).

嗨,我正在尝试在我的范围内找到单词description,如果description是foudn,那么它应该运行宏,然后循环。但是如果变量为空,并且找不到变量描述,我希望循环结束并显示msgbox。我尝试使用loop结束循环,直到单元格为空,但它似乎不起作用。变量celling引用为空,因此我不确定这为什么不起作用。任何帮助都将非常感谢max,max,稍微猜猜你的意图-可能需要你的帮助。这能让你更亲近吗?我不认为我可以在GNU/Linux机器上做得更好

Sub max()

Sheets(1).Select
Sheets(1).Name = "Sheet1"

Dim rng As Range
Dim celladdress As String
Dim celling As Variant

Do Until IsEmpty(celling)

    If celling > "G4" Then
    
    Set rng = Range("G3:G1000").Find(what:="Description")
    rng.Find what:="Description"
    
    celladdress = rng.Address(-1)
    celling = celladdress
    Else: Call Source

    End If
Loop

MsgBox "done"

End Sub

Max,这是值得发布的一个新答案,以突出FindNext的不直观行为。这是有效的-比上面的答案更适合被接受的答案。可能有点迂腐,因为在更优雅的解决方案中:

Sub max()

Sheets(1).Select
Sheets(1).Name = "Sheet1"

Dim rng As Range
Set rng = Range("G3:G1000")

Dim celladdress As String
Dim celling As Range
 
Set celling = rng.Find(what:="Description")
If celling Is Nothing Then
    MsgBox "Not found, exiting"
    Exit Sub
End If

Do 
    'Set celling = range.FindNext    'Keeps returning first range found! Maybe "With" block on rng will work.
    If celling.Row > 4 Then
        'celling.Activate
        celladdress = celling.Offset(-1, 0).Address
        MsgBox celladdress
    'Else: Call Source   'What is Source? Not this sub, is it?
    
    End If
    Set celling = range.FindNext 
Loop Until celling Is Nothing

MsgBox "done"

End Sub

嗨,克劳斯特,谢谢你的回复。是的,非常接近。我遇到的困难是,当它在循环中运行并将数据排序为一行时,它会留下一组数据,而这些数据在底部没有描述。我将msgbox保留为“done”,以便在循环中断时知道在何处添加代码。我已经试过你的peice了,但它离工作太近了。我正在试着弄清楚单元格是否为空/空/什么都没有,然后我可以打破循环,然后在底部添加我的附加代码。如果你能帮我做这件事,我将不胜感激。谢谢马克斯,我急忙赶来。很抱歉我正在修复我的bonehead错误,按下了一个组合键,关闭了我唯一的Windows PC。现在它不会跑了。我将看看是否可以修复这个GNU/Linux框上的错误。等一下,谢谢克劳斯鲁斯特,非常感谢你的帮助。我试过with block,但我不确定我是否正确使用它。如果你明天有空,你能帮我吗?Call source是我运行的另一个子系统,用于将数据移动到新行,准备传输到我的主数据表中。简化代码基本上将数据移动到新行,然后删除范围。我想这就是我不断得到错误的地方,因为当它循环时,我希望它在数据被删除后查找新的描述值。例如,当我运行这段代码时,它在G11处找到了完美的结果,但在理论上,数据应该被删除,然后循环回到开始处,在那里它会查找下一个描述,删除时将是G12。由于范围大小不同,我需要在删除后找到下一个描述,如果找不到描述,则需要中断循环并找到下一个空白。如果您对如何实现这一点有任何建议,那将非常感谢。请小心删除单元格、行或列。许多其他人可能会被转移到“填补空缺”,他们的地址也会改变。然后,循环将跳过一些,除非从最后一个单元格/行/列开始并向后(通常向上和/或向左)运行。我怀疑有一种很好的方法可以提供相对简单的预期结果,但这可能意味着到目前为止您必须放弃部分或全部代码。Excel的屏幕截图显示了开始、最终结果,也许几个中间状态会真正传达目标。首先用A/1替换私有文本/nums。
Sub max()

Sheets(1).Select
Sheets(1).Name = "Sheet1"

Dim rng As Range
Set rng = Range("G3:G1000")

Dim celladdress As String
Dim celladdressPrevious As String
Dim celling As Range
 
Set celling = rng.Find(what:="Description")
If celling Is Nothing Then
    MsgBox "Not found, exiting"
    Exit Sub
End If

Do
    'Set celling = range.FindNext    'Keeps returning first range found! Maybe "With" block on rng will work.
    If celling.Row > 4 Then
        'celling.Activate
        celladdress = celling.Offset(-1, 0).Address
        If celladdress = celladdressPrevious Then GoTo WereDone
        celladdressPrevious = celladdress
        MsgBox celladdress
    'Else: Call Source   'What is Source? Not this sub, is it?
    
    End If
    If celling.Row = 1000 Then Exit Sub
    Set rng = Range("G" & celling.Row & ":G1000")
    Set celling = rng.Find(what:="Description")
Loop Until celling Is Nothing

WereDone:
MsgBox "done"

End Sub