Frequence

Bonjour à tous,

voila j'ai un petit projet de VBA ( je n'ai pas le droit d'utiliser les fonctions d'excel) à rendre mais il s'avère que je bug un peu, j'aurais donc besoin de votre aide.

voici la consigne :

Histogramme de frequence :

La procédure dois d'adapter à toute taille de l'echantillon et c'est l'utilisateur qui choisit le nombre d'intervalle de découpage. Je veux donc juste en premier temps obtenir la fréquence.

Je me doute qu'il faut utiliser une boucle For avec la fonction step auquel je donne une variable rentré par inputbox comme ceci :

 p = InputBox("donnez le pas")
 For i = 2 To ? step p

1er probleme, je veux aller jusqu'à un nombre indeterminée ( pour s'adapter à tout type de table) , quel ? faut-il mettre ?

Normalement une boucle While est utile lorsque l'on ne connait pas le nombre d'itération mais step n'est pas compatible avec While...

Ensuite j'ai voulu faire un essaie de ma boucle pour 20 lignes afin d'obtenir la fréquence :

 p = InputBox("donnez le pas")
 For i = 2 To 20 Step p
 iRowsCount = Range("B:B").Cells.Count
 freq = iRowsCount
 MsgBox (freq)

 Next i

Mais j'ai une erreur m'indiquant un dépassement de capacité ... Donc j'ai du mal faire, je précise que je suis toute débutante ..

En cour, l'on a étudier les tableaux dynamiques et fixes, je pense donc c'est une piste mais je n'arrive pas du tout à le modéliser.

Merci d'avance, je suis preneuse de toute piste

Salut Julie,

qu'appelles-tu exactement ta fréquence ?

Dans cette boucle, tu calcules le nombre de cellules (=lignes) de la colonne B...

A+

Bonjour et bienvenu(e),

Peux-tu préciser ta demande et joindre un petit fichier?

Cdlt.

Bonsoir,

On ne voit pas où veut en venir ta macro... mais c'est secondaire pour l'erreur, on ne voit pas non plus tes déclarations de variables mais il y a une chance que iRowsCount soit de type Integer, ce qui rend sans appel le dépassement de capacité au 1er tour de boucle !

Alors voici le fichier de départ

Le but final étant de vérifier la distribution normale des données.

Donc quand je parle de frequence, je pense qu'il veut le nombre de date où le cour de l'action se trouve entre tel et tel limite (pas donnez par mon inputbox). Je ne suis pas sur, c'est ce que j'ai compris d'après l'énoncé que j'ai écrit dans le premier post.

Je suis désolé pour la maigre boucle, mais je suis totalement pommé, je ne sais pas comment faire ( alors que sur excel, en utilisant freq ça prend 2 minutes ! )

Pour la capacité, faut-il que le mette en as double plutot que as integer c'est ça ??

Bonsoir Julie,

ça m'étonnerait que ce soit aussi simple!

Ici, deux InputBox te permettent d'entrer les limites inférieures et supérieures, la boucle calculant le nombre de jours (lignes) dont le cours se situe entre ses limites (limites comprises).

Le résultat s'affiche dans une MsgBox.

[code][/Private Sub CommandButton1_Click()

'

Dim dFlag1 As Double

Dim dFlag2 As Double

'

dFlag1 = InputBox("Cours inférieur")

dFlag2 = InputBox("Cours supérieur")

'

iFlag = Range("A" & Rows.Count).End(xlUp).Row

'

iFlag1 = 0

For x = 2 To iFlag

If Cells(x, 2) >= dFlag1 And Cells(x, 2) <= dFlag2 Then iFlag1 = iFlag1 + 1

Next

'

MsgBox "Nombre de jours : " & iFlag1 & " sur " & iFlag-1 & " jours."

'

End Sub

code]

Pas de quoi paniquer! :wink:

A+

Waw merci je n'arrivais absolument pas à faire ressortir le nombre de jours entre deux cours, c'est déjà une grande avancé même si je comprends pas :

iFlag = Range("A" & Rows.Count).End(xlUp).Row

Quelle est la régle générale d'écriture, les arguments ?

Maintenant je ne pense pas que ça répond entièrement à la question :

"la procédure doit s’adapter à toute taille del’échantillon" - d'accord car la boucle continue jusque la cellule soit vide

"et c’est l’utilisateur qui choisit le nombre de découpage (nombre de pas) - là je pense que ça ne colle pas car (si j'ai bien compris), il faut que par exemple pour un pas de 3, que le programme donne l'effectif/le nombre de jour entre 0 et 3, 3 et 6, 6et 9 etc...

Est-ce que mon intuition est la bonne ?

Et comment l'introduire dans la boucle ? Je viens d'essayer avec "step" mais le fait qu'on l'on mette manuellement Dflag1 ni Dflag2 pose problème... je pense qu'il ne faut pas utiliser... mais un inputbox pour le pas non ?

Re,

Il y a plusieurs pbs de compréhension...

L'erreur vient bien d'affecter à un Integer une valeur constante (le nb de lignes de la feuille : 1048576 sauf erreur de qq unités).

Tu voulais certainement écrire autre chose...

Mais il me semble qu'en initiant une boucle de 2 à 20 avec pas variable, tu voulais aussi faire autre chose que ce que tu as écrit.

i variera de 2 à 20 pas plus, il prendra toutes les valeurs intermédiaires par pas de 1 si tu ne mets pas de pas. si tu mets un pas de 2, il prendra les valeurs 2, 4, 6, 8,... 18, 20. Si tu mets un pas de 3, les valeurs : 2, 5, 8, 11, 14, 17, 20. Etc. Et si tu mets un pas de 18, il prendra les valeurs 2 et 20. Et pour tout pas supérieur, il ne prendra que la valeur 2 !

Enfin, ta référence à la fonction FREQUENCE d'Excel ne me semble pas adaptée à la question. Cette fonction donne une fréquence absolue dans les intervalles définis, soit le nombre de valeurs brut par classe ou intervalle. Or, d'autant plus qu'on te précise que tu dois t'adapter à toute taille d'échantillon, il s'agit ici de fréquence relative (qu'on appelle d'ailleurs simplement fréquence en stats). Pas de difficulté, il s'agit simplement de diviser le nombre de valeurs par classe par le nombre total de valeurs.

Mais il y a aussi un autre élément si l'intention est de comparer, c'est de définir des classes permettant des comparaisons, c'est à dire définies par rapport à des éléments ayant la même signification pour tes différents échantillons.

Exemple : 2 classes: <=moyenne / >moyenne

3 classes: <=(moyenne-1écart-type) / >(moyenne-1écart-type)et<=moyenne+1écart-type / >moyenne+1écart-type

Tu peux faire 4 classes avec comme bornes la moyenne et + ou - 2 écart-type

Le nombre de classes doit rester réduit. Pour ma part je ne dépasserai pas 3 classes, ce qui affinera les résultats fournis par le tableau des divers indicateurs stats.

Une fois tes classes choisies, la procédure est simple à définir : une variable par classe pour recueillir le nombre de valeurs, une boucle sur ton échantillon (+1 dans la variable-classe concernée selon valeur). Tu divises les valeurs obtenues par le nombre d'éléments de l'échantillon pour avoir la série destinée à construire l'histogramme.

La même chose pour chaque échantillon.

Cordialement.

Re Curulis... Je ne te suis pas dans la démarche. As-tu regardé le fichier ? Et on ne lui demande pas de faire des simulations.

On a un tableau de stats descriptives assez classique. J'ai tout de même tiqué sur skewness [on n'arrête pas de s'angliciser, asymétrie dit pourtant bien ce que ça veut dire !]

Bref à part ça, si nous avons souvent des demandeurs venant demander du VBA mais à qui, dans une situation similaire, on ne l'a pas demandé, ici Julie nous dit qu'elle ne doit justement pas utiliser de formule. Ce qui paraît justifié eût égard au fait qu'il n'y a pas de fonction intégrée fournissant ce qui est demandé.

Et là l'utilisation de VBA simplifie effectivement le calcul :

  • une première boucle sur les 4 échantillons
  • calcul des valeurs bornes de classes (à partir du tableau de stats si on me suit)
  • une boucle sur l'échantillon
  • affectation des valeurs recueillies et calculées dans la zone qui servira aux séries graphiques

Bonsoir MFerrand,

comme je le faisais remarquer, ça m'aurait étonné que ce soit aussi facile!

Les maths pures, ce n'est pas du tout mon truc!

Je préfère de loin les dépatouillages logiques de situations chaotiques!

Je vous suis de derrière pour connaître le mot de la fin!

A+

Julie devrait avoir des éléments complémentaires (éventuellement oraux) lui permettant de mieux cerner ce qu'on lui demande...

Si mon hypothèse se révèle fondée, il faut d'abord servir le tableau statistique (avec des formules, il existe une fonction Excel pour chacun des indicateurs demandés) : lister les échantillons dans le même ordre que les feuilles.

Et je proposerais ensuite la macro de calcul suivante, bâtie sur 3 classes (mais qu'on peut facilement adapter à un nombre de classes inférieur ou supérieur).

Sub Calculs()
    Dim ab#, bc#, fr(2) As Integer, f%, n%, i%
    For f = 1 To 4
        With Worksheets("Statistiques")
            ab = .Cells(f + 1, 3) - .Cells(f + 1, 5)
            bc = .Cells(f + 1, 3) - .Cells(f + 1, 5)
        End With
        With Worksheets(i)
            n = .Cells(.Rows.Count, 2).End(xlUp).Row
            For i = 2 To n
                If .Cells(i, 2) <= ab Then
                    fr(0) = fr(0) + 1
                ElseIf .Cells(i, 2) <= bc Then
                    fr(1) = fr(1) + 1
                Else
                    fr(2) = fr(2) + 1
                End If
            Next i
        End With
        With Worksheets("Calculs").Range("B2:E4")
            For i = 1 To 3
                .Cells(i, f).Value = fr(i - 1) / (n - 1)
            Next i
        End With
        Erase fr
    Next f
End Sub

f sert de variable-compteur pour la boucle feuille mais également pour définir la ligne ou récupérer les indicateurs correspondant pour calculer les valeurs bornes de classes), et pour définir la colonne d'affectation des résultats.

n délimite la boucle sur l'échantillon mais permet aussi d'avoir sa taille.

ab et bc sont les valeurs bornes (considérant 3 classes [a, b, c], ab= borne séparant a et b, bc= borne séparant b et c).

fr(2) est un tableau de 3 éléments (indices 0, 1, 2) pour recueillir les dénombrements de chaque classe. Un tableau permet d'affecter au moyen d'une boucle, à chaque indice correspondant une ligne d'affectation.

NB- J'ai une prédilection marquée pour les noms de variables courts ! Je le démontre !

Cordialement.

Rechercher des sujets similaires à "frequence"