Moyenne d'une colonne d'une listbox

Résolu
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010 - 1 avril 2010 à 10:35
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010 - 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

17 réponses

PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
1 avril 2010 à 15:49
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?
3
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
1 avril 2010 à 16:06
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
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 avril 2010 à 16:14
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
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 avril 2010 à 10:54
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 11:39
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
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 avril 2010 à 11:47
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
0
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 11:57
Bjr,

L'erreur est sur la 2ème ligne

Xb=CalculerMoyenne(userform_accueil.listBox_Points_Homologues)


Merci
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 avril 2010 à 12:01
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
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
1 avril 2010 à 13:14
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]
0
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 13:17
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
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 avril 2010 à 14:08
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
0
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 14:37
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
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
1 avril 2010 à 14:46
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
0
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 15:19
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
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
1 avril 2010 à 15:55
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

++
0
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 16:13
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
0
mdeg Messages postés 28 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 29 avril 2010
1 avril 2010 à 16:51
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!
0
Rejoignez-nous