Utiliser la valeur d'une cellule

geoff's Messages postés 36 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. geoff's Messages postés 36 Statut Membre
     
    Bonjour,

    Merci ca marche beaucoup mieux maintenant!
    0
  3. geoff's Messages postés 36 Statut Membre
     
    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
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Slt,

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

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

    Posez votre question
  6. melanie1324 Messages postés 1561 Statut Membre 156
     
    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
  7. geoff's Messages postés 36 Statut Membre
     
    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. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Il y a quelque chose dans la cellule à la ligne et dans la colonne de Cells(lig, col) ?
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. geoff's Messages postés 36 Statut Membre
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  8. melanie1324 Messages postés 1561 Statut Membre 156
     
    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
  9. melanie1324 Messages postés 1561 Statut Membre 156
     
    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. Polux31 Messages postés 7219 Statut Membre 1 204
       
      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. melanie1324 Messages postés 1561 Statut Membre 156
       
      une erreur de ma part.
      0
    3. geoff's Messages postés 36 Statut Membre
       
      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. geoff's Messages postés 36 Statut Membre
       
      i me sert à faire ma moyenne (je divise par i qui est le nombre de fichier ds ma collection au final).
      0
    5. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Voir ici

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