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 :

Code d'attente dans macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut Code d'attente dans macro
    Bonjour,

    Le code ci-dessous à pour but de contrôler pour la dernière ligne utilisée par la personne que la colonne 12 (L) est bien renseignée (la personne doit faire un choix dans une liste déroulante).
    Une fois ce contrôle effectué, la macro "Majuscule" est lancée et ensuite une feuille "Saisie" est ouverte.
    Le souci que j'ai est le suivant: l'absence de texte en colonne 12 (L) est bien détecté, mais la macro "Majuscule" et l'ouverture de la feuille "Saisie" se font sans attendre le remplissage de la cellule colonne 12 (L)....
    Quel code puis-je utiliser pour éviter cela ? (débutant en VBA, merci de me répondre avec détails !)
    Lenul

    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    If Not Application.Intersect(Target, Range("m12")) Is Nothing Then
        Application.ScreenUpdating = False
        Select Case Target.Column
        Case 13
        If Target.Offset(, -1).Value = Empty Then
        Application.EnableEvents = False
        MsgBox " Une saisie obligatoire n'a pas été respectée !"
        Target.Value = Empty
        Target.Offset(, -1).Select
    End If
     
    'Quel code doit figurer "ici" pour attendre la saisie obligatoire
    'dans la colonne 12
     
        Majuscule
        Range("a11").Select
        Sheets("Saisie").Visible = True
        Sheets("Saisie").Select
        Application.ScreenUpdating = True
    End Select
    End If
    End Sub

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour,

    Tu peux ajouter une condition de sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       If Target.Offset(, -1).Value = Empty Then
        Application.EnableEvents = False
        MsgBox " Une saisie obligatoire n'a pas été respectée !"
        Target.Value = Empty
        Target.Offset(, -1).Select
    EXIT SUB
    End If

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut Sans effet
    bonjour aalex,

    merci de ton aide, mais "exit sub" après "end if" est sans effet...

  4. #4
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Re,


    Un exemple à adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count <> 1 Then: Exit Sub
    If Target.Column <> 13 Then: Exit Sub
    If Cells(Target.Row, 12) = Empty Then
        MsgBox "La ligne " & Target.Row & " de la colonne L est vide!"
        Cells(Target.Row, 12).Select
        Exit Sub
    End If
     
    MsgBox "majuscule"
    End Sub

  5. #5
    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 lenul78570 et le forum
    J'ai quelques problèmes à concilier descriptif et code fourni.
    1 - Tu utilises Worksheet_SelectionChange : La macro se lance quand tu changes de sélection => je suis pas pour mais chacun son truc.
    2 - If Not Application.Intersect(Target, Range("m12")) Is Nothing Then
    Tout dépend de ce que tu cherches à faire réellement : si tu sélectionnes la plage A1:O20, le If répondra par une condition VRAI, puisque target contient toutes les cellules sélectionnées et intersect renvoie dans ce cas M12. Or tu parles de la colonne "L", donc, ce n'est pas intersect avec une cellule, mais avec la colonne "M" qui devrait servir de déclencheur.
    Et il ne faudrait tester que les cellules sélectionnées appartenant à "M".
    3 - Pour en revenir à la question, il est impossible de mettre une exécution de macro en attente de remplissage d'une plage. On peut utiliser une boîte de dialogue demandant une réponse (regarde l'aide pour InputBox)
    Par contre, on peut utiliser une macro Worksheet_Change. Elle se déclenche quand on modifie (Réellement, quand on sort d'une cellule passée en mode édition) une ou plusieurs cellules.
    Il serait vraisemblablement plus profitable d'expliquer réellement ton but. Et ce que fait la macro Majuscule.

    Une idée de macro
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Err_Worksheet_Change
    Dim Cel As Range, Plage As Range
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    'Bloquer la gestion des évènements
    Set Plage = Intersect(Target, Range([L1], Cells(Rows.Count, "L").End(xlUp)))
    'plage = cellules appartenant à la colonne L ayant été modifiées
    If Plage Is Nothing Then GoTo Sortie_Worksheet_Change
    'si plage est vide, aller à la sortie
    For Each Cel In Plage
    'Pour chaque cellules modiifées de L
        If IsEmpty(Cel) Then
            Cel.Offset(0, 1).ClearContents
            'Effacer la cellule à sa droite
        Else 'cel n'est pas vide
            If IsEmpty(Cel.Offset(0, 1)) Then Cel.ClearContents
            'si la cellule M est vide alors, effacer L
            MsgBox "remplir d'abord la cellule en " & Cel.Offset(0, 1).Address
        End If
    Next Cel
    'Cellule suivante
    Sortie_Worksheet_Change:
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Exit Sub
    Err_Worksheet_Change:
        MsgBox Err.Description, vbCritical + vbOKOnly, "Erreur n°" & Err.Number
        Resume Sortie_Worksheet_Change
    End Sub
    Pour toute cellule modifiée de L, on regarde si elle est vide on efface M et si M est vide, on efface L.
    Par contre comme on va modifier la colonne qui déclenche la macro, on verrouille la gestion des évènements. Comme celle-ci est de portée Excel, je gère les erreurs, de sorte qu'on finisse la macro en remettant en route la gestion des évènements obligatoirement.

    Mais si tu as une macro (majuscule) qui se lance dans la boucle, il lui faudra aussi une gestion d'erreur, qui elle remettra en route la gestion des évènement avant d'arrêter les macros, ou qui finira la macro.

    Je suis assez tatillon et je part du principe que quelque soit l'erreur de l'utilisateur, le code doit la gérer et ne jamais donner la main avec le message d'erreur Excel qui permet d'accéder au code : si on veut accéder au code ce doit être de manière volontaire.
    A+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut Pour Aalex et Gorfael....
    Aalex:
    Désolé avec ta proposition, quand je quitte la cellule de la dernière ligne utilisée il ne se passe rien.....
    Gorfael:
    Voici la présentation en détails:
    Dans ce classeur il y a 2 feuilles : Prospects et Saisie, à l'ouverture du classeur la feuille Saisie est masquée.
    Sur la feuille Prospects la plage de cellules A1:M10 est utilisée pour la présentation, les cellules A11, B11 jusqu'à M11 indiquent le titre de ce qui doit figurer dans ces colonnes (Nom, Adresse......etc, la première ligne qui peut être renseignée par l'utilisateur est la ligne 12.
    L'information qui doit apparaître colonne L est INDISPENSABLE (l'utilisateur doit faire un choix dans une liste déroulante, c'est du texte).
    Pour valider sa saisie l'utilisateur doit sélectionner la cellule M de la ligne qu'il vient de créer.
    Je veux que lorsque l'utilisateur quitte la cellule L, cette macro contrôle que la cellule L de la dernière ligne soit bien renseignée.
    Si OUI, la macro "Majuscule" est lancée (elle force les majuscules sur certaines cellules), ensuite la feuille saisie est rendue visible, fin de macro.
    Si NON, la macro doit inviter l'utilisateur à renseigner la cellule L de la dernière ligne et tant que cette opération n'est pas exécutée, la macro ne doit pas progresser.
    J'espère que j'ai été assez claire....
    A bientôt de vous lire
    Lenul

  7. #7
    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 lenul78570 et le forum
    Ce que j'en comprends :
    si tu modifies une cellule (hormis L) et que L n'est pas renseignée, on doit inviter à renseigner L (effacer la saisie ? et sélectionner L)
    si tu modifies L, on doit lancer la macro "majuscule", rendre visible la feuille "Saisie" (et peut-être l'activer ?).
    Et tout ça à partir de la ligne 12, (la 11 servant de titres des colonnes)
    Pour moi, ce devrait être une macro automatique Change, pas SelectionChange. 2 possibilité : WorkSheet_Change ou WorkBook_SheetChange (sur le module ThisWorkBook). La première ne tolérant pas l'activation d'une autre feuille.
    A+

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut
    re
    Ce sont les cellules A,B,C,D,F,I et L
    le contrôle de la saisie pour A,B,C,D,F et I se fait avec le code suivant:

    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
    36
    37
    38
    39
    40
    41
    42
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'Contrôle de saisie dans les cellules rouges
    If Target.Count > 1 Then Exit Sub
    If Target.Row > 11 And Target.Row < 2013 Then
    Select Case Target.Column
    Case 1
    Target.Offset(0, 1).Select
    Case 2, 3, 4
    If Target.Offset(, -1).Value = Empty Then
    Application.EnableEvents = False
    MsgBox " Une saisie obligatoire n'a pas été respectée !"
    Target.Value = Empty
    Target.Offset(, -1).Select
    Application.EnableEvents = True
    End If
    Case 6
    If Target.Offset(, -2).Value = Empty Then
    Application.EnableEvents = False
    MsgBox " Une saisie obligatoire n'a pas été respectée !"
    Target.Value = Empty
    Target.Offset(, -2).Select
    Application.EnableEvents = True
    End If
    Case 9
    If Target.Offset(, -3).Value = Empty Then
    Application.EnableEvents = False
    MsgBox " Une saisie obligatoire n'a pas été respectée !"
    Target.Value = Empty
    Target.Offset(, -3).Select
    Application.EnableEvents = True
    End If
    Case 12
    If Target.Offset(, -3).Value = Empty Then
    Application.EnableEvents = False
    MsgBox " Une saisie obligatoire n'a pas été respectée !"
    Target.Value = Empty
    Target.Offset(, -3).Select
    Application.EnableEvents = True
    End If
    End Select
    End If
    End Sub
    J'utilise la fonction de quitter L en obligeant l'utilisateur à sélectionner M. En cliquant sur M la macro doit vérifier le remplissage de L, lancer la macro "Majuscule", rendre la fauille "SAisie" visible et effectivement l'activée.
    Oui tout cela ce passe à partir de la ligne 12.
    Merci de ton aide
    Lenul

Discussions similaires

  1. [XL-2010] Pblm code sur fichier dans macro VBA
    Par Anna_2013 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2013, 00h53
  2. [XL-2007] problème dans du code en VBA dans une macro
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/12/2010, 18h05
  3. [Macro Access] pb dans mon code pour lancer une macro Access
    Par Commodore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2007, 10h51
  4. code du boutton fermer dans macro
    Par torNAdE dans le forum Access
    Réponses: 1
    Dernier message: 17/07/2006, 17h13

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