IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

vba Exécuter automatiquement une macro si condition est remplie. [XL-2010]


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut vba Exécuter automatiquement une macro si condition est remplie.
    Bonjour,
    Je m'excuse de relancer une discussion que j'avais mis comme RÉSOLU

    Je réédite le sujet :

    N'étant pas un doué en la matière, je fais appel à votre aide.
    Je cherche à faire en sorte qu'une macro s’exécute automatiquement si une condition au sien d'une plage de cellules est remplie.
    - Si une des cellules C9:C100 affiche le mot "FIN" alors la macro "macro1" s’exécute automatiquement.
    D'avance je vous remercie de votre aide.

    J'ai reçu une réponse de GastonLagaffe25 qui me convient tout à fait (voir ci-dessous)

    1 Private Sub Worksheet_Change(ByVal Target As Range)
    2 Dim i As Integer
    3 For i = 8 To 100
    4 If Cells(i, 3).Value = "Fin" Then Call macro1
    5 Next i
    6 End Sub


    Ce que je voudrais au final c'est que je puisse répéter la même chose sur deux autres plages de cellules : H9:H100 et M9:M100 avec bien sur la même condition c à d si un des cellules affiche le mot "FIN".

    Nota : Je précise pour information que la condition "FIN" provient du résultat automatique d'une fonction déjà dans les cellules C9:C100; H9:H100; M9:M100 genre : "=si(a1=1;"FIN";"")

    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Utiliser une boucle pour parcourir les valeurs n'est pas recommandé.
    Utilise plutôt la fonction Find().

    Un exemple de code avec cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim rngC As Range
      Set rngC = Me.Cells.Find("FIN", , , xlWhole)
      If rngC Is Nothing Then
        Exit Sub
      Else
        If Intersect(rngC, Range("C9:C100,H9:H100,M9:M100")) Is Nothing Then
        Else
          Call macro1
        End If
      End If
    End Sub

  3. #3
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par SmallFlower Voir le message
    Salut,

    Utiliser une boucle pour parcourir les valeurs n'est pas recommandé.
    Utilise plutôt la fonction Find().

    Un exemple de code avec cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim rngC As Range
      Set rngC = Me.Cells.Find("FIN", , , xlWhole)
      If rngC Is Nothing Then
        Exit Sub
      Else
        If Intersect(rngC, Range("C9:C100,H9:H100,M9:M100")) Is Nothing Then
        Else
          Call macro1
        End If
      End If
    End Sub


    Toutes mes excuses mais j'ai omis une précision importante dans ma demande c'est que lorsque la condition est remplie dans chaque plage de cellules ce n'est pas la même macro qui s'exécute. "Macro1" pour la plage C9:C100; "Macro2" pour la plage H9:H100 et "Macro3" pour la plage M9:M100.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je pense que tu es en mesure d'adapter le code à ton besoin.

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Il y a une autre chose que tu ne dis pas : est-ce que ta macro doit se déclencher pour chaque cellule égale à FIN ou doit-elle se déclencher une seule fois si au moins une cellule est égale à FIN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim i As Integer
     
       For i = 9 To 100
           If Cells(i, 3).Value = "FIN" Then Call macro1
       Next i
     
       For i = 9 To 100
           If Cells(i, 8).Value = "FIN" Then Call macro2
       Next i
     
       For i = 9 To 100
           If Cells(i, 14).Value = "FIN" Then Call macro3
       Next i
     
    End Sub

  6. #6
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Il y a une autre chose que tu ne dis pas : est-ce que ta macro doit se déclencher pour chaque cellule égale à FIN ou doit-elle se déclencher une seule fois si au moins une cellule est égale à FIN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim i As Integer
     
       For i = 9 To 100
           If Cells(i, 3).Value = "FIN" Then Call macro1
       Next i
     
       For i = 9 To 100
           If Cells(i, 8).Value = "FIN" Then Call macro2
       Next i
     
       For i = 9 To 100
           If Cells(i, 14).Value = "FIN" Then Call macro3
       Next i
     
    End Sub

    Chaque macros doivent s'exécuter une seule fois si au moins une cellule des plages respectives est égale à FIN. (Dés que la première cellule de la plage concernée remplie la condition)

  7. #7
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    J'ai opté pour la solution de Menhir. Bien que l'exécution soit un tantinet long, çà fonctionne. Pour mon cas ce n'est pas un problème. Merci à tous pour votre aide..

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 958
    Points : 28 968
    Points
    28 968
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il y a sans doute quelque chose qui m'échappe mais pourquoi dot-on parcourir toutes les cellules d'une plage alors qu'en principe on intercepte le changement de valeur d'une cellule ou d'une plage de cellules de la feuille.
    Parcourir l'objet Target avec le contrôle (If Not Application.Intersect(Target, Range(laPlage)) Is Nothing) n'est-il pas suffisant

  9. #9
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    D'accord avec ce que dit Philippe, c'est certainement pour cela que l’exécution prend un peu de temps (pas énormément), mais je ne connais rien en matière de code et syntaxe. Je ne sais faire (hélas) que du copier-coller et si cela fonctionne je m'en contente. S'il y a une possibilité de faire plus simple et plus rapide je suis preneur. Mais comme l'a fait Menhir (que je remercie au passage) il faut que se soit tout écrit car pour moi, comme je l'ai dit, toute cette syntaxe c'est un peu du "charabia".

  10. #10
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Chaque macros doivent s'exécuter une seule fois si au moins une cellule des plages respectives est égale à FIN. (Dés que la première cellule de la plage concernée remplie la condition)
    Dans ce cas, le code devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim i As Integer
     
       For i = 9 To 101
           If Cells(i, 3).Value = "FIN" Then Exit For
       Next i
       If i<>101 Then Call macro1
     
       For i = 9 To 101
           If Cells(i, 3).Value = "FIN" Then Exit For
       Next i
       If i<>101 Then Call macro2
     
       For i = 9 To 101
           If Cells(i, 3).Value = "FIN" Then Exit For
       Next i
       If i<>101 Then Call macro3
     
    End Sub
    Citation Envoyé par Philippe Tulliez Voir le message
    Il y a sans doute quelque chose qui m'échappe mais pourquoi dot-on parcourir toutes les cellules d'une plage alors qu'en principe on intercepte le changement de valeur d'une cellule ou d'une plage de cellules de la feuille.
    Parce que le Change ne se déclenche que sur les cellules modifiées "à la main" et que, dans le cas présent, la valeur FIN résulte de la valeur d'une fonction de la modification d'une autre cellule. C'est une modification indirecte, d'où la nécessité de cette scrutation.

  11. #11
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    La dernière solution proposée par Menhir ne semble pas fonctionner. Dès que j'installe le code et que j'entre la première donnée le tableau excel semble tourner en boucle, impossible de stopper le processus je suis obligé de fermer excel par le gestionnaire de tache (ou alors après une longue attente).

  12. #12
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    J'ai oublié de changer les numéros de colonnes dans les Cells quand j'ai fait les copier/coller des boulces For to.

  13. #13
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Je m'en était aperçu et j'ai fait la modification le problème reste inchangé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/07/2015, 13h31
  2. [Toutes versions] VBA - exécuter automatiquement une macro
    Par NZL0401 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/04/2015, 19h50
  3. exécution d'une macro avec condition
    Par casavba dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/08/2007, 14h44
  4. [vba-E] pour une macro executable automatiquement
    Par ricachu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/07/2006, 11h34
  5. [VBA-E]Exécution d'une macro en arrière-plan
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 25/04/2006, 23h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo