Utiliser la valeur d'une cellule

Bonjour,

Je créé un petit code qui a pour but de faire la moyenne de valeurs d'une meme cellule dans plusieurs fichiers excel.

A la ligne total = total + ... j'ai une erreur 438 je pensais que de cette facon la valeur était vu comme un nombre par la macro mais visiblement non.

Je voudrais aussi boucler cela sur un bon nombre de cellules, est-ce possible?
je pensais à Do While p < 25 mais apres faire un Range("Cp") ne marcherait surement pas donc je suis bloqué.
Et boucler aussi sur les colonnes c'est possible?

Sub moyenne()

            Dim i As Integer
            Dim total As Integer
            Dim moyenne As Integer

            i = 0
            total = 0

Set WBCollection = New Collection

WBCollection.Add "C:\Excel\02_06_13\Prod Client.xlsm"
WBCollection.Add "C:\Excel\02_07_13\Prod Client.xlsm"

// Début boucle

            For Each wkb In WBCollection
            
                    Set myWk = Workbooks.Open(wkb)
                    total = total + myWk.Worksheet("Feuil1").Range("C22").Value
                    i = i + 1
                    myWk.Close
                    Set myWk = Nothing
            Next
            
            moyenne = total / i
            
            Workbooks("moyenne").Worksheet("Feuil1").Range("C22") = moyenne

// Fin boucle


End Sub


Merci d'avance pour vos réponse!

8 réponses

  1. Modérateur
    Bonjour,

    Un petit exemple :

    Sub moyenne()
    Dim i As Integer
    Dim total As Long 'Long est préféré à Integer car permet des chiffres plus grands
    Dim moyenne As Integer
    Dim Lig As Integer
    Dim Col As Integer
    
    i = 0
    total = 0
    
    Set WBCollection = New Collection
    
    WBCollection.Add "C:\Excel\02_06_13\Prod Client.xlsm"
    WBCollection.Add "C:\Excel\02_07_13\Prod Client.xlsm"
    
    '// Début boucle sur les classeurs
    For Each wkb In WBCollection
        '// ouverture du classeur
        Set myWk = Workbooks.Open(wkb)
        '// Boucle sur les lignes 22 à 32
        For Lig = 22 To 32
            '// Boucle sur les colonnes de C à G
            For Col = 3 To 7
                If Not IsNumeric(myWk.Worksheets("Feuil1").Cells(Lig, Col).Value) Then
                    MsgBox "La valeur située Classeur " & Wk.Name & " Ligne " & Lig & " Colonne " & Col & "n'est pas un nombre"
                    Exit Sub
                Else
                    total = total + CLng(myWk.Worksheets("Feuil1").Cells(Lig, Col).Value)
                End If
                i = i + 1
            Next Col
        Next Lig
        myWk.Close
        Set myWk = Nothing
    Next
    moyenne = total / i
    Workbooks("moyenne").Worksheets("Feuil1").Range("C22") = moyenne
    '// Fin boucle
    End Sub


    Cordialement,
    Franck
    1
    1. Bonjour,

      Merci ca marche beaucoup mieux maintenant!
      0
      1. Nouveau problèmes:

        Pour rentrer les valeurs dans mon tableau excel actif,

        je fais

        Sheets("moyenne").Cells(Lig, Col) = moy

        avec moy = total / i

        => erreur d'execurtion 9 l'indice n'appartient pas a la selection :(

        Est-ce la divison par i qu'il n'aime pas?
        0
        1. Slt,

          Qu'elle est la valeur de lig et de col ? Comment sont-ils initialisés ?

          0
          1. Re,

            donc il faut modifier mon code :

            
            
            Sub moyenne()
            
                        Dim i As Integer
                        Dim total As Integer
                        Dim moyenne As Integer
                         dim colonne as integer
                        dim ligne as integer
            
                        i = 0
                        total = 0
            
            Set WBCollection = New Collection
            
            WBCollection.Add "C:\Excel\02_06_13\Prod Client.xlsm"
            WBCollection.Add "C:\Excel\02_07_13\Prod Client.xlsm"
            
            // Début boucle
            
                        For Each wkb In WBCollection
                      
                                Set myWk = Workbooks.Open(wkb)
                                
                                        for ligne = 1 to 25
                                            for colonne = 1 to 30
            
                                               total = total + myWk.Worksheet("Feuil1").cells(ligne,colonne).value
            
                                
            next colonne
            next ligne
            
            
                                myWk.Close
                                Set myWk = Nothing
            i=i+1
                        Next
                        
                        moyenne = total / i
                        
                        Workbooks("moyenne").Worksheet("Feuil1").Range("C22") = moyenne
            
            // Fin boucle
            
            
            End sub
            
            
            0
            1. Hum, nouveau problème...

              J'utilise la commande Workbook.Sheets("Feuil1").cells(Lig,Col).value dans la ligne suivante:

              total = total + myWk.Sheets("General").Cells(Lig, Col).Value

              cependant, en faisant un MsgBox (myWk.Sheets("General").Cells(Lig, Col)), il me retourne une case vide, donc je ne peux pas faire mes calculs par la suite...

              Quelqu'un aurait une explication?

              Merci.
              0
              1. Il y a quelque chose dans la cellule à la ligne et dans la colonne de Cells(lig, col) ?
                0
              2. Modérateur
                1- La syntaxe Workbook.Sheets n'est pas bonne,
                2- Feuille "General" ou Feuil1??? Si tu confonds, tu n'auras pas tes valeurs..............
                0
              3. Oui il y a quelque chose c'est "General" le nom de ma feuille j'ai mis Feuil1 pour info.

                La formule que j'utilise est:

                total = total + myWk.Sheets("General").Cells(Lig, Col).Value

                et la feuille General existe, et n'est pas vide !
                0
              4. Modérateur
                Si myWk.Sheets("General").Cells(Lig, Col).Value retourne 0 ou rien, c'est que la cellule située ligne Lig, colonne Col est vide.
                Sans fichier, impossible pour nous d'aller plus loin.
                0
            2. Bonjour,

              Voici les solutions a tes pbs :

              total = total + myWk.Worksheet("Feuil1").Range("C22").Value devient

              total = total + myWk.sheets("Feuil1").Range("C22").Value

              je pensais à Do While p < 25 mais apres faire un Range("Cp") ne marcherait surement pas donc je suis bloqué.
              Et boucler aussi sur les colonnes c'est possible?

              [/contents/446-fichier-sub Sub] moyenne()
              
                          Dim i As Integer
                          Dim total As Integer
                          Dim moyenne As Integer
                           dim colonne as integer
                          dim ligne as integer
              
                          i = 0
                          total = 0
              
              Set WBCollection = New Collection
              
              WBCollection.Add "C:\Excel\02_06_13\Prod Client.xlsm"
              WBCollection.Add "C:\Excel\02_07_13\Prod Client.xlsm"
              
              // Début boucle
              
                          For Each wkb In WBCollection
                        
                                  Set myWk = Workbooks.Open(wkb)
                                  
                                          for ligne = 1 to 25
                                              for colonne = 1 to 30
              
                                                 total = total + myWk.Worksheet("Feuil1").cells(ligne,colonne).value
                                  
              next colonne
              next ligne
              
              
                                  myWk.Close
                                  Set myWk = Nothing
                          Next
                          
                          moyenne = total / 25
                          
                          Workbooks("moyenne").Worksheet("Feuil1").Range("C22") = moyenne
              
              // Fin boucle
              
              
              End Sub
              
              
              -1
              1. Bonjour,

                Tu ne peux pas diviser par i car si tu regardes le code : i = 0
                donc si i = 0, tu ne peux pas faire la division par zéro.

                Alors voici comment modifier ton code, i s'incrémentera à chaque fois que tu ajouteras une valeur à total :

                
                [/contents/446-fichier-sub Sub] moyenne()
                
                            Dim i As Integer
                            Dim total As Integer
                            Dim moyenne As Integer
                             dim colonne as integer
                            dim ligne as integer
                
                            i = 0
                            total = 0
                
                Set WBCollection = New Collection
                
                WBCollection.Add "C:\Excel\02_06_13\Prod Client.xlsm"
                WBCollection.Add "C:\Excel\02_07_13\Prod Client.xlsm"
                
                // Début boucle
                
                            For Each wkb In WBCollection
                          
                                    Set myWk = Workbooks.Open(wkb)
                                    
                                            for ligne = 1 to 25
                                                for colonne = 1 to 30
                
                                                   total = total + myWk.Worksheet("Feuil1").cells(ligne,colonne).value
                i=i+1
                                    
                next colonne
                next ligne
                
                
                                    myWk.Close
                                    Set myWk = Nothing
                            Next
                            
                            moyenne = total / i
                            
                            Workbooks("moyenne").Worksheet("Feuil1").Range("C22") = moyenne
                
                // Fin boucle
                
                
                End Sub
                
                
                -1
                1. Dans l'exemple de Pikaju, i est incrémenté dans la 2ème boucle For ... Next.

                  Le message d'erreur indique que "l'indice n'appartient à la sélection" et non que la division par zéro est impossible !!!

                  Ensuite, dans ta solution, tu incrémentes i mais tu ne t'en sers pas ???
                  0
                2. une erreur de ma part.
                  0
                3. i est bien incrémenté donc le pb ne vient pas de la (j'ai testé en divisant par un nombre arbitraire toujours erreur)
                  0
                4. i me sert à faire ma moyenne (je divise par i qui est le nombre de fichier ds ma collection au final).
                  0
                5. Voir ici

                  Vérifie que le nom de ta feuille est correct ... "Moyenne" et "moyenne" est différent pour Excel
                  0