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. 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. 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. 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
    2. Slt,

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

      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. 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. 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