VBA : Erreur 13 aléatoire sur variable
Résolu
jeff10241
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
jeff10241 Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
jeff10241 Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- VBA : Erreur 13 aléatoire sur variable
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
5 réponses
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 :
Il te faut donc tester au préalable ta variable testEEQ :
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
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.
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.
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,
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,
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)...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.