EXCEL : Réactualiser une macro

bonjour

voila je viens de créer une macro que j'execute dans une cellule

cette macro utilise des valeurs d'autres cellules

j'aimerai savoir comment faire pour que quand je change une valeur la macro se ré-execute automatiquement

merci pour vos reponses

15 réponses

  • Votes
  • Date
  • Date décroissante
  1. re :

    cette fonction est un peu lourde à cause de (rechercheV)
    mais tu pourrais essayer ainsi :!

    Déclarer ta fonction dans un module et non dans la feuille :

    Effectuer les modifs suivante :

    Function MaRecherche(Cellule1, Cellule2) As Variant
    
        Dim Var1, Var2 As String
        Dim Var3, Var4 As Integer
    
        Application.Volatile
        Var1 = "":    Var2 = ""
        If (Cellule1 = "j") Then
            Var3 = "javelot"
        Else
            Var3 = "poids"
        End If
        If (Cellule2 = "g") Then
            Var4 = 3
        Else
            Var4 = 2
        End If
        Recherche = "=VLOOKUP(RC[-1]," + CStr(Var3) + "," + CStr(Var4) + ",true)"
    
    End Function
    


    //Ensuite tu te positionne sur la cellule visé
    //Menu Insertion/Fonctions
    //Sélectionne personnalisé
    //Dans le liste repère la fonction [MaRecherche]

    Ça devrait donner le résultat escompté !
    N'ayant pas le contexte de données, je ne puis tester à 100%

    Lupin
    1. désolé :

      Function MaRecherche(Cellule1, Cellule2) As Variant

      Dim Var1, Var2 As String
      Dim Var3, Var4 As Integer

      Application.Volatile
      Var1 = "": Var2 = ""
      If (Cellule1 = "j") Then
      Var3 = "javelot"
      Else
      Var3 = "poids"
      End If
      If (Cellule2 = "g") Then
      Var4 = 3
      Else
      Var4 = 2
      End If
      MaRecherche = "=VLOOKUP(RC[-1]," + CStr(Var3) + "," + CStr(Var4) + ",true)"

      End Function

      Lupin
    2. @Lupinsuite :

      la déclaration :

      Function MaRecherche(Cellule1, Cellule2) As Variant

      donne de façon explicite :

      Function MaRecherche(Cellule1 As Variant, Cellule2 As Variant) As Variant

      je suggère encore plus stricte,

      Function MaRecherche(Cellule1 As String, Cellule2 As String) As String

      Lupin
  2. Contributeur
    a cette adresse dede_421@hotmail.com

    pourrais tu me donner des sites pour apprendre des fonctions avancées sur excel si tu en as
    1. Salut,

      je t'ai préparé un classeur avec des données bidon.

      je ne sais comment te le faire parvenir....

      A+
      1. Bonjour,

        Ajouter en début de fonction :

        [ Application.Volatile ]

        Lupin
        1. Contributeur
          malheursement ce sont des données confidentiels mais je vais te fournir plus d'infos si tu veux

          dis moi de koi tu as besoin
          1. bonjour,

            peux-tu m'envoyer ton classeur? ça sera plus simple pour moi.

            en tout cas, il est possible de référencer les noms de feuil2 dans feuil1

            A+
            1. Contributeur
              merci pour t explications mais j'aimerai savoir 2 ou 3 petites choses ou te préciser quelque infos

              - le tableau dans lequel la recherche se fait est situé sur la feuil2 et le tableau ou s'affiche les resultats sur la feuil1

              - le tableau ou la recherche se fait a été modifié

              il se compose comme ca

              Javelot Poids

              Filles Notes Garcon Notes Filles Notes Garcon Notes

              j'ai appeler chaque couple (sexe-discipline) comme suit

              JavFille, JavGarcon, PoidsFille, poidsGarcon

              comment l'integrer dans ton exemple
              1. bonsoir,

                je voulais t'envoyer la feuille excel "sans macro" mais tu n'as pas laissé ton adresse dans ton profil.

                sinon :

                1) crée une feuille avec tes colonnes de saisie A, C, Q.

                2) crée les noms :
                F cellule avec la valeur 2
                G cellule avec la valeur 3
                J cellule avec la valeur javelot
                P cellule avec la valeur poids
                JAVELOT zone d'au moins 3 colonnes qui concerne le javelot
                POIDS zone d'au moins 3 colonnes qui concerne le poids

                3) dans la zone des résultat (R5:R##) saisie la formule :
                =RECHERCHEV(Q5;INDIRECT(INDIRECT(C5));INDIRECT(A5);VRAI)

                4) explications :
                INDIRECT(INDIRECT(C5)) :
                INDIRECT(C5) donne j ou p selon la saisie dans la zone discipline
                INDIRECT(INDIRECT(C5))=INDIRECT(j)= javelot (la zone nommée javelot)
                ou
                INDIRECT(INDIRECT(C5))=INDIRECT(p)= poids (la zone nommée poids)

                INDIRECT(A5) :
                A5 contient f ou g.
                Indirect(f)=valeur de la zone nommée "f" soit 2.
                Indirect(g)=valeur de la zone nommée "g" soit 3.

                C'est quand même plus visuel avec la feuille de calcul!!!!

                A+
                1. Contributeur
                  oui le resultat sans macro m'interesse ca m'aidera a progresser

                  demain j'essaie ta commande

                  merci encore
                  1. hello,

                    ça y est, je commence à comprendre!

                    essaie de mettre le code suivant derrière la feuille concernée :

                    Private Sub Worksheet_Change(ByVal Target As Range)
                    Application.EnableEvents = False
                    Call recherche(Range("R" & Target.Row))
                    Application.EnableEvents = True
                    End Sub


                    puis tu rajoutes une variable dans ta routine recherche :

                    Sub recherche(VCell As Range)
                    Dim var1, var2, var3, var4

                    If VCell.Offset(0, -15).Text = "j" Then
                    var3 = "javelot"
                    Else
                    var3 = "poids"
                    End If

                    If VCell.Offset(0, -17).Text = "g" Then
                    var4 = 3
                    Else
                    var4 = 2
                    End If

                    VCell.FormulaR1C1 = _
                    "=VLOOKUP(RC[-1]," + CStr(var3) + "," + CStr(var4) + ",true)"

                    End Sub


                    Comme ça tu interceptes les changement dans ta feuille et tu recalcules la cellule R# où la ligne # correspond à la ligne de la cellule modifiée.

                    Naturellement tu peux optimiser le truc en ne réagissant que si une cellule impliquée dans le calcul est modifiée.

                    Au fait, tu tiens absolument à des macros?
                    Tu peux obtenir le même résultat sans macros.

                    Si ça t'intéresse, tu dis

                    A+
                    1. Contributeur
                      voila la macro

                      Sub recherche()
                      Dim var1, var2, var3, var4

                      If ActiveCell.Offset(0, -15).Text = "j" Then
                      var3 = "javelot"
                      Else
                      var3 = "poids"
                      End If

                      If ActiveCell.Offset(0, -17).Text = "g" Then
                      var4 = 3
                      Else
                      var4 = 2
                      End If

                      ActiveCell.FormulaR1C1 = _
                      "=VLOOKUP(RC[-1]," + CStr(var3) + "," + CStr(var4) + ",true)"

                      End Sub

                      contenu de la cellule R5 (c pas E1)

                      =RECHERCHEV(Q5;poids;2;VRAI)

                      en a5 j'ai soit la valeur f ou g
                      en c5 j'ai soit j ou p

                      si c5= j je cherche dans le tableau javelot si c5=p je cherche dans poids

                      si a5= f je cherche dans la colonne 2 si a5= g je cherche ds colonne 3

                      ds mon cas a5=f c5=p donc ma fonction c'est

                      =RECHERCHEV(Q5;poids;2;VRAI)

                      et en fait ce que j'ai fais en r5 j'ai selectionner la cellule , j'ai fais alt+f8 et j'ai executer ma macro
                      1. Bonjour,

                        je ne comprends toujours pas ce que tu veux dire par "executer une macro dans une cellule"
                        je vois bien le recherchev qui pour moi est une fonction d'excel, pas une macro.

                        peux-tu me faire un copier coller de ta macro et du contenu de ta cellule E1?

                        A+
                        1. Contributeur
                          prenons un exemple

                          dans a1 et b1 j'ai des valeurs qui entre en compte dans une macro que j'execute en e1

                          cette macro en fait c'est une rechercheV

                          une fois la macro executer j'obtient en e1 la formule =rechercheV(...

                          cette macro se repete sur plusieurs lignes

                          si par exemple je change la valeur dans a1, e1 dois se mettre a jour directement mais pareil pour e10 si je modifie a10
                          1. Bonsoir,

                            je ne comprends pas bien la phrase "une macro que j'execute dans une cellule":

                            1) ta macro, c'est une fonction qui utilise les valeurs de certaines cellules?
                            si c'est le cas, lorsque tu changes une de ces valeurs, il y a recalcul automatique , non?

                            2) lances-tu ta macro manuellement et tu souhaites qu'elle se lance automatiquement lorsque une des cellules qui participent à la macro sont modifiées?
                            dans ce cas, mets du code derrière ta feuille de calcul du genre :
                            ------------------------
                            Private Sub Worksheet_Change(ByVal Target As Range)
                            Application.EnableEvents = False
                            Call E1_22
                            Application.EnableEvents = True
                            End Sub
                            ------------------------
                            Sub E1_22()
                            Range("E1").Value = Now
                            End Sub

                            ------------------------

                            3) si c'est un autre cas, dis en plus

                            cordialement