在Excel的VBA宏中创建循环?

时间:2013-05-24 23:55:44

标签: excel vba loops excel-vba

我很幸运能够得到某人对我之前提出的问题的回复。 See here

我唯一要努力的就是创建一个循环,它会在到达B列中的空白单元格时结束宏。我一直在尝试读取其他代码,但没有任何东西真正点击我(如果,比循环,结束与循环等)。这是我的宏的最后一步,我会喜欢有关如何为我创建循环和/或解决此问题的任何资源。一如既往地谢谢。这个网站上的人都无济于事!

Sub Redirect()
Dim IE As Object
Dim doc As Object

Set IE = CreateObject("InternetExplorer.Application")

With IE
    .Visible = True
    .Navigate "https://...."

    Do Until .ReadyState = 4: DoEvents: Loop

    With .Document.forms("digiSHOP")
        .elements("OldUrl").Value = Range("A2")
        .elements("NewUrl").Value = Range("B2")
        .submit
    End With

    Do Until .ReadyState = 4: DoEvents: Loop
    Do While .Busy: DoEvents: Loop

End With
End Sub

1 个答案:

答案 0 :(得分:4)

虽然你可能实际上想要循环直到你得到一个空行,但是大多数人发现循环到特定列中最后一个填充的行更有用,即使你有几个(或很多)空白也行。专栏。

请注意,您甚至可能不需要循环。使用.autofilter.find效率更高。 (与在SQL查询中使用where子句而不是游标相比)

说了这么多,如果你确实需要循环,最好的方法是声明一些对象,包括工作表和范围,这样你就可以在不选择或激活代码中的任何内容的情况下执行循环。任何值得他或她的盐的Excel VBA开发者都会告诉你,应该始终避免选择和激活。

您可以将以下内容用作模板:

Sub LoopUntilLastRow()
    Dim ws As Worksheet
    Dim rng As Range
    Dim cell As Range
    Dim lastRow As Long
    Dim myColumn As String

    Set ws = ThisWorkbook.Sheets("Sheet1")
    myColumn = "A"
    lastRow = ws.Range(myColumn & ws.Rows.Count).End(xlUp).Row
    If lastRow = 1 Then
        MsgBox "Column " & UCase(myColumn) & " is empty."
        Exit Sub
    End If

    Set rng = ws.Range(myColumn & "1:" & myColumn & lastRow)
    For Each cell In rng
        ' do something
        cell.Interior.Color = vbYellow
    Next cell
End Sub