2017-06-20 36 views
0

我看不出錯誤在哪裏。下一個沒有錯誤,同時添加新的If功能VBA

這是目前我的代碼:

For Each Rng3 In Range("$A$3:$A$1000") 
If Rng3.Value = "Account Credit (Debit G/L)" Then 
    If Rng3.Offset(0, 8).Value = "IVR Risk" Then 
     If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
      GLIVR = GLIVR + 1 
     Else: Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
    Rng3.Offset(0, 5).Value <> "812-519" Then 
     If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
      GLManual = GLManual + 1 
     ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
    Rng3.Offset(0, 5).Value <> "812-519" Then 
     If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
      EFGLManual = EFGLManual + 1 
     End If 
If Rng3.Value = "Account Credit (Debit G/L)" Then 
    If Rng3.Offset(0, 8).Value = "IVR Risk" Then 
     If Rng3.Offset(0, 5).Value <> "812-135" Then 
     If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
      GLIVR = GLIVR + 1 
     Else: Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
    Rng3.Offset(0, 5).Value <> "812-135" Then 
     If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
      GLManual = GLManual + 1 
     ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
    Rng3.Offset(0, 5).Value <> "812-135" Then 
     If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
      EFGLManual = EFGLManual + 1 
     End If 
    End If 
End If 

下一頁Rng3

我沒有看到錯誤所在。

這是原來的代碼,我嘗試添加代碼:

For Each Rng3 In Range("$A$3:$A$1000") 
If Rng3.Value = "Account Credit (Debit G/L)" Then 
    If Rng3.Offset(0, 8).Value = "IVR Risk" Then 
     If Rng3.Offset(0, 1).Value = 50 Or Rng3.Offset(0, 1).Value > 50 Then 
      GLIVR = GLIVR + 1 
     Else: Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
    Rng3.Offset(0, 5).Value <> "812-519" Then 
     If Rng3.Offset(0, 1).Value = 50 Or Rng3.Offset(0, 1).Value > 50 Then 
      GLManual = GLManual + 1 
     ElseIf Rng3.Offset(0, 1).Value < 25 Then Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
    Rng3.Offset(0, 5).Value <> "812-519" Then 
     If Rng3.Offset(0, 1).Value = 25 Or Rng3.Offset(0, 1).Value > 25 Then 
      EFGLManual = EFGLManual + 1 
     End If 
    End If 
End If 

下一頁Rng3

任何幫助將不勝感激。

謝謝。

@barrowc感謝您給我們解釋這使得有很大的意義。感謝您的建議,我已經解決了這個錯誤,但現在似乎還有另一個問題。這是現在的代碼:

'For Each Rng3 In Range("$A$3:$A$1000") 
    If Rng3.Value = "Account Credit (Debit G/L)" Then 
     If Rng3.Offset(0, 8).Value = "IVR Risk" Then 
      If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
       GLIVR = GLIVR + 1 
      Else: Rng3.ClearContents 
      End If 
     ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
     Rng3.Offset(0, 5).Value <> "812-519" Then 
      If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
       GLManual = GLManual + 1 
      ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
      End If 
     ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
     Rng3.Offset(0, 5).Value <> "812-519" Then 
      If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
       EFGLManual = EFGLManual + 1 
     ElseIf Rng3.Offset(0, 8).Value = "IVR Risk" And _ 
     Rng3.Offset(0, 5).Value <> "812-135" Then 
       If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
       GLIVR = GLIVR + 1 
      Else: Rng3.ClearContents 
      End If 
     ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
     Rng3.Offset(0, 5).Value <> "812-135" Then 
      If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
       GLManual = GLManual + 1 
      ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
      End If 
     ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
     Rng3.Offset(0, 5).Value <> "812-135" Then 
      If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
       EFGLManual = EFGLManual + 1 
      End If 
      End If 
     End If 
    End If 
Next Rng3 

我遇到的新問題是與代碼的第二部分是:

 ElseIf Rng3.Offset(0, 8).Value = "IVR Risk" And _ 
    Rng3.Offset(0, 5).Value <> "812-135" Then 
      If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
      GLIVR = GLIVR + 1 
     Else: Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
    Rng3.Offset(0, 5).Value <> "812-135" Then 
     If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
      GLManual = GLManual + 1 
     ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
     End If 
    ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
    Rng3.Offset(0, 5).Value <> "812-135" Then 
     If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
      EFGLManual = EFGLManual + 1 
     End If 
     End If 
    End If 
End If 

下一頁Rng3

這部分似乎什麼也不做我的結果。這個代碼背後的想法是,當列5命名爲「812-135」時,我想清除250以下的值。如果值爲250或以上,我希望它顯示就像上面的行一樣。 對於「812-519」的代碼工作。基本上我想要顯示在「812-519」下顯示的相同結果顯示在「812-135」下,但不是任何值,只有大於或等於250的值。目前使用此代碼顯示所有值「812-135」(例如2,3,5,109,111等)

+0

問題是?你想達到什麼目的?給出錯誤的行?請注意,問題越短和/或越清晰我們可以提供更多幫助 – Sgdva

+0

您是否在設計太空船?從來沒有見過如此多層次的嵌套ifs。我建議你*重新考慮你的問題並重新組織你的代碼。 –

+0

@sgva由於barrowc的評論,我現在修復了錯誤代碼。其目的是粘貼一組數據,並有一個宏,用於過濾掉需要的行和不需要的行。在我編輯之後,上述代碼的第二部分背後的想法是,當列5被命名爲「812-135」時,我想清除250以下的值。如果數值爲250或以上,我希望它顯示爲與「812-519」中的上述行一樣。基本上我想要顯示在「812-519」下顯示的相同結果顯示在「812-135」下,但只有值> 250 –

回答

0

For Each... Next之類的任何控制結構必須在其打開語句之前的嵌套級別與在其關閉語句之後的嵌套級別相同。在給定的代碼,是之前立即For Each部分在嵌套級別0,但後立即Next部分是在嵌套級別3

有需要添加三個End If聲明,但究竟在何處添加它們取決於如何你的代碼應該工作。給出的代碼中的縮進並不反映實際的嵌套層次。部分給定的代碼達到七層嵌套,這表明代碼需要重構。

這裏有一個簡單的嵌套層次的例子。這是可行的(之前和之後的水平是相同的):

' nesting level 0 
For Each a in b 
    ' nesting level 1 
    If a.Value > 5 Then 
     ' nesting level 2 
    End If 
    ' nesting level 1 
Next a 
' nesting level 0 

這也不行(前水平之後都爲For Each... Next都和If... End If不同):

' nesting level 0  
For Each a in b 
    ' level 1 
    If a.Value > 5 Then 
     ' level 2 
    Next a 
    ' level 1 
End If 
' level 0 

看着剛你的代碼的相關部分:

' nesting level 0 
For Each Rng3 In Range("$A$3:$A$1000") 
    ' level 1 
    If Rng3.Value = "Account Credit (Debit G/L)" Then 
     ' level 2 
     If Rng3.Offset(0, 8).Value = "IVR Risk" Then 
      ' level 3 
      If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
       ' level 4 
      End If 
      ' level 3 (but ElseIf acts at nesting level above) 
     ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
     Rng3.Offset(0, 5).Value <> "812-519" Then 
      ' level 3 
      If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
       ' level 4 
      End If 
      ' level 3 (but ElseIf acts at nesting level above) 
     ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
     Rng3.Offset(0, 5).Value <> "812-519" Then 
      ' level 3 
      If Rng3.Offset(0, 1).Value = 0 Or Rng3.Offset(0, 1).Value > 0 Then 
       ' level 4 
      End If 
      ' level 3 
      If Rng3.Value = "Account Credit (Debit G/L)" Then 
       ' level 4 
       If Rng3.Offset(0, 8).Value = "IVR Risk" Then 
        ' level 5 
        If Rng3.Offset(0, 5).Value <> "812-135" Then 
         ' level 6 
         If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
          ' level 7 
         End If 
         ' level 6 (but ElseIf acts at level above) 
        ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
        Rng3.Offset(0, 5).Value <> "812-135" Then 
         ' level 6 
         If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
          ' level 7 (but ElseIf acts at level above) 
         ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
         End If 
         ' level 6 (but ElseIf acts at level above) 
        ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
        Rng3.Offset(0, 5).Value <> "812-135" Then 
         ' level 6 
         If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
          ' level 7 
         End If 
         ' level 6 
        End If 
        ' level 5 
       End If 
       ' level 4 
      Next rng3 
      ' level 3 

編輯:改變的碼不正確,在這一部分:

If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
    GLManual = GLManual + 1 
ElseIf Rng3.Offset(0, 1).Value < 0 Then Rng3.ClearContents 
End If 

從而清除內容只爲值這樣做小於零的線。對於0到249之間的值,不採取任何操作。

您可以將代碼更改爲:

If Rng3.Offset(0, 1).Value = 250 Or Rng3.Offset(0, 1).Value > 250 Then 
    GLManual = GLManual + 1 
ElseIf Rng3.Offset(0, 1).Value < 250 Then Rng3.ClearContents 
End If 

如果你看一下所涉及的價值,然而,Rng3.Offset(0, 1)每一個可能的值將滿足無論是如果子句或elseif的條款。因此,代碼應寫爲:

If Rng3.Offset(0, 1).Value >= 250 Then 
    GLManual = GLManual + 1 
Else 
    Rng3.ClearContents 
End If 

x >= y是簡寫形式x > y Or x = y

這消除了兩個潛在的問題:未辦理

  • 無意中具有值的(你」已經有這個問題)。現在,任何值都將滿足If子句或Else子句
  • 更新一些比較值但不是其他值(您已經有此問題)。現在只有一個比較值出現,所以這個問題不會再發生在這個If... End If塊中。

進一步的改進將是定義和使用常量「幻數」,是這樣的:

' Near the start of the Sub or Function 
Const LIMIT_812_135 As Integer = 250 

' Use it like this 
ElseIf Rng3.Offset(0, 8).Value = "IVR Risk" And _ 
Rng3.Offset(0, 5).Value <> "812-135" Then 
    If Rng3.Offset(0, 1).Value >= LIMIT_812_135 Then 
     GLIVR = GLIVR + 1 
    Else: Rng3.ClearContents 
    End If 
ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "No" And _ 
Rng3.Offset(0, 5).Value <> "812-135" Then 
    If Rng3.Offset(0, 1).Value >= LIMIT_812_135 Then 
     GLManual = GLManual + 1 
    Else 
     Rng3.ClearContents 
    End If 
ElseIf Rng3.Offset(0, 8).Value = "Manual Risk" And Rng3.Offset(0, 9).Value = "Yes" And _ 
Rng3.Offset(0, 5).Value <> "812-135" Then 
    If Rng3.Offset(0, 1).Value >= LIMIT_812_135 Then 
     EFGLManual = EFGLManual + 1 
    End If 

這防止無意中被用於整個代碼相同的比較不同的值,並且還允許比較值只需通過編輯常量的值來更改

+0

我已編輯帖子,在問題上添加更多評論。道歉,如果這不是如何做到這一點,我不知道如何回覆足夠的空間來編寫所有的代碼。謝謝 –