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 :

Procédure Worksheet-change en VB sous excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut Procédure Worksheet-change en VB sous excel
    Bonjour à tous

    j'aimerais savoir si la procédure worksheet_change peut s'appliquer uniquement sur une plage de cellule déterminée et non sur chaque cellule de la feuille

    les changements sont susceptibles d'être effectués sur la plage by2 à by235 et non ailleurs

    Merci pour vos réponses

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 267
    Par défaut
    Bonjour,

    Comme il s'agit de VBA, je pense que tu n'es pas sur le bon forum pour poser ta question mais je vais y répondre tout de même.

    Utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("by2:by235")) Is Nothing Then
    ......ton action....
    End Sub
    Amicalement

    Dan

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut
    La macro se lance sur tout changement sur la globalité de la feuille et on ne peut pas le modifier, sauf en refaisant Excel.

    Mais tu peux ne traiter qu'une partie de la feuille
    if intersect (traget, range("BY2:BY235") is nothing then exit sub
    si aucune cellule modifiée (target) n'appartient à la plage 'BY2:BY235 arrêter la macro (sortir)

    C'est le plus simple, mais ça ne prend pas compte correctement des modifications mutiples, comme une modification de la plage A2:By2 (effacement des valeurs, coller) une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Plage_T As Range
    If Intersect(Target, Range("By2:BY235")) Is Nothing Then Exit Sub
    Set Plage_T = Intersect(Target, Range("By2:BY235"))
     
    'traitement Plage_T
     
    End Sub
    Dans cette macro, le traitement ne doit plus se faire sur Target, mais sur Plage_T qui ne contient que les cellules de BY2:BY235 qui ont été modifiées
    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Merci les gars! je vous tiens au courant et bravo pour votre rapidité, j'apprécie

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    En fait, je veux travailler sur cette plage de cellule car si par exemple, BY14 change, la cellule d'à côté doit être modifée, (BZ14)

    J'ai crée une fonction qui fonctionne et qui boucle sur toute la plage BY2 à BY235
    j'aimerais éviter la boucle à savoir que dès lors qu'il y a un changement sur la cellule BY233 par exemple, la cellule BZ233 doit être modifée

    j'ai pensé à target.address par exemple mais bon...

  6. #6
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 267
    Par défaut
    re,

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("by2:by235")) Is Nothing Then
    Target.Offset(0, 1) = .....
    End If
    End Sub
    Remplace les .... par ce que tu dois mettre dans la cellule BZ

    Amicalement

    Dan

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    ok merci, je vais voir mais quel est le rôle de la propriété Offset exactement? le décalage d'un cellule? de son contenu?

  8. #8
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Non, .offset() permet juste d'accéder à une cellule/plage en référence à une autre, ce qui a l'avantage dans ton code de ne pas avoir à faire de boucle.

  9. #9
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 267
    Par défaut
    re,

    Pour compléter ce que t'explique Caféine, dans le code :

    Target : cellule lue par la macro
    Offset (0,1) : 0 -> ligne de Target, 1 -> une colonne à coté de Target.

    Bonne journée à toi et Caféine

    Dan

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    merci beaucoup, ça m'évite déjà de boucler!! j'ai encore des améliorations à faire sur le programme mais merci pour votre aide

    en fait, je n'avais jamais programmé sous excel en faisant référence à des cellules, j'ai bossé surtout en access ou delphi

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Par contre, j'ai un petit souci! en fait quand je sélectionne plusieurs cellules et que je veux faire un copier/coller ou autre j'ai un message d'erreur d'incompatibilité (erreur 13: incompatibilité de type)

    En effet, dans mon code, il y a une condition if target.value <> ""


    en fait, en effectuant un changement sur une cellule à la fois, là ça fonctionne


    pour le moment, je contourne avec l'erreur on error go to

    a + tard

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Pour être plus clair concernant mon précédent post

    En fait, j'ai besoin de travailler sur la propriété value d'une quelconque cellule située sur la plage By2 à By35

    dès lors que je modifie plusieurs cellules à la fois, j'ai un message d'erreur d'incompatibilité par rapport à ma propriété value

    voilà

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Le traitement que tu fais pour une cellule, il faut le faire pour la plage de cellules (si j'ai bien compris).
    Il faut donc une adaptation de:


    For Each c In Target
    ... ton code avec c qui est un objet Range ou Cells
    Next c

    Ceci a pour effet de traiter les cellules de Target l'une après l'autre... normalement

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Salut et merci pour ta réponse

    Non, pas exactement. En fait, je voulais éviter la boucle mais il est vrai que si l'utilisateur modifie plusieurs cellules à la fois, là je n'ai pas le choix il faut boucler MAIS non pas sur toute la plage de travail (BY2 à By235) mais uniquement sur celle sélectionnée; par exemple, si l'utilisateur désire modifier les cellules BY3 à BY10, je ne vais pas boucler jusqu'à 235

    Je pense savoir ce que je vais faire, je vais utiliser target.address

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    je me prends la tête pour rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for each target in plage_t
    avec préalablement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage_t = Intersect(Target, Range("by:by235"))
    ça marche uniquement pour les cellules modifiées sans boucler jusqu'à la fin, j'aurais dû y penser mea culpa

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Salut les gars

    bon ça avance mais je dois régler un dernier souci

    en fait dans la plage BY2 à BY235 il n'y a que des listes déroulantes (crées par le menu, données, validation..)

    lorsque l'utilisateur effectue une saisie d'un mot ne se trouvant pas dans la liste, il obtient le message "La valeur que vous avez tapée n'est pas valide, un utilisateur a restreint les valeurs que peut prendre cette cellule" normal

    le souci est qu'après avoir cliqué sur annuler, c'est comme si le contenu de la cellule en question changeait, ce qui fait afficher les messages que j'ai paramétrés (msgbox) mais qui n'ont pas lieu d'être

    Je peux récupérer ce que saisit l'utilisateur uniquement si ce qu'il saisit ou choisit fait partie de la liste sinon niet...................

    ça ne fiche pas mon programme en l'air mais ce serait bien de gérer cela

    Je continue de chercher, si vous avez une idée....


    cordialement

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Bonjour à tous

    J'ai contourné le souci

    en fait, j'ai crée une fonction desactivererreurs dans un module et je fais appel à cette fonction à chaque ouverture du fichier



    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
    31
    32
    33
    34
    35
    Function desactivererreurs() As Boolean
     
    Dim plage_t As Range
    Dim cellu As Range
     
    Set plage_t = Range("BY2:BY235")
     
    Range("By2:BY235").Select
     
     
    For Each cellu In plage_t
     
     
     
     With cellu.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=STATUTFICHE"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = False
           .ShowError = False
        End With
     
    Next cellu
     
    desactivererreurs = True
     
    MsgBox "Erreurs désactivées pour colonne BY", vbInformation
     
    End Function
    voilà, ce n'est qu'un contournement mais c'est déjà ps mal

  18. #18
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 086
    Par défaut
    SAlut
    J'avoue ne pas avoir lu ton sujet depuis le début mais, pourquoi ne fait tu pas ta boucle ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For each Cellu In Selection
     
    Next
    De cette manière tu fera le traitement sur les cellule sélectionnées, qu'il y en ai une ou 100 Mais peut être ne suis je pas dans le coup.

    [Edit]Oui en effet j'avais pas tout lu et la réponse a ton problème t'a déjà été donnée, je n'avais pas vu que tu étais dans le OnChange du Worksheet.
    La variable Target (as range) représente la ou les cellules modifiées, donc si tu utilises une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For each cellul InTarget
    ... 
    Next
    Comme le dit Neupont,si ta modif ne concerne qu'une cellule alors la "boucle" ne s'exécutera qu'une fois, si par contre tu modifies 20 cellules d'un coup, la boucle s'exécutera 20 fois (une fois pour chaque cellule)
    [/Edit]
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2013, 17h26
  2. Réponses: 0
    Dernier message: 29/12/2010, 19h17
  3. [VBA-E] Sélection feuilles sous excel
    Par Mystic eyes dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2004, 13h27
  4. Sauvegarde problématique sous excel par OLE
    Par ulysse66x dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 16/04/2003, 21h23

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