Moyenne d'une colonne d'une listbox [Résolu]

mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 10:35 - Dernière réponse : mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention
- 1 avril 2010 à 16:51
Bonjour,

Je souhaiterais calculer la moyenne de chaque colonne d'une listbox. Ca fait un moment que je cherche de l'aide sur les forums, mais je n'ai rien trouvé qui puisse m'aider.
J'ai retenu qu'il faut convertir les chaines de caractéres en nombre pour pouvoir faire un calcul, mais quelle méthode dois-je suivre pour calculer la moyenne de chaque colonne (le nombre de lignes n'est pas fixe).
Est ce que quelqu'un pourrait me donner un petit coup de pouce?

Merci
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 avril 2010 à 15:49
3
Merci
ah bah voilà, c'est bien plus clair

(pense qu'on peut très bien aider sans connaître le langage. c'est le cas pour le multicolonne de la list VBA qui n'existe ni en VB6 ni VB.NET par exemple)



bref, donc ceci devrai fonctionner (prise en charge simple et multi colonnes)

Public Function ListAverage(ByRef oLst As MSForms.ListBox) As Double

    With oLst
        If .ListCount Then
            Dim i As Long, j As Long
            Dim dRet As Double
            
            dRet = 0#
            If .ColumnCount < 2 Then
                For i = 0 To .ListCount - 1
                    dRet = dRet + CDbl(.List(i))
                Next i
                ListAverage = dRet / .ListCount
        
            Else
                Dim k As Long
                k = 0
                For i = 0 To .ListCount - 1
                    For j = 0 To .ColumnCount - 1
                        If IsNull(.List(i, j)) Then
                            Exit For
                        
                        Else
                            dRet = dRet + CDbl(.List(i, j))
                            k = k + 1
                        
                        End If
                        
                    Next j
                Next i
                ListAverage = dRet / k
            
            End If
            
        Else
            ListAverage = 0#
            
        End If
        
    End With
End Function



est-ce ce genre de routine?

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 avril 2010 à 16:06
3
Merci
et colonne par colonne


Public Function ColumnAverage(ByRef oLst As MSForms.ListBox, ByVal pvargColumn As Integer) As Double
'   la colonne indiquée doit exister ! commence à 0

    Dim dRet As Double
    dRet = 0#
    
    With oLst
        If .ListCount Then
            Dim i As Long, j As Long
            j = 0
            
            For i = 0 To .ListCount - 1
                If IsNull(.List(i, pvargColumn)) Then
                    If j 0 Then j 1 'éviter la division/0
                    Exit For
                        
                Else
                    dRet = dRet + CDbl(.List(i, pvargColumn))
                    j = j + 1
                        
                End If
                        
            Next i
            dRet = dRet / j
            
        End If
        
    End With
    ColumnAverage = dRet
End Function

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de PCPT
Meilleure réponse
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 1 avril 2010 à 16:14
3
Merci
Salut,

Il faut faire un replace du point :
Public Function ColumnAverage(ByRef oLst As MSForms.ListBox, ByVal pvargColumn As Integer) As Double
'   la colonne indiquée doit exister ! commence à 0

    Dim dRet As Double
    dRet = 0#
    
    With oLst
        If .ListCount Then
            Dim i As Long, j As Long
            j = 0
            
            For i = 0 To .ListCount - 1
                If IsNull(.List(i, pvargColumn)) Then
                    If j 0 Then j 1 'éviter la division/0
                    Exit For
                        
                Else
                    dRet = dRet + CDbl(Replace(.List(i, pvargColumn), ".", ","))
                    j = j + 1
                        
                End If
                        
            Next i
            dRet = dRet / j
            
        End If
        
    End With
    ColumnAverage = dRet
End Function

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 1 avril 2010 à 10:54
0
Merci
Salut,

C'est plus un problème d'algorithmique :
Il te faut calculer la somme de chaque ligne, puis diviser par le nombre de ligne :
Public Function calculerMoyenne(byref lstListBox As ListBox) As Double

Dim i As Long
Dim lTaille As Long
Dim lTotal As Long

    Let lTaille = lstListBox.ListCount - 1
    For i = 0 to lTaille

        Let lTotal = lTotal + lstListBox.List(i)

    Next i
    Let calculerMoyenne = lTotal / (lTaille + 1)

End Function

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 11:39
0
Merci
Merci pour cette réponse,
j'ai tapé cette fonction dans le module. Cette fonction calculer uniquement la moyenne de la première colonne non?
Ensuite je souhaite faire afficher ce résultat dans une textbox, donc lorsque je clique sur le bouton calculer, la valuer doit s'afficher.

Le code est
dim Xb as double
Xb=CalculerMoyenne(userform_accueil.listBox_Points_Homologues)
TxtB_Xb.Text=Round(Xb,3)


Et là j'ai une erreur Incompatibilité de type.

Je débute en VBA, donc j'ai cherché, en essayant différente chose, mais je n'arrive pas à passer cette erreur.

Merci
Commenter la réponse de mdeg
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 1 avril 2010 à 11:47
0
Merci
Salut,

En effet, ma fonction ne calcul que pour la première colonne, à toi d'adapter à tes besoins.

Tu as l'erreur sur quelle ligne ?

Essaye comme cà (bien que ca ne devrait pas poser de problème) :
dim Xb as double
Xb=CalculerMoyenne(userform_accueil.listBox_Points_Homologues)
TxtB_Xb.Text=CStr(Round(Xb,3))

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 11:57
0
Merci
Bjr,

L'erreur est sur la 2ème ligne

Xb=CalculerMoyenne(userform_accueil.listBox_Points_Homologues)


Merci
Commenter la réponse de mdeg
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 1 avril 2010 à 12:01
0
Merci
Salut,

Ok, est-ce que ton listBox_Points_Homologues est bien un ListBox ?

Sinon, essaye en modifiant un peu mon code :
Public Function calculerMoyenne(byref lstListBox As ListBox) As Double

Dim i As Long
Dim lTaille As Long
Dim dTotal As Double

    Let lTaille = lstListBox.ListCount - 1
    For i = 0 to lTaille

        If (isNumeric(lstListBox.List(i)) Then

            Let dTotal = dTotal + CDbl(lstListBox.List(i))

        End If

    Next i
    Let calculerMoyenne = dTotal / (lTaille + 1)

End Function


Est-ce que ton listbox ne contient que des nombres ?
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 avril 2010 à 13:14
0
Merci
salut,

userform_accueil.listBox_Points_Homologues

ce n'est donc pas une LISTBOX
une MSLISTBOX je crois?...

dommage DKS, pour une fois que le thème est correct

++
[hr]
Commenter la réponse de PCPT
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 13:17
0
Merci
Bjr,

Ca ne fonctionne pas plus. Dans le listbox, il n'y a que des nombres (entiers ou décimaux).

Par contre si je mets le code directement dans le Private Sub, j'obtiens le bon résultat dans ma textbox.
Je ne comprends pas pourquoi.

Quand tu écris une fonction le paramètre entre parenthéses est bien la variable que tu utilises dans le code?

Une autre question, dans ce code l'information sur les colonnes se trouvent où, il prends par défaut la première colonne?

Merci
Commenter la réponse de mdeg
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 1 avril 2010 à 14:08
0
Merci
Salut,

Essaye comme ceci au pire :

Public Function calculerMoyenne(ByRef lstListBox As Object) As Double

Dim i As Long
Dim lTaille As Long
Dim dTotal As Double

    Let lTaille = lstListBox.ListCount - 1
    For i = 0 To lTaille

        If (IsNumeric(lstListBox.List(i))) Then

            Let dTotal = dTotal + CDbl(lstListBox.List(i))

        End If

    Next i
    Let calculerMoyenne = dTotal / (lTaille + 1)

End Function

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 14:37
0
Merci
Bjr,
Très bien, ça fonctionne. Donc la listbox doit être déclarée en objet?

J'ai une question : par défaut ce calcul se fait sur la 1ère colonne?
Où faut-il donner l'information sur la colonne de la listbox à utiliser?

Merci
Commenter la réponse de mdeg
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 avril 2010 à 14:46
0
Merci
on aurait pu faire quelques tests en ayant ton code de remplissage, pour commencer
et les propriétés définies à tes colonnes

sinon :
ByRef oLst As MSForms.ListBox


ps : m'étonnerait que ce code ne soit déjà dispo tout au moins dans le forum
Commenter la réponse de PCPT
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 15:19
0
Merci
Bjr,

Le code de remplissage de la listbox est :
rivate Sub CommandButton_Ouvrir_Click()

Dim Fichier
Dim Tbld As Single

Fichier = Application.GetOpenFilename("Fichier Texte (*.txt), *.txt")
If Fichier = False Then Exit Sub
If Fichier Like "*" & ThisWorkbook.Name Then MsgBox "Ouverture non autorisée.": Exit Sub
On Error Resume Next
Open Fichier For Input As #1
On Error GoTo 0

Dim Ligne As String
Dim Valeur As Variant
Dim Separateur As String

Input #1, Ligne
Separateur = InputBox("Entrer le séparateur de données : " & Ligne, "Séparateur")
Valeur = Split(Ligne, Separateur)
ListBox_Points_Homologues.AddItem (Valeur(0))
ListBox_Points_Homologues.List(0, 1) = Valeur(1)
ListBox_Points_Homologues.List(0, 2) = Valeur(2)
ListBox_Points_Homologues.List(0, 3) = Valeur(3)
ListBox_Points_Homologues.List(0, 4) = Valeur(4)

While Not (EOF(1))
Input #1, Ligne
Valeur = Split(Ligne, Separateur)
ListBox_Points_Homologues.AddItem (Valeur(0))
ListBox_Points_Homologues.List(ListBox_Points_Homologues.ListCount - 1, 1) = Valeur(1)
ListBox_Points_Homologues.List(ListBox_Points_Homologues.ListCount - 1, 2) = Valeur(2)
ListBox_Points_Homologues.List(ListBox_Points_Homologues.ListCount - 1, 3) = Valeur(3)
ListBox_Points_Homologues.List(ListBox_Points_Homologues.ListCount - 1, 4) = Valeur(4)
Wend
Close #1

End Sub


Ensuite la fontion pour calculer la moyenne est:
Public Function CalculerMoyenne(ByRef LstB As MSForms.ListBox) As Double

Dim i As Long
Dim lTaille As Long
Dim dTotal As Double

Let lTaille = LstB.ListCount - 1
For i = 0 To lTaille
If (IsNumeric(LstB.List(i))) Then

dTotal = dTotal + CDbl(LstB.List(i))
End If
Next i
CalculerMoyenne = dTotal / (lTaille + 1)

End Function


Pour afficher la moyenne dans un textbox, le code est :
Private Sub CmdB_Calculer_Bary_Click()

Dim Xb As Double

Xb = CalculerMoyenne(UserForm_Accueil.ListBox_Points_Homologues)



Le fichier texte que j'importe dans la listebox au début est de la forme:

1;1000.000;5000.000;101.000;501.000
2;1002.000;5002.000;102.000;502.000
3;1003.000;5003.000;103.000;503.000
4;1004.000;5004.000;104.000;504.000

Donc dans la liste box, j'ai cinq colonnes, et je souhaiterais calculer la moyenne de chacune des 4 dernière colonnes.

Merci
Commenter la réponse de mdeg
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 1 avril 2010 à 15:55
0
Merci
reste à voir quand même pour le ISNULL :

*soit on considère ZERO donc k=k+1
*soit en remplissage horizontal c'est le dernier item vide donc k non divisible (entier) par le nombre de colonnes (c'est ce que j'ai considéré)
*soit il n'est juste pas à prendre en compte, donc supprimer exit for (ou plutôt mettre le code FALSE à la place en NOT ISNULL)
*soit sortie définitive, donc avoir une autre variable booléenne pour sortir aussi de la première boucle

le 2e cas me paraissait le plus logique, vu ton fichier, donc rien à faire d'autre

++
Commenter la réponse de PCPT
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 16:13
0
Merci
Bjr,

Oui ça fonctionne, mais j'avais un erreur au départ, et en fait elle provient du . (point) séparateur de décimales dans mon fichier initial.
Si j'utilise des nombres entiers ça fonctionne, sinon ça me met une erreur.

Au départ j'avais mis une virgule comme séprateur de décimales, mais là ça me posait probléme pour importer dans la listbox.

Est ce que tu vois une solution?

Merci
Commenter la réponse de mdeg
mdeg 28 Messages postés mercredi 31 mars 2010Date d'inscription 29 avril 2010 Dernière intervention - 1 avril 2010 à 16:51
0
Merci
Trés bien, ça fonctionne maintenant! Merci beaucoup à vous!
Je vais pouvoir continuer mon code qui est loin d'être terminé...

Merci encore et bonne soirée!
Commenter la réponse de mdeg

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.