2017-06-20 1 views
0

Je ne vois pas où l'erreur est.Suivant sans pour Erreur lors de l'ajout de nouvelles fonctions Si VBA

c'est actuellement mon code:

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 

Suivant Rng3

Je ne vois pas où est l'erreur.

Ce fut le code original j'ai essayé d'ajouter du code à:

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 

Suivant Rng3

Toute aide serait grandement appréciée.

merci.

@barrowc Merci pour cette explication, cela a beaucoup de sens. Merci à votre recommandation, j'ai résolu l'erreur, mais maintenant il semble y avoir un autre problème avec elle. Ceci est maintenant le code:

'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 

Le nouveau numéro que j'ai est la deuxième partie du code qui est:

 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 

Suivant Rng3

Cette partie semble ne rien faire à mes résultats. L'idée derrière ce code est que je veux effacer les valeurs en dessous de 250 lorsque la colonne 5 est nommée "812-135". Si la valeur est égale ou supérieure à 250, je veux qu'elle s'affiche comme le font les lignes ci-dessus. Pour "812-519" le code a fonctionné. Fondamentalement je veux avoir les mêmes résultats qui sont montrés sous "812-519" pour être montrés sous "812-135" mais pas pour n'importe quelle valeur, seulement pour des valeurs supérieures ou égales à 250. Actuellement avec ce code montre toutes les valeurs sous "812-135" (par exemple 2,3,5,109,111 etc.)

+0

Le problème est? Qu'essayez-vous d'accomplir? Ligne qui donne l'erreur? Veuillez noter que plus la question est courte et/ou claire, mieux nous pouvons vous aider – Sgdva

+0

Êtes-vous en train de concevoir un vaisseau spatial? Jamais vu autant de niveaux d'imbriqués imbriqués. Je vous conseille de * repenser * votre problème et de réorganiser votre code. –

+0

@sgva J'ai maintenant corrigé le code d'erreur grâce au commentaire de barrowc. Le but est de coller un ensemble de données et d'avoir une macro avec laquelle filtrer les lignes qui sont nécessaires et celles qui ne le sont pas. L'idée derrière la deuxième partie du code mentionné ci-dessus après mon édition est que je veux effacer les valeurs ci-dessous 250 lorsque la colonne 5 est nommée "812-135". Si la valeur est égale ou supérieure à 250, je veux qu'elle s'affiche comme les lignes précédentes sous "812-519". Fondamentalement je veux avoir les mêmes résultats qui sont montrés sous "812-519" pour être montrés sous "812-135" mais seulement pour des valeurs> = 250 –

Répondre

0

Toute structure de contrôle telle que For Each... Next doit avoir le niveau d'imbrication immédiatement avant son instruction d'ouverture identique au niveau d'imbrication immédiatement après son instruction de fermeture. Dans le code donné, immédiatement avant la For Each partie est au niveau d'imbrication 0, mais immédiatement après la partie Next est au niveau d'imbrication 3.

Il faut être trois plus End If déclarations ajoutés mais exactement où les ajouter dépend de la façon Votre code devrait fonctionner. L'indentation dans le code donné ne reflète pas les niveaux d'imbrication réels. Des parties du code donné atteignent sept niveaux d'imbrication, ce qui suggère que le code doit être refactorisé.

Voici un exemple de niveau d'imbrication simple.Ceci est OK (avant et après les niveaux sont les mêmes):

' 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 

Ce n'est pas OK (avant et après les niveaux sont différents pour les deux For Each... Next et 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 

En regardant juste la partie pertinente de votre code:

' 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 

modifier: le code modifié est incorrect dans cette partie:

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 

La ligne qui efface le contenu ne le fait que pour les valeurs inférieures à zéro. Pour les valeurs comprises entre 0 et 249, aucune action n'est effectuée.

Vous pouvez changer le code:

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 

Si vous regardez les valeurs en cause, cependant, toutes les valeurs possibles de Rng3.Offset(0, 1) satisfera soit la clause Si ou la clause ElseIf. Par conséquent, le code doit être écrit:

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

x >= y est une forme courte pour x > y Or x = y

Cela élimine deux problèmes potentiels:

  • ayant involontairement des valeurs qui ne sont pas traitées (vous » J'ai déjà eu ce problème). Maintenant, n'importe quelle valeur satisfera la clause If ou la clause Else
  • en mettant à jour certaines des valeurs de comparaison mais pas d'autres (vous avez déjà eu ce problème). Maintenant, il n'y a qu'une occurrence de la valeur de comparaison, ce problème ne peut plus se produire pour ce bloc If... End If.

Une autre amélioration serait de définir et d'utiliser des constantes pour « nombres magiques », comme ceci:

' 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 

Cela empêche des valeurs différentes involontaire utilisées pour la même comparaison à travers le code et permet également la valeur de comparaison à modifier simplement en éditant la valeur de la constante

+0

J'ai modifié la publication pour ajouter d'autres commentaires sur le problème. Excuses si ce n'est pas comment le faire, je ne pouvais pas comprendre comment répondre avec assez d'espace pour écrire tout le code. Merci –