Standard Deviation VBA - ne fonctionne pas

Hello,

Je me prends la tete sur cette macro de calcul d ecart type ...

Je veux calculer l'ecart type pour chacune des equipes ( Cost Center ) en feuille 2

Je ne comprends pas pourquoi cela ne fonctionne pas ...

Merci d avance de votre aide.

A+

40test1.xlsm (25.48 Ko)

Bonjour,

la variable wts fait référence à quoi ?

lLastRow = wts.Cells(Rows.Count, 1).End(xlUp).Row

c'est bon, j'ai trouvé, c'est la Feuil2

[quote="sabV"]Bonjour,

la variable wts fait référence à quoi ?

lLastRow = wts.Cells(Rows.Count, 1).End(xlUp).Row

c'est bon, j'ai trouvé, c'est la Feuil2

par contre

For lBbgColCount = 3 To lBbgCol

lBbgCol = 2

ça ne boucle pas du tous

Bonjour,

lBbgCol = wts.Cells(2, Columns.Count).End(xlToLeft).Column

1

Cordialement.

Hello,

J'ai une erreur ici : lBbgCol = wts.Cells(2, Columns.Count).End(xlToLeft).Column ?

louyotj a écrit :

Hello,

J'ai une erreur ici : lBbgCol = wts.Cells(2, Columns.Count).End(xlToLeft).Column ?

Salut,

une idée , peu-être : "lire le message d'erreur" et le rapporter ici ..?

Bonjour, Bonjour à tous,

SabV qui a creusé ton code te fait remarquer qu'une boucle de 3 à 2 (pas: +1) n'a aucune chance de s'éxécuter.

Moi (qui n'ai pas du tout creusé ! ) me suis contenté d'observer que ta boucle devait manifestement être de 3 à 4, et que pour avoir 4, il fallait chercher la dernière colonne utilisée sur la ligne 1 et non 2 !

Peut-être s'agit-il de tout autre chose, mais cela reste un point à vérifier et curieux que tu n'aies pas vu ce dont il s'agissait... !

Cordialement.

Ok, je viens de gerer ce bug.

Maintenant j'ai une erreur de calcul sur la formule de calcul de l'ecart type :

SumSq = SumSq + (Sheet5.Cells(lCount, lDataCol).Value - dAvg) ^ 2

Décidément, je n'aime pas cette façon de nommer des variables, ça me perturbe !

J'observe (de loin!!) : ....Cells(lCount, lDataCol)...

lCount est curieusement utilisée comme variable de boucle quelques lignes plus haut. Sa valeur à la sortie de ladite boucle est donc de lLastDataRow+1. Je doute un peu que ce soit la valeur qui convienne .

Alors ! soit ce n'est pas la bonne variable, soit ce fragment de code n'est pas au bon endroit et devrait par exemple être dans la boucle utilisant lCount au lieu d'être placé à la suite (je précise que je n'ai pas regardé le détail de ce que fait cette boucle ! )

En tout état de cause il me semble qu'il faut regarde de plus près autour de ça... [Il me semble que tu te perds un peu aussi au milieu de tes variables ! )

Cordialement.

    Const sCOST_CENTRE      As String = "Cost Center"
    lLastRow = wts.Cells(Rows.Count, 1).End(xlUp).Row
    lLastDataRow = Sheet5.Cells(Rows.Count, 1).End(xlUp).Row
    lBbgCol = wts.Cells(2, Columns.Count).End(xlToLeft).Column

    For lTeamCount = 3 To lLastRow
        sTeam = wts.Cells(lTeamCount, 2).Value
        lDataCol = 16
            For lBbgColCount = 3 To lBbgCol

                lAvgCount = 0
                dAvg = 0
                dTotal = 0
                dStd = 0
                For lCount = 3 To lLastDataRow
                    If sTeam = Sheet5.Cells(lCount, 10).Value Then
                        If Sheet5.Cells(lCount, lDataCol).Value <> "#N/A" And Sheet5.Cells(lCount, lDataCol).Value > 0 Then
                            dTotal = dTotal + Sheet5.Cells(lCount, lDataCol).Value
                            lAvgCount = lAvgCount + 1
                          [color=#FFFF00]  SumSq = (Sheet5.Cells(lCount, lDataCol).Value - dAvg) ^ 2
                            dStd = Round(Sqr(SumSq / (lAvgCount - 1)), 2)[/color]
                       End If
                    End If
                Next
                If lAvgCount > 0 Then
                  dAvg = Round(dTotal / lAvgCount, 2)
                 ' SumSq = (Sheet5.Cells(lCount, lDataCol).Value - dAvg) ^ 2
                  'dStd = Round(Sqr(SumSq / (lAvgCount - 1)), 2)
                End If
                wts.Cells(lTeamCount, lBbgColCount).Value = dStd
                lDataCol = lDataCol + 1
        Next

Toujours pas le bon calcul

Mais je peux pas placer SumSq avec dAvg ...

Le calcul de l'ecart type est (X1 - Average)^2 + ... + (Xn - Average)^2 ( ce que je veux faire dans SumSq

Puis ensuite : Racine Carree de SumSq / nombre de valeurs dans la population - 1

Tenez moi au courant, si vous avez besoin de plus de detail.

Thanks

bonjour à tous

salut MFerrand

salut louyotj

sans VBA, avec un TCD :

jmd a écrit :

bonjour à tous

salut MFerrand

salut louyotj

sans VBA, avec un TCD :

Malheuresement, je ne peux pas accepter une reponse sans VBA...

Car c'est de la donne que j exploite par la suite ...

Merci quand meme pour ta proposition

re

je ne comprends pas

tout affichage d'un TCD peut servir de base à des calculs

jmd a écrit :

re

je ne comprends pas

tout affichage d'un TCD peut servir de base à des calculs

Pour plusieurs raisons, mes tableaux sont de tailles variables et comme tu peux imaginer je n ai pas que 2 colonnes a etudier mais une cinquantaine ...

Et l'ecart type sera la base de mon analyse, je devrais par la suite recuperer cette variable pour calculer un ratio ....

J'ai dû me faire un peu violence pour entrer dans le vif du sujet... Le nombre d'erreurs à rectifier était en fait assez conséquent...

Sub Button1_Click()
    Dim lLastRow&, lTeamCount&, lBbgCol%, lBbgColCount%, sTeam$
    Dim lLastDataRow&, lCount&, lDataCol%
    Dim Ti(), lAvgCount&, dStd#
    Application.ScreenUpdating = False
    lLastRow = wts.Cells(Rows.Count, 1).End(xlUp).Row
    lLastDataRow = Sheet5.Cells(Rows.Count, 1).End(xlUp).Row
    lBbgCol = wts.Cells(1, Columns.Count).End(xlToLeft).Column
    For lTeamCount = 2 To lLastRow
        sTeam = wts.Cells(lTeamCount, 2).Value
        lDataCol = 16
        For lBbgColCount = 3 To lBbgCol
            lAvgCount = 0
            For lCount = 2 To lLastDataRow
                With Sheet5
                    If .Cells(lCount, 13).Value = sTeam Then
                        If .Cells(lCount, lDataCol).Text <> "#N/A" _
                         And Sheet5.Cells(lCount, lDataCol).Value > 0 Then
                            ReDim Preserve Ti(lAvgCount)
                            Ti(lAvgCount) = .Cells(lCount, lDataCol).Value
                            lAvgCount = lAvgCount + 1
                        End If
                    End If
                End With
            Next lCount
            If lAvgCount > 0 Then
                dStd = WorksheetFunction.StDev(Ti)
                wts.Cells(lTeamCount, lBbgColCount).Value = dStd
            End If
            lDataCol = lDataCol + 1
        Next lBbgColCount
    Next lTeamCount
    MsgBox "Done"
End Sub

Cordialement.

louyotj a écrit :
jmd a écrit :

re

je ne comprends pas

tout affichage d'un TCD peut servir de base à des calculs

Pour plusieurs raisons, mes tableaux sont de tailles variables et comme tu peux imaginer je n ai pas que 2 colonnes a etudier mais une cinquantaine ...

Et l'ecart type sera la base de mon analyse, je devrais par la suite recuperer cette variable pour calculer un ratio ....

re à tous

tu es en plein dans l'analyse de la variance ?

les tableaux sont toujours de tailles variables. Les TCD s'adaptent.

50 colonnes ou 200, quelle est la différence ?

en fait tu as posé une question qui est une étape dans ton problème plus vaste. Pose le problème global. Il se peut qu'on puisse faire (un peu) autrement.

Merci pour vos aides,

Je viens de recuperer le code qui marche parfaitement et je viens d'en profiter pour calculer le coefficient de variation.

8)

Rechercher des sujets similaires à "standard deviation vba fonctionne pas"