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

Macros et VBA Excel Discussion :

Macro sur 2 plages non adjacentes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur génie industriel
    Inscrit en
    Novembre 2016
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur génie industriel

    Informations forums :
    Inscription : Novembre 2016
    Messages : 88
    Par défaut Macro sur 2 plages non adjacentes
    Bonjour encore,

    La novice que je suis s'est lancée dans la réalisation de macro
    Pas peu fière de moi (car oui même si pour vous c'est hyper easy pour moi cela relève plutôt du miracle) ma macro consiste en :

    Je modifie ma cellule et un evénement msgbox s'ouvre pour confirmer la modification si "oui" on valide la cellule si "non" on remet la cellule précédente qui a été enregistrée.
    En simultané à chaque modification de ces cellules un historique de modification s'ouvre dans la feuille "QQOQCCP" avec les champs Qui, Quoi, Quand(date), Quand(heure), Valeur avant modif, Valeur Après modif, et un champs Pourquoi qui doit être rempli par le modificateur (si il décide de modifier la cellule un userform apparaît)

    Cette macro fonctionne très bien (ou presque) pour Range("D6: D2000") mais rien ne se passe pour Range("F6:BXY2000")

    Aussi lorsque les lignes Worksheets("QQOQCCP").Cells(Rows.Count, 7).End(xlUp).Offset(1, 0).Value="..." prennent uniquement en compte la cellule d'au dessus et non pas la ligne, il suffit qu'une cellule soit vide et le End(xlUp) va automatiquement sur la ligne déjà renseignée mais avec 1 cellule vide ce qui risque de provoquer un décalage dans mon historique QQOQCCP, comment empêcher ça ?

    Enfin j'aurai voulu que pour la plage "F6:BXY2000" un message un peu différent s'affiche lors de la modification, en précisant dans la feuille "QQOCCCP" si on a modifié sur la plage "D6: D2000" ou "F6:BXY2000" (en rajoutant une colonne "type de modification" par exemple)

    Je ne sais pas si j'ai été très claire, mais voici mon petit code et merci d'avance à mes futurs sauveurs!

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Option Explicit
    Dim ValCell As Variant
    Dim PreviousValue As Variant
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
      Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
      Application.EnableEvents = False
       If MsgBox("Êtes-vous certain de modifier la révision", vbYesNo + vbExclamation + vbDefaultButton2) = vbNo Then
        Target.Value = ValCell
        Worksheets("QQOQCCP").Cells(Rows.Count, 7).End(xlUp).Offset(1, 0).Value = "Pas de modification"
        Else
        Pourquoi.Show
        End If
      Application.EnableEvents = True
     End If
    If Target.Value <> PreviousValue Then
    Worksheets("QQOQCCP").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Environ("Username")
    Worksheets("QQOQCCP").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Cells(Target.Row, 2).Value
    Worksheets("QQOQCCP").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Value = ValCell
    Worksheets("QQOQCCP").Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).Value = Target.Value
    Worksheets("QQOQCCP").Cells(Rows.Count, 5).End(xlUp).Offset(1, 0).Value = Date
    Worksheets("QQOQCCP").Cells(Rows.Count, 6).End(xlUp).Offset(1, 0).Value = Hour(Now) & ":" & Minute(Now)
    End If
    End Sub
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
      Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
    ValCell = Target
    End If
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
      Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
    fait que la condition n'est jamais réunie, puisque si dans l'un, impossible d'être dans l'autre (et donc l'un des deux est forcément Nothing).
    Ce OR devrait être un AND.
    (je n'ai pas regardé le reste).

  3. #3
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonjour Nananinanana
    As-tu essayé avec des parenthèses comme ceci?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Not ( Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
      Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing )Then

    Unparia,
    fait que la condition n'est jamais réunie
    As-tu bien lu?
    Cette macro fonctionne très bien (ou presque) pour Range("D6: D2000") mais rien ne se passe pour Range("F6:BXY2000")
    C'est donc que la condition fonctionne en partie

    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    oui pour moi c'est bien un problème de "Not" qui ne s'applique que sur le premier Intersect

    Soit on factorise, comme le propose eric, soit on met également un "Not" devant le second Intersect

    Sinon, ton test se lit : Si on est dans la première plage OU qu'on est pas dans la seconde plage
    ce qui explique que ça ne fonctionne pas pour ta seconde plage

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Si l'on ne veut pas se lancer dans la nécessité de réfléchir sur ce que sont les doubles négations et leur transposition en code, le plus simple est encore :
    - de garder à l'esprit que la méthode intersect s'applique parfaitement à une plage discontinue
    - et donc de l'appliquer tout bêtement à la plage constituée des deux "sous-plages" à traiter, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect(Target, Union(Range("D6:D2000"), Range("F6:BXY2000"))) Is Nothing Then
    voilà tout.

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je suis d'accord sur le principe de factoriser également les deux plages par Union

    Mais, si je ne l'ai pas proposé, c'est qu'elle alourdira la mise en place de sa seconde problématique, qui est de customiser certaines parties en fonction de l'une ou l'autre des deux plages. Il va falloir (en plus de l'union) refaire un teste pour vérifier dans laquelle des deux on est.

    Alors qu'avec le double Not, pour régler ses souhaits ultérieurs, il suffira de dissocier les deux tests sur un If/ElseIf
    Enfin, avec les deux ça marche (et d'ailleurs, c'est quasi transparent sur la partie customisée qu'il faut précisément mettre en oeuvre ici).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/07/2014, 16h51
  2. generaliser une macro sur une plage de données
    Par Eausport dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/07/2011, 10h49
  3. compter les occurrences sur des plages non contiguës
    Par docjo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/10/2009, 11h08
  4. Réponses: 1
    Dernier message: 28/07/2009, 16h22
  5. Mise en forme bordure par Macro sur plage nommée
    Par tempo-lyon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 01/10/2007, 10h52

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