[VBA] Question de synthaxe je pense

Bonjour,

Je voudrais améliorer un fichier Excel. Ce fichier comporte (au maximum) 52 onglets (1 par semaine de l'année).
Dans chaque onglet, les colonnes B et C comportent respectivement une référence et une quantité.
Dans un 53ème onglet appelé "Recherche", je souhaite effectuer la somme de toutes les quantités (total des 52 semaines) d'une référence écrite par l'utilisateur.
voila le programme que j'ai crée, mais qui malheureusement ne fonctionne pas :

Sub Calcul()
'
' Calcul Macro
' Macro enregistrée le 09/07/2009 par Alanderson

somme = 0

Dim Feuille As Worksheet
For Each Feuille In Worksheets
Sheets("Recherche").Select
Range("A5").Select
'A5 est la cellule dans laquelle je veux que le total apparaisse
ActiveCell.Formula = "=recherchev(A2,'" & Feuille & "'!B3:C60,2,Faux)"
'A2 est la cellule dans laquelle l'utilisateur entre la référence
somme = somme + Val(Range("A5").Value)
Next Feuille

Range("A5").Value = somme

End Sub

Le problème se pose apparemment sur la ligne soulignée.
Merci de jeter un oeil et de corriger mon erreur.

Alanderson
Configuration: Windows 2003
Firefox 3.0.11

14 réponses

  1. Bonjour

    je ne suis pas spécialiste, mais il me semble que les formules doivent être entrées en anglais dans le VB, même si après elles apparaissent en français dans la feuille
    ActiveCell.Formula = "=vlookup(A2,'" & Feuille.Name & "'!B3:C60,2,False)"

    Et s'il te plaît, plus jamais de h à "syntaxe"
    1. Oula ! je suis désolé pour le "h" ^^

      Le problème sur la formule de recherche a en effet disparu, mais j'ai un soucis sur la reconnaissance du format de la variable :

      somme = somme + Range("A5").Value

      Il me sort une erreur : Incompatibilité de type.
      J'ai essayé : Val(Range("A5").Value) pour convertir en nombre mais ça ne fonctionne pas non plus.

      Merci de me tenir au courant si tu vois une possibilité.
      1. C'est sûrement que A5 contient autre chose qu'un nombre. Qu'y a-t-il donc dans A5 ?
        1. Ok, vu. Quand la recherche n'aboutit pas, tu as la valeur #N/A et c'est là que tu as ton problème.
          Il ne faut faire l'addition que si le rechercheV aboutit :
          If IsNumeric(Range("A5").Value) Then somme = somme + Val(Range("A5").Value)
          1. Eh bien, cela marche plutot bien ! Merci pour ca !
            Dernière petite nuance à laquelle je n'avais pas encore pensé :

            Si une référence est plusieurs fois dans la colonne B, est-ce possible de toutes les comptabiliser ?
            Pour le moment, il ne me prend que la première trouvée. Je pense qu'il dois falloir balayer toute la feuille et lui dire de poursuivre même s'il a trouvé une première valeur.
            Quelqu'un a une idée pour programmer ca ?

            Merci pour tout
            1. Contributeur
              Bonjour à tous,

              Je ne vois pas l'intérêt d'utiliser des formules alors que l'on est en VBA..

              cette macro parcourt les feuilles en évitant la feuille "recherche" et teste si la valeur de A2 existe dans le tableau B3:B60

              Sub consolider()
              Dim valeur
              Dim Feuille As Worksheet
              Dim somme As Single, total As Single
              
              valeur = Sheets("recherche").Range("A2")
              
              For Each Feuille In Worksheets
                 If Feuille.Name <> "recherche" Then
                      With Feuille
                          If Application.CountIf(Range("B3:B60"), valeur) > 0 Then
                              somme = .Range("B2:B60").Find(valeur, .Range("B2")).Offset(0, 1)
                          End If
                      End With
                   total = total + somme
                  End If
              Next
              
              Sheets("recherche").Range("A5") = total

              end sub

              Je ne connais l'ensemble du problème mais il y a une fonction consolider dans XL. peut-être que...
              voir ce site inconturnable
              http://boisgontierjacques.free.fr/
              1. michel_m,

                quand j'execute ta macro, le résultat qui me reviens est "0". D'après ce que tu as rentré comme info, j'attendrais un "67.5".

                De plus, s'il existe plusieurs toto dans la colonne d'une feuille, je ne pense pas que ca marche.

                C'est vraiment cool de ta part de te donner du mal.
                Peux-tu me dire si c'est réalisable ?

                Merci d'avance
                1. Contributeur
                  ben oui, mais fallait savoir qu'il pouvait y avoir plusieurs toto...Je dois m'absenter: en attendant, regarde dans l'exemple de l'aide de FIND ce serait à adapter au niveau de l'affectation de somme (ligne en italique)

                  pour le 0, que je suis c... (le bruit des cigales, sans doute, pour justifier mon erreur ) ;-)
                  l'affectation de total était mal placée!!!

                  as tu regardé le site indiqué ?

                  Sub consolider()
                  Dim valeur
                  Dim Feuille As Worksheet
                  Dim somme As Single, total As Single
                  valeur = Sheets("recherche").Range("A2")
                  For Each Feuille In Worksheets
                     If Feuille.Name <> "recherche" Then
                          With Feuille
                          test = Feuille.Name
                              If Application.CountIf(Range("B3:B60"), valeur) > 0 Then
                                  somme = .Range("B2:B60").Find(valeur, .Range("B2")).Offset(0, 1)
                                   total = total + somme
                              End If
                          End With
                       
                      End If
                  Next
                  Sheets("recherche").Range("A5") = total
                  End Sub
                  


                  1. j'ai regardé ton site, en effet, mais je n'ai pas trouvé l'info concernant le bouclage des ligne pour trouver plusieurs valeurs par page. J'essaye de regarder de plus près. Si je trouve, je laisserais un post ici. Dans le cas inverse, si tu peux continuer à me donner un coup de main, ca serait avec plaisir !

                    Merci encore
                    1. Contributeur
                      ce que j'ai voulu dire:as tu regardé l'aide Microsoft pour FIND et son exemple ?
                      c'est très simple à adapter: tu as juste à changer la plage de recherche (B3:B60) et
                      c.value=2 en
                      total=total+c.offset(0,1)
                      plus besoin de la variable somme

                      je te laisse terminer (chez moi, ca marche)

                      bonne soirée
                      1. Eh bien malgré 2 heures passées à essayer de faire fonctionner ce programme pourtant pas compliqué, ... je suis bloqué. Est-ce possible que tu m'envoies le programme s'il marche chez toi ? Je regarderaisalors comment tu as fait.

                        Merci michel_m
                        1. Contributeur
                          bonjour,

                          Moi aussi, j'ai passé et je continue de passer des heures à chercher et à me planter: c'est comme cela qu'on progresse TRES petit à petit.
                          Donc... je t'ai mis en gras ce qui est à adapter à partir de l'aide MS, le reste de la proc est bonne (déclaration à changer)

                          With Worksheets(1).Range("a1:a500")
                          Set c = .Find(2, lookin:=xlValues)
                          If Not c Is Nothing Then
                          firstAddress = c.Address
                          Do
                          c.Value = 5 ==> total=total+c. (la cellule à gauche=)
                          Set c = .FindNext(c)
                          Loop While Not c Is Nothing And c.Address <> firstAddress
                          End If
                          End With

                          1. Est-ce possible que tu m'envoies le fichier sur Cjoint ?
                            Le problème est que la valeur a chercher avec le Find est variable en fonction de ce que rentre l'utilisateur.
                            J'ai essayé de créer une variable mais je n'arrive pas à l'appeler dans e Find .

                            Merci d'avance !