Создание цикла в VBA Macro для Excel?

Мне посчастливилось получить ответ от кого-то на предыдущий вопрос, который я задал.Посмотреть здесь.

Единственное, с чем я борюсь - это создание цикла, который завершит макрос при достижении пустой ячейки в столбце B. Я пытался прочитать другой код, но на самом деле ничего для меня не нажималось (если, кроме циклов, End With Loops и т. Д. ). Это последний шаг к моему макросу, и мне бы очень хотелось узнать, как создать циклы и / или решить эту проблему для меня. Спасибо как всегда. Люди на этом сайте бесподобны!

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)

Решение Вопроса

Хотя на самом деле вы можете захотеть зацикливаться, пока не доберетесь до пустой строки, большинству людей будет удобнее зацикливаться до последней заполненной строки в определенном столбце, что работает, даже если у вас есть несколько (или много) пробелов в столбце.

Обратите внимание, что вам может даже не понадобиться цикл. С помощью.autofilter или же.find гораздо эффективнее. (сравнимо с использованием предложения where в запросе SQL вместо курсора)

Сказав все это, если вам нужен цикл, лучший способ - объявить несколько объектов, включая рабочую таблицу и диапазон, чтобы вы могли выполнить цикл без выбора или активации чего-либо в вашем коде. Как вам скажет любой разработчик 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
 user230092301 июн. 2013 г., 20:44
Потрясающие! Спасибо начальник кейтеринга! Я сломаю ваш код и прочту .autofilter и .find. Я не знаком с этими ... пока :) Еще раз спасибо.
 Jon Crowell01 июн. 2013 г., 21:21
Вы'очень приветствуется. Я'Я рад, что это сработало для вас.

Ваш ответ на вопрос