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. 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?
      1. Slt,

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

        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
          
          
          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.
            1. Il y a quelque chose dans la cellule à la ligne et dans la colonne de Cells(lig, col) ?
            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..............
            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 !
            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.
          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. 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. 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 ???
              2. une erreur de ma part.
              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)
              4. i me sert à faire ma moyenne (je divise par i qui est le nombre de fichier ds ma collection au final).
              5. Voir ici

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