Macro VBA pour éliminer des valeurs sortant de l'écart type - Erreur 1004

Bonjour,
Je suis chimiste analyticien et dans le cadre de mes recherches j'essaye de me programmer une petite macro sur VBA afin de faciliter le traitement de mes données.
J'essaye ici simplement d'exclure les valeurs aberrantes lors de mes analyses.
Aujourd'hui j'ouvre mon fichier excel avec mes données et en traçant celle-ci j'identifie les valeurs aberrantes et je les retire "à la main". Ensuite je calcule ma moyenne et mon écart type et encore une fois je retire les valeurs qui sortent de + ou - 2x mon écart type "à la main".

Comme vous pouvez le supposer cela est très chronophage surtout quand dans une séquence d'analyse isotopique j'ai parfois 200 à 300 analyses elles-même composés de 30 mesures de plusieurs isotopes différents et ainsi pour vérifier la précision interne de mon appareil il me faut ouvrir les 200/300 fichiers de 30 mesures et faire cette exclusion à la main sur chaque isotope....

J'ai donc créer une macro mais elle ne fonctionne pas mon problème est que lorsque je fait F5, j'ai une erreur d’exécution 1004 et je n'arrive pas à résoudre ce problème en fouillant sur le forum ni même a très bien comprendre ce qu'est cette fameuse erreur.
Je tiens à préciser que je ne veux pas que mon code soit optimal et que je cherche a avoir quelque chose de simple que je puisse comprendre car mes connaissance en VBA ce limite a 2h de Td en ecole d'ingé il y a plus de 5 ans.

Voici mon code

<pre>Sub precision_interneUranium()
Dim i As Integer
Dim moy As Double
Dim SD As Double
Dim moy2 As Double
Dim SD2 As Double
With Sheets("005-IRMM100")
'on nomme les cellules de debut ou l'on mettra les différents résultat
    Range(.Cells(2, 58)).Name = "moyenne"
    Range(.Cells(2, 59)).Name = "StandDev(x2)"
    Range(.Cells(2, 60)).Name = "%SD"
'boucle for qui permettra des faire les isotopes 234U à 238U qui sont des colonnes 3 à 6, on parcours donc les colonnes 3 à 6
    For j = 3 To 6

        moy = Application.Average(.Range(.Cells(j, 24), .Cells(j, 53)).Value)
        SD = Application.StDev(.Range(.Cells(j, 24), .Cells(j, 53)).Value)
        moytest = Application.Average(.Range(.Cells(j, 24), .Cells(j, 53)).Value)
        SDtest = Application.StDev(.Range(.Cells(j, 24), .Cells(j, 53)).Value)

        'paramètre de test arbitraire on fera des test pour voir ce qui est le plus adequat 50%, 75% 80% etc
        Do While SD / SDtest >= 0.75

        'on parcours les lignes 24 à 53 ou les 30 mesures sont avec la boucle for
            For i = 24 To 53
                If Abs(.Cells(i, j) - moy) >= 2 * SD Then .Cells(i, j) = Empty

            Next

            'on stocke l'ancienne moyenne et l'ancien SD dans les variables XXXtest pour faire ensuite le test du while
            moytest = moy
            SDtest = SD
            moy = Application.Average(.Range(.Cells(j, 24), .Cells(j, 53)).Value)
            SD = Application.StDev(.Range(.Cells(j, 24), .Cells(j, 53)).Value)

        Loop

        'on calcule les moy et SD finaux et on les affiche dans tel ou tel colonnes/lignes correspondante
        moyfinal = Application.Average(.Range(.Cells(j, 24), .Cells(j, 53)).Value)
        SDfinal = Application.StDev(.Range(.Cells(j, 24), .Cells(j, 53)).Value)
        Range(.Cells(j, 58)).Value = moyfinal
        Range(.Cells(j, 59)).Value = SDfinal * 2
        Range(.Cells(j, 60)).Value = (moyfinal / (2 * SDfinal)) * 100

    Next
'recalcule des moy et ecart type sans les valeurs abérrantes
End With

End Sub</pre><figure><pj data-file="86973_60cb560a0783c225090879" class="pj icon-attach">005-irmm100.xlsm</pj></figure>En vous remerciant par avance

Bonjour,

Premières erreurs trouvées, je ne suis pas allé plus loin.

    Range(.Cells(2, 58)).Name = "moyenne"
    Range(.Cells(2, 59)).Name = "StandDev(x2)"
    Range(.Cells(2, 60)).Name = "%SD"

à remplacer par

        .Cells(2, 58) = "moyenne"
        .Cells(2, 59) = "StandDev(x2)"
        .Cells(2, 60) = "%SD"

Cdlt

Bonjour,

Effectivement le range n'avait rien à faire la. Cependant j'ai toujours une erreur 1004 sur la suite.

Merci et bonne journée

Sur quelle ligne s'arrête le code lorsqu'il détecte l'erreur?

Bonjour

Le code s'arrête à la ligne ou je definis la cellule "%SD"

.Cells(2, 60)).Name = "%SD"

j'avais aussi oublié de définir j chose faites maintenant. Voulez vous que je vous joigne mon fichier avec un exemple du tableur que je récupère de mes analyses et mon script ?

Le code s'arrête à la ligne ou je definis la cellule "%SD"?

.Cells(2, 60)).Name = "%SD"

Vous n'avez pas suivi exactement l'exemple que j'avais mis ").Name" est en trop.

si ça ne marche toujours pas déposez le fichier

Bonjour

Effectivement j'avais mal corrigé alors que votre instruction était claire je vous prie de m'excuser.

Cependant j'ai toujours une erreur 1004.

Je vous joins donc le fichier avec mon script dedans.

En vous remerciant de nouveau

8005-irmm100.xlsm (15.83 Ko)

Ok , je viens d'ouvrir votre fichier, j'ai vu déjà une erreur:. Vous avez intervertir les lignes et les colonnes.

Dans Cells(j, 24), j c'est la ligne et le nombre 24 indique la colonne 24, dans votre tableau c'est l'inverse.

Remplacez

           moy = Application.Average(.Range(.Cells(j, 24), .Cells(j, 53)).Value)

par:

            moy = Application.Average(.Range(.Cells(24, j), .Cells(53, j)).Value)

Idem pour les lignes suivantes.

Merci j'ai corrigé cette erreur mais j'ai toujours cette même erreur 1004, le programme s'arrête il me semble au niveau de la boucle while.

Aurais-je mal rédigé ma boucle ? j'ai reregardé en ligne la syntaxe de ce type de boucle et je ne comprends pas pourquoi j'ai une erreur 1004. mon test qui est SD/SDtest >=0.8 n'est il pas possible ? J'ai essayé d'affecter à une variable 0.8 et de la mettre dans le test mais ce n'est pas ça.

Encore merci mes connaissances en VBA sont vraiment restreinte !

Apparemment votre problème vient bien de la boucle Do While.

Avec le peu que j'ai fait tourner, l'expression "Do While SD / SDtest >= 0.75" est toujours supérieure à 0,75, elle est même toujours égale à 1, donc on est dans une boucle infinie qui finit par générer une erreur.

il faut que vous rajoutiez une condition supplémentaire pour sortir de cette boucle.

Bonjour,

Merci pour votre aide j'ai finalement pas mal avancé et il y avait plusieurs petites fautes de syntaxe.
Ma Macro tourne maintenant mais j'aimerais pouvoir la faire tourner sur TOUS les classeur ouverts au moment ou je fait F5.

En effet dans mon code j'appel avec with sheets ("XXXX") le classeur à traiter cependant j'aimerais que (enregistré dans mon PERSONNAL) lorsque j'appuie sur F5 ma macro s'applique sur TOUS les classeurs ouvert.

Pourriez vous m'aidez ?

Je vous joint mon script

Sub precision_interne234U()

Dim j As Integer
Dim i As Integer
Dim moy As Double
Dim SD As Double
Dim moy2 As Double
Dim SD2 As Double
Dim test As Double

With Sheets("017-IRMM100")

'on nomme les cellules de debut ou l'on mettra les différents résultat

    .Cells(57, 2) = "moyenne"
    .Cells(58, 2) = "StandDev(x2)"
    .Cells(59, 2) = "SD%"

'boucle for qui permettra de parcourir les colonne et donc de faire les isotopes 234U à 238U qui sont des colonnes 3 à 6, on parcours donc les colonnes 3 à 6

    For j = 3 To 9

        moy = Application.Average(.Range(.Cells(24, j), .Cells(53, j)).Value)
        SD = Application.StDev(.Range(.Cells(24, j), .Cells(53, j)).Value)
        moytest = Application.Average(.Range(.Cells(24, j), .Cells(53, j)).Value)
        SDtest = Application.StDev(.Range(.Cells(24, j), .Cells(53, j)).Value) + 1

        'paramètre de test arbitraire on fera des test pour voir ce qui est le plus adequat 50%, 75% 80% etc
        Do Until SDtest - SD = 0

        'on parcours les lignes 24 à 53 où les 30 mesures d'un isotope sont avec la boucle for
            For i = 24 To 53

                If .Cells(i, j) >= 2 * SD + moy Then .Cells(i, j) = Empty
                If .Cells(i, j) <= 2 * SD - moy Then .Cells(i, j) = Empty

            Next

            'on stocke l'ancienne moyenne et l'ancien SD dans les variables XXXtest pour faire ensuite le test du while
            moytest = moy
            SDtest = SD
            moy = Application.Average(.Range(.Cells(24, j), .Cells(53, j)).Value)
            SD = Application.StDev(.Range(.Cells(24, j), .Cells(53, j)).Value)

        Loop

        'on calcule les moy et SD finaux et on les affiche dans tel ou tel colonnes/lignes correspondante
        moyfinal = Application.Average(.Range(.Cells(24, j), .Cells(53, j)).Value)
        SDfinal = Application.StDev(.Range(.Cells(24, j), .Cells(53, j)).Value) * 2
        .Cells(57, j).Value = moyfinal
        .Cells(58, j).Value = SDfinal
        .Cells(59, j).Value = (SDfinal / moyfinal) * 100

    Next

End With
End Sub
Rechercher des sujets similaires à "macro vba eliminer valeurs sortant ecart type erreur 1004"