2015-09-22 23 views
12

Czytanie niektórych odpowiedzi w stackoverflow Widziałem pętlę whilewend. Jestem przyzwyczajony do do whileloop, więc zastanawiałem się, jaka byłaby różnica między tymi dwoma pętlami.Obwód "Do", "Pętla" i "Podczas" "Wend". Co za różnica?

Zrobiłem kilka testów (kod poniżej) i oba wydają się dawać mi takie same wyniki.

Sub test_loop_1() 
Dim i As Integer 
i = 1 
Do While i < 10 
    Cells(i, 1) = i 
    i = i + 1 
Loop 

End Sub 

Sub test_loop_2() 
Dim i As Integer 
i = 1 
While i < 10 
    Cells(i, 1) = i 
    i = i + 1 
Wend 

End Sub 
+2

Całkiem dobrze [informacje tutaj] (https://msdn.microsoft.com/en-us/library/zh1f56zs.aspx). Pętla 'While' zawsze zawsze testuje warunek, gdzie pętla' do' zapewnia większą elastyczność w miejscu testowania twojego stanu. Wygląda na to, że pętla 'While' może zawsze zostać zastąpiona pętlą' do while'. –

+0

Nie można również użyć opcji 'Exit While'. –

Odpowiedz

15

Odpowiedź, o której wspomniałem, nie jest już widoczna, ale ta odpowiedź nadal jest prawdziwa. Choć/Wend jest kac od Podstawowy i zrobić/Loop powinien być preferowany składnia ponieważ:

  1. Obsługuje sprawdzenie stanu przed wejściem do pętli Do While [condition] ... Loop (zero lub więcej egzekucji pętla)
  2. Wspiera sprawdzenie stanu po wprowadzenie pętli Do ... Loop While [condition] (jeden lub więcej egzekucji pętla)
  3. obsługuje żadnego konkretnego stanu Do ...(some logic) (Exit Do) ... Loop (jeden lub więcej egzekucji pętli, potencjalnie nieskończonej)
+0

Czy w VBA nie ma "Exit While"? Również użytkownik skomentował, że "While Wend" będzie starszą wersją "Do While" utrzymywaną z zachowaniem zgodności wstecznej. Czy wiesz, czy to prawda? @NeepNeepNeep – umLu

+2

"Exit While" nie istnieje i tak, uważam, że podczas/Wend jest zachowana zgodność wstecz. Naprawdę, będzie to Do/Loop, którego powinieneś używać. – NeepNeepNeep

+0

@vsoraas komentarz nie wydaje się już pojawiać. – Panzercrisis

0

W rzeczywistości nie potrzebujesz "DO WHILE", ponieważ możesz "DO-LOOP" bez "While".

Używam "DO LOOP", jeśli potrzebuję wykonać akcję co najmniej jeden raz (lub kilka razy) bez żadnych ukrytych warunków, tak jak podskakuje WHILE-WEND.

Wystarczy na przykład, rodzaj budzika:

Do 
    Display Time at screen 
    Sounds a buzz 
    if user confirm 
     exit do 
    end if 
    Loop 
+0

Interesujące, ale wydaje się, że jest to różnica między "pętlą do zrobienia" i "pętlą do wykonania". Nie do końca to, o co prosiłem. – umLu

6

Nie sądzę, nie ma wielkiej różnicy w ich wykonaniu innym niż składniowych opcji While Wend nie jest zdolny do:

Do 
    someCode 
While (someCondition) 

chodzi o prędkość, zrobiłem prosty test:

Sub whileLoopTest() 
Dim i As Long, j As Long 
Dim StartTime As Variant 

i = 1 
StartTime = Timer 

While (i < 500000000) 
    j = i + 2 
    i = i + 1 
Wend 

Debug.Print "While execution time: " & Timer - StartTime 
End Sub 


Sub doWhileTest() 
Dim i As Long, j As Long 
Dim StartTime As Variant 

i = 1 
StartTime = Timer 

Do While (i < 500000000) 
    j = i + 2 
    i = i + 1 
Loop 

Debug.Print "Do While execution time: " & Timer - StartTime 
End Sub 

Wynik s:

While execution time: 6,429688 
While execution time: 6,429688 
While execution time: 6,441406 
Do While execution time: 6,429688 
Do While execution time: 6,449219 
Do While execution time: 6,4375 
+0

Jeśli chodzi o szybkość, wydaje mi się to samo. Dlaczego miałaby powstać pętla, która jest dokładnie taka sama, tylko bez niektórych funkcji? Użytkownik skomentował (i został usunięty, nie wiem dlaczego), że "While Wend" byłby starszą wersją "Do While" utrzymywaną z zachowaniem zgodności wstecznej. Czy wiesz, czy to prawda? @vsoraas – umLu

+1

@umLu Nie wiedziałbym na pewno, ale wydaje się logiczne, że 'Podczas gdy Wend' był pierwszy, a następnie' Do While' jest wprowadzany później z dodatkową i lepszą składnią i funkcjami. – Vegard