VBA : Erreur 13 aléatoire sur variable

Résolu/Fermé
jeff10241 Messages postés 3 Date d'inscription mercredi 30 janvier 2013 Statut Membre Dernière intervention 30 janvier 2013 - 30 janv. 2013 à 16:44
jeff10241 Messages postés 3 Date d'inscription mercredi 30 janvier 2013 Statut Membre Dernière intervention 30 janvier 2013 - 30 janv. 2013 à 19:34
Bonjour,

déjà désolé de ne pas fournir le classeur avec, il aiderait certainement pour la compréhension du problème. J'explique donc :
C'est un test pour éliminer sur 147 lignes des valeurs aberrantes calculées. Si le calcul donne plus que 3.5 (variable limite EEQ) 7 cellules sont effacées, le calcul est mit à jour et on passe à la ligne suivante, ceci sur 6 zones.

Voici pour la première zone les formules des cellules (qui sont toutes au format standard) :

AL : =SI(ESTNUM(N11);Q11-$AL$9;"")
AM : =SI(ESTNUM(N11);ABS(AL11);"")
AN : calculée par la première partie de la macro en copier/coller/trier
AO : =SI(ESTNUM(N11);(0,6745*(Q11-MOYENNE($Q$2:$Q$65536))/$AN$9);"")
AP : =SI(ESTNUM(N11);ABS(AO11);"")

Le problème est que j'ai aléatoirement une "erreur 13". J'ai essayé de déclarer testEEQ de plein de façons différentes mais rien à faire, pareil en changeant les formats de cellules.
Est ce que c'est parce qu'il y a une formule "masquant" les #VALEUR que ma variable crée des problèmes ? Ou parce que je la réutilise trop souvent sans lui redonner une valeur fixe genre testEEQ=1 à chaque fin de ligne ?

Voici donc le code ci dessous... Je remercie d'avance ceux qui trouveront la solution ou me donneront des idées.



Option Explicit
Sub ElimaberrEEQ()

Dim ligne As Integer
Dim testEEQ As String
Const limiteEEQ = 3.5

' tri et collage de valeurs pour mettre à jour la formule en AN10 : pas de problèmes

Range("AM10").Select
Range(Selection, Selection.End(xlDown)).Copy
Range("AN10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Sort Key1:=Range("AN10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers

' déclaration de mon compteur de ligne qui va de 10 à 147

ligne = 10
350

'contenu Ap entré dans ma variable test (plante desfois)

testEEQ = Range("AP" & ligne)

'si > 3 effacer la valeur aberrante (plante souvent)
If Abs(testEEQ) > limiteEEQ Then Range("Q" & ligne).Clear

'idem pour suite de la ligne
If Abs(testEEQ) > limiteEEQ Then Range("AL" & ligne, "AQ" & ligne).Clear
' compteur classique
ligne = ligne + 1
If ligne = 147 Then GoTo 360
GoTo 350
360

' Et on continue avec les 5 autres zones...

Range("AS10").Select
Range(Selection, Selection.End(xlDown)).Copy
Range("AT10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Sort Key1:=Range("AT10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers
ligne = 10
370
testEEQ = Range("AV" & ligne)
If Abs(testEEQ) > limiteEEQ Then Range("R" & ligne).Clear
If Abs(testEEQ) > limiteEEQ Then Range("AR" & ligne, "AW" & ligne).Clear
ligne = ligne + 1
If ligne = 147 Then GoTo 380
GoTo 370
380

5 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
30 janv. 2013 à 17:22
Bonjour,

Extrait de l'aide VBA :
Abs(number)
L'argument number peut contenir toute expression numérique valide.

Abs("") ne peux donc que renvoyer une erreur de type (erreur 13)
Fait le test :
MsgBox Abs(1)
MsgBox Abs(0)
MsgBox Abs("")

Il te faut donc tester au préalable ta variable testEEQ :
testEEQ = Range("AP" & ligne) 
If testEEQ <> "" Then
'si > 3 effacer la valeur aberrante (plante souvent) 
    If Abs(testEEQ) > limiteEEQ Then Range("Q" & ligne).Clear 
Else
    'ICI tu peux éventuellement ajouter un traitement à faire si testeEEQ est vide
End If
1
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
Modifié par eriiic le 30/01/2013 à 17:38
Bonjour à tous,

D'autre part je m'interroge sur le pertinence de :
Dim testEEQ As String
Const limiteEEQ = 3.5
avec
Abs(testEEQ) > limiteEEQ

Même si vba convertit il est plus juste de mettre :
Dim testEEQ As double
Const limiteEEQ as Double= 3.5

Ce qui pour une cellule vide donnera abs(0) au lieu de et non abs(""), ce qui est valide mathématiquement (à toi de tester ce cas si tu le considères comme particulier).

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
1
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 30/01/2013 à 17:42
Bonjour,

A priori c'est quand la valeur de testEEQ est vide que ABS(testEEQ) provoque l'erreur 13.

testEEQ est vide quand la cellule en colonne AP est vide donc quand la cellule en N n'est pas numérique (donc peut-être vide aussi)

Donc pour corriger il faut savoir quel traitement faut-il faire lorsque N n'est pas numérique. Faut-il qd même effacer ou bien faut-il passer à la ligne suivante ?

EDIT: salut eriiic et pijaku. Désolé j'avais pas vu vos réponses (pertinentes bien sur) avant de poster

Cordialement,
1
jeff10241 Messages postés 3 Date d'inscription mercredi 30 janvier 2013 Statut Membre Dernière intervention 30 janvier 2013
30 janv. 2013 à 17:14
Info en + : c'est souvent (mais pas tout le temps) quand la variable est vide que j'ai l'erreur (mais est elle vraiment vide ? vu qu'elle pioche quand même dans une cellule contenant une formule)...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeff10241 Messages postés 3 Date d'inscription mercredi 30 janvier 2013 Statut Membre Dernière intervention 30 janvier 2013
30 janv. 2013 à 19:34
Merci à tous les trois, tout le monde a raison !

j'aurais déjà du regarder un peu plus Abs en détails, mais j'avais fait une focalisation sur la variable !

Donc en effet c'est si ma cellule AP & ligne est vide, donc que mon testEEQ est nul que ça plante.

Je contourne donc le problème en vérifiant que ma cellule "source" Nx contient un chiffre, auquel cas je fais le test, autrement je passe à la zone suivante.

En en effet, ne sachant plus trop quoi déclarer pour la variable il y avait n'importe quoi, je remplace String par Double. Encore merci à vous.
0