Moyenne de colonne sous VBA

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

michel2A

XLDnaute Nouveau
Bonjour,

Je dois avouer que le problème est simple mais j'ai tout de même qq zones d'ombres.
Je souhaiterais importer via un bouton, donc en VBA, un fichier txt. Le traiter (dissocier les colonnes séparées par le caractère ";") et prendre la valeur moyenne d'une colonne de ce fichier.

J'ai donc un fichier txt qui est composé de plusieurs milliers de valeurs du genre
05/05/05 11111 ; 23,5
Donc je réusis à dissocier en 2 colonnes le 05/05/05 11111 et le 23,5.
Seulement je voudrais stocker dans une variable la moyenne de la colonne B.
Une idée ?

Merci d'avance
 
Re : Moyenne de colonne sous VBA

Bonjour Michel, bonjour le forum,

peut-être comme ça :

Code:
Public Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim M As Double 'déclare la variable M (Moyenne)

Set O = Sheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
DL = O.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 2 (=B) de l'onglet O
Set PL = O.Range("B1:B" & DL) 'définit la plage PL
M = Application.WorksheetFunction.Sum(PL) / DL 'définit la moyenne M
MsgBox M 'affiche la moyenne M
End Sub

[Édition]
ou plus simplement ;
Code:
M = Application.WorksheetFunction.Average(PL) 'définit la moyenne M

 
Dernière édition:
Re : Moyenne de colonne sous VBA

Parfait ça marche !

Mais j'aurais une question supplémentaire. J'appelle ce calcul depuis un bouton. Je voudrais remplir la cellule qui est à coté (car je vais répéter ce calcul à plusieurs endroits donc je ne peux laisser en fixe la cellule à remplir mais en variable...)
Donc comment dire en VBA : à partir de la position du bouton -> insérer le résultat M dans la cellule qui est à coté ?
 
Re : Moyenne de colonne sous VBA

Bonjour Michel, bonjour le forum,

Essaie comme ça :

Code:
Private Sub CommandButton1_Click()
Public Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim M As Double 'déclare la variable M (Moyenne)

Set O = Sheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
DL = O.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 2 (=B) de l'onglet O
Set PL = O.Range("B1:B" & DL) 'définit la plage PL
M = Application.WorksheetFunction.Sum(PL) / DL 'définit la moyenne M
CommandButton1.TopLeftCell.Offset(0, 1).Value = M 'place la moyenne (nom du bouton à adapter)
End Sub
 
Re : Moyenne de colonne sous VBA

J'ai peut etre trouvé une solution mais il reste encore un soucis. Comme puis je faire pour que dans Excel Object, la feuille qui appelle mon module, je voudrais aller chercher dans mon module une variable et j'effectue ensuite des opérations dans l'object. Une idée ?
 
Re : Moyenne de colonne sous VBA

Bonjour Michel, bonjour le forum,

As-tu remarqué que dans la ligne :

Code:
CommandButton1.TopLeftCell.Offset(0, 1).Value = M 'place la moyenne (nom du bouton à adapter)
il y avait : (nom du bouton à adapter) ?

Sinon, pour la suite, je n'ai rien compris...
 
Re : Moyenne de colonne sous VBA

Si ça peut aider voici mon code du module :
Code:
'#####################################################################################################################
'#                                   Sélection du fichier                                                            #
'#####################################################################################################################
Public Sub LireFichierTxt_Ref(ByRef intBouton As Long)
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim fd As FileDialog
Dim repertoire As String
Dim nomFichier As String
Dim Fichier As File
Dim fso As New FileSystemObject
Dim vrtSelectedItem As Variant

Set fd = Application.FileDialog(msoFileDialogFilePicker)          'Création d'un Objet FileDialog en tant que boîte de diag File Picker (sélectionneur de fichiers)
fd.AllowMultiSelect = False                                       'On ne peut choisir qu'un seul fichier
fd.Title = "Sélectionnez un fichier txt"                       'Pour renommer la boîte de dialogue par défaut

début:
    With fd
        If .Show = -1 Then                                        'La méthode Show permet d'afficher la boîte de diag de sélection de fichier
            For Each vrtSelectedItem In .SelectedItems            'Step through each string in the FileDialogSelectedItems collection.
                nomFichier = vrtSelectedItem
                
            If Right(vrtSelectedItem, 4) = ".txt" Then         'La macro doit reconnaître les fichiers en .txt
                TraiterFichier_Ref fso.GetFile(nomFichier) 'il effectue la transformation ci-dessous
            Else
                MsgBox "Vous devez sélectionner un fichier txt '.txt'"
            GoTo début
                End If
            Next vrtSelectedItem
        Else
        End If
    End With

    'Set the object variable to Nothing.
    Set fd = Nothing
       
Application.DisplayAlerts = True
 
End Sub

'#####################################################################################################################
'#           Ouvre un fichier texte, sépare chaque colonne par ses ";" et le met dans un fichier excel               #
'#####################################################################################################################

Sub TraiterFichier_Ref(ByRef Fichier As File)

Dim Wb As Workbook
Dim ws As Worksheet
Dim chemin As String
Dim nomFichier As String
Dim numFic As Integer
Dim i, iCol, iRow As Long
Dim j As Long
Dim ligneFichier As String
Dim ligneFichierSplit() As String
Dim Separateur As String
Dim nom_feuille_Ref As String
Dim MyStr As String
Dim MoyenneRef As Double 'déclare la variable MoyenneRef


Set Wb = Application.Workbooks.Add 'on ouvre un nouveau classeur
    nom_feuille_Ref = ActiveWorkbook.name
    
Set ws = Wb.Worksheets(1)                                                   'la première feuille
    numFic = FreeFile
        Separateur = ";"                                                            'Le séparateur des colonnes est un caractère "|"
            Open Fichier.Path For Input As #numFic                                      'On ouvre le fichier txt
                indexDébut = 0
                iRow = 1

Do While Not EOF(numFic)
    iCol = 1

    Line Input #numFic, ligneFichier                                        'On récupère la ligne suivante
    ligneFichierSplit = Split(ligneFichier, Separateur)                     'On sépare la ligne dans un tableau

    For i = LBound(ligneFichierSplit) To UBound(ligneFichierSplit)          'On copie le tableau
        ws.Cells(iRow, iCol) = ligneFichierSplit(i)
    
        iCol = iCol + 1
    Next

    iRow = iRow + 1
Loop
indexFin = iRow
'MsgBox nom_feuille_Ref
Close #numFic 'fermeture du fichier texte


Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 2 (=B) de l'onglet O
Set PL = O.Range("B1:B" & DL) 'définit la plage PL
MoyenneRef = Application.WorksheetFunction.Sum(PL) / DL 'définit la moyenne M
MsgBox MoyenneRef 'affiche la moyenne M

 End Sub

et le code de ma feuille :
Code:
Public Sub CommandButton1_Click()

Module_Ref.LireFichierTxt_Ref (1)

End Sub
 
Re : Moyenne de colonne sous VBA

et ce que je demandais c'est que si je pouvais "rapatrier" la valeur de la variable MoyenneRef (contenue dans le module) en entrant dans le code de la feuil (donc le :
Code:
Public Sub CommandButton1_Click()
 
Module_Ref.LireFichierTxt_Ref (1)
 
End Sub
)
j'ai essayé mais mon MsgBox affiche tj 0 (alors que je suis certains que c'est différent de 0 - une autre MsgBox dans le module me donne le bon résultat) mais me remplit bien la case juste à coté du bouton quand je colle tout le code comme ceci :
Code:
Public Sub CommandButton1_Click()
 
Module_Ref.LireFichierTxt_Ref (1)
CommandButton1.TopLeftCell.Offset(0, 1).Value = MoyenneRef

End Sub
)



Une idée ?
 
Re : Moyenne de colonne sous VBA

Bonjour Michel, bonjour le forum,

Ça y est, je crois avoir compris... Je pense qu'il te faut déclarer la variable MoyenneRef non plus dans la procédure mais en tête d'un module standard et bien sûr publique :

Code:
Public MoyenneRef As Double
Comme ça tu pourras la récupérer dans tous le projet. En revanche, pense à la remettre à zéro en fin de procédure car sinon elle garde toujours la dernière valeur. Tu pourrais le faire ici :
Code:
Public Sub CommandButton1_Click()
Module_Ref.LireFichierTxt_Ref (1)
CommandButton1.TopLeftCell.Offset(0, 1).Value = MoyenneRef
MoyenneRef = 0
End Sub
 
Re : Moyenne de colonne sous VBA

Bonjour Michel, bonjour le forum,

Le problème est que tu ne lis pas ce qui est écrit... En tête = dans la première ligne ou au pire en dessous de Option Explicit. Cela signifie en dehors de toute procédure e dans un module standard (exemple : Module1) pas dans un un onglet (Feuil1(Feuil1)), une UserForm ou ThisWorkbook... Je doute que tu aies une erreur si tu place correctement la déclaration de la variable MoyenneRef.

[Édition]
Évidement, si ta variable vient d'un autre classeur ça ne marchera pas...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Règle de 3
Réponses
11
Affichages
798
Retour