2016-08-19 41 views
0

我不斷收到錯誤(要麼沒有if或沒有做循環),我真的不知道爲什麼......任何人都可以幫忙?!謝謝!語法在VBA中的錯誤

Do Until (Range("I4").Value = 0) 

    For i = 2 To lLastrow 

       If Range("G" & i).Value = 0 Then 
        i = i + 1 

       ElseIf Range("G" & i).Value < 0 Then 
         Do Until (Range("G" & i).Value = 0) 
         For j = 0 To i 
         If Range("F" & i - j).Value < 0 Then 
           Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
           Else: j = j + 1 
           End If 
          Application.Calculate 
         Loop 
        ElseIf Range("G" & i).Value > 0 Then 
         Do Until (Range("G" & i).Value = 0) 
          For k = 0 To i 
          If Range("F" & i - k).Value > 0 Then 
           Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
            Else: k = k + 1 
            End If 
           Application.Calculate 
         Loop 
       End If 


      Application.Calculate 
Loop 
+3

您的'For'循環中缺少'Next' – Siva

+3

這就是正確縮進的原因。 –

回答

1

你缺少Next語句你For循環

試試下面的代碼

Do Until (Range("I4").Value = 0) 

    For i = 2 To lLastrow 
     If Range("G" & i).Value = 0 Then 
     i = i + 1 
     ElseIf Range("G" & i).Value < 0 Then 
     Do Until (Range("G" & i).Value = 0) 
      For j = 0 To i 
      If Range("F" & i - j).Value < 0 Then 
       Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
      Else 
       j = j + 1 
      End If 
      Application.Calculate 
      Next'You missed this 
     Loop 
     ElseIf Range("G" & i).Value > 0 Then 
      Do Until (Range("G" & i).Value = 0) 
      For k = 0 To i 
       If Range("F" & i - k).Value > 0 Then 
       Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
       Else 
       k = k + 1 
      End If 
      Application.Calculate 
      Next 'You missed this 
      Loop 
     End If 

     Application.Calculate 
    Next 'You missed this 
Loop 
4

嘗試與你有什麼替換下面的代碼。您的For循環中的每一個都缺少NextDoLoop走在一起,類似地ForNext走在一起(他們形成循環的基礎)。

下面是代碼,我已經清除了它,以便更容易地遵循。

Do Until (Range("I4").Value = 0) 
    For i = 2 To lLastrow 
     If Range("G" & i).Value = 0 Then 
      i = i + 1 
     ElseIf Range("G" & i).Value < 0 Then 
      Do Until (Range("G" & i).Value = 0) 
       For j = 0 To i 
        If Range("F" & i - j).Value < 0 Then 
         Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
        Else 
         j = j + 1 
        End If 
        Application.Calculate 
       Next j 
      Loop 
     ElseIf Range("G" & i).Value > 0 Then 
      Do Until (Range("G" & i).Value = 0) 
       For k = 0 To i 
        If Range("F" & i - k).Value > 0 Then 
         Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
        Else 
         k = k + 1 
        End If 
        Application.Calculate 
       Next k 
      Loop 
     End If 
    Next i 
    Application.Calculate 
Loop 
+0

+1,以便您花時間清理縮進代碼。此外,爲了改進代碼控制和調試,我總是每個Next都有其迭代器變量('Next j','Next k','Next i')。您可能想要編輯您的代碼並將其帶入內部 – user3598756

+0

按照您的建議添加下一個後綴 –

+2

@ user3598756 IMO將iterator變量添加到'Next'語句僅僅是輕度混亂 - 如果*需要*它們以提高可讀性,那麼你的代碼可能太嵌套了(其中,深度6級,這裏肯定是這種情況),你應該重構(提取方法),而不是添加*更多*視覺噪聲。 –

1

這就是爲什麼適當一致壓痕事項:

Do Until (Range("I4").Value = 0) 
| For i = 2 To lLastrow 
| | If Range("G" & i).Value = 0 Then 
| | | i = i + 1 
| | ElseIf Range("G" & i).Value < 0 Then 
| | | Do Until (Range("G" & i).Value = 0) 
| | | | For j = 0 To i 
| | | | | If Range("F" & i - j).Value < 0 Then 
| | | | | | Range("F" & i - j).Value = Range("F" & i - j).Value + 1 
| | | | | Else 
| | | | | | j = j + 1 
| | | | | End If 
| | | | | Application.Calculate 
| | | | Next '<<<<<<< MISSING!! 
| | | Loop 
| | ElseIf Range("G" & i).Value > 0 Then 
| | | Do Until (Range("G" & i).Value = 0) 
| | | | For k = 0 To i 
| | | | | If Range("F" & i - k).Value > 0 Then 
| | | | | | Range("F" & i - k).Value = Range("F" & i - k).Value - 1 
| | | | | Else 
| | | | | | k = k + 1 
| | | | | End If 
| | | | | Application.Calculate 
| | | | Next '<<<<<<< MISSING!! 
| | | Loop 
| | End If 
| | Application.Calculate 
| Next '<<<<<<< MISSING!! 
Loop 

現在,你有6級嵌套在這裏,和頗多重複。這就是你需要重構提取物的過程從內嵌套的代碼,以消除冗餘,提高了代碼的可讀性和可維護性的標誌(一個修改應該意味着一個位置更改代碼)。

如果您的代碼按預期工作,我建議您將它(整個過程,甚至整個模塊!)帶到Code Review進行清理,並提示如何提高和強化您的代碼(例如, t經常需要Calculate,而且不合格的Range調用隱式引用活動工作表 - 這可能會在以後引發意外的錯誤!)。

+0

謝謝你的提示,我現在就去看看!非常偏倚的基礎知識,所以它非常不整潔我知道,對不起! –

+1

@AlexW如果你堅持並定期將你的工作代碼放在[codereview.se]上進行審查,你將很快學會如何編寫乾淨,可維護的代碼。在另一邊見! –

+0

我確實希望如此!生病繼續練習 –