2013-02-23 78 views
1

我的循環似乎過早退出。基本上,我想要以下條件:在VBA中過早退出循環

如果fc-WC(j-1)+ WCinit + RefEF * dz小於Precip * dz,WC(j-1)+ WCinit * dz比pwp 更重

然後徑流和滲濾等於雨-FC(WC + WCinit)+ REFET * DZ * 0.5 和WJ(J)= FC

別的 徑流和滲濾= 0 和WC(J)= WC(j-1)+ WCinit + precipit-RefET * dz

但是如果WC(j-1)+ WCinit(i)< = pwp 然後首席WC(j)的= PWP

我想整個循環結束時,i和j = 12

環路似乎結束當j = 2

Dim fc As Double 
fc = Cells(4, 7).Value 
NumMonth = 12 
i = 1 
j = 2 
Dim pwp As Double 
pwp = Cells(4, 8).Value 
Dim dz As Double 
dz = 0.5 'm 

While (WC(j - 1) + WCinit(i) * dz > pwp * dz) And (j <= NumMonth) 
    If (fc - (WC(j - 1) + WCinit(i)) + RefET(i) * dz) < (Precip(i) * dz) Then 
     Runoff(i) = (Precip(i) - fc - (WC(j - 1) + WCinit(i)) + RefET(i) * dz) * 0.5 
     Percolation(i) = (Precip(i) - fc - (WC(j - 1) + WCinit(i)) + RefET(i) * dz) * 0.5 
     WC(j) = fc 

    Else 
     Runoff(i) = 0 
     Percolation(i) = 0 
     WC(j) = WC(j - 1) + WCinit(i) + Precip(i) - RefET(i) * dz 

    End If 
    j = j + 1 
    i = i + 1 

Wend 
If WC(j - 1) + WCinit(i) <= pwp Then 
    Runoff(i) = 0 
    Percolation(i) = 0 
    WC(j) = pwp 
End If 
+1

如果在Wend後面j = 2,那麼在你開始之前你永遠不會進入While循環,因爲j = 2。由於'j <= NumMonth'在循環開始時顯然是真的,所以在第一次遇到時,另一個While條件 - WC(j-1)+ WCinit(i)* dz> pwp * dz'是錯誤的,所以你永遠不會進入循環。你應該使用F8來檢查你的代碼。 – 2013-02-23 16:22:04

+0

此外,我沒有看到你的數組(或變體)變量'WC'和'WCinit'是在哪裏聲明或初始化的。他們不是嗎? – 2013-02-23 16:29:15

+0

你有什麼建議如何解決這個問題?切換循環的順序?我一直在通過我的代碼,我明白這是發生,但是,我是新來的VBA,不知道從哪裏走。 – user1977802 2013-02-23 16:31:04

回答

2

正如我們在評論中討論過,代碼永遠不會進入While循環,因爲條件WC(j - 1) + WCinit(i) * dz的第一部分永遠不會成立。第二部分,j <= NumMonth,顯然是對的。

要做這件事,並且能夠增加j直到While條件成立,你需要一個不同類型的循環,也許是Do Until。看到這個MSDN reference