2013-05-24 7 views
0

Мне посчастливилось получить ответ от кого-то по предыдущему вопросу, который я задал. See here.Создание цикла в макросе VBA для Excel?

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

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 

ответ

4

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

Обратите внимание, что вам даже не нужен цикл. Использование .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 
+1

Awesome! Спасибо, глава общественного питания! Я сломаю ваш код и прочитаю .autofilter и .find. Я не знаком с этими ... пока :) Еще раз спасибо. – user2300923

+0

Добро пожаловать. Я рад, что сработал для вас. –

Смежные вопросы