Partage
  • Partager sur Facebook
  • Partager sur Twitter

VBA conditions indépendantes plages différentes

et msgbox intempestifs

Sujet résolu
    26 juillet 2018 à 11:52:48

    Bonjour,

    ça fait plusieurs jours que je me bats avec mon fichier excel. j'ai une condition qui se réalise et l'autre non et des msgbox intempestifs.

    Information:

    Sur une feuille (n°4), j'ai créer un tableau allant de A:AF contenant des mises en forme conditionnelle et des validations de données. Ce tableau est la source de mes 13 TCD.

    contexte:

    Je veux qu'une condition "Ajouter une ligne à mon tableau lorsque le texte est sélectionner" se mette en place pour la colonne A et lorsque j'arrive à ma colonne AF, une nouvelle condition se réalise "une fois que j'ai fini de remplir ma cellule en AF, me demander si j'ai fini. si oui, verrouiller les cellules remplies de la feuille. si non, rester sur la feuille".

    Pour la colonne A: j'ai des lignes qui s'ajoutent indéfiniment. Du coup, j'ai mis un msgbox demandant si on veut ajouter des lignes. ça m'a permis de contrôler l'ajout de ligne mais maintenant je me retrouve avec le msgbox à chaque cellule. ce qui rend la saisie pénible.

    Pour la colonne AF: j'ai le même souci avec le msgbox lorsqu'il fonctionne.

    Pouvez-vous m'aider et vérifier mon code svp?

    
    ' AjoutLigne Macro
    
     Sub Worksheet_Change(ByVal Target As Range)
    
    If Range("A1").End(xlDown) = "GALIEN" Or Range("A1").End(xlDown) = "ROUX" Then
    
        Response = MsgBox("Voulez-vous ajouter une ligne?", vbYesNo + vbQuestion, "Nouvelle ligne")
    
        If Response = vbNo Then
    
        Exit Sub
    
    Else
    
        Sheets("RAW DATA").Select
    
        Sheets("RAW DATA").Range("A1").End(xlDown).Select
    
        Sheets("RAW DATA").Unprotect
    
        Selection.ListObject.ListRows.Add AlwaysInsert:=True
    
        Sheets("RAW DATA").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
    
            , AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
    
    End If
    
    End If
    
    End Sub
    
    
    
    ' Verrouillage Macro
    
     Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        If Range("AF1").End(xlDown) <> "BonneJournée" Then
    
        Reponse = MsgBox("Avez-vous terminé TOUTES vos saisies dans RAW DATA?", vbYesNo + vbQuestion, "Verrouillage")
    
    If Reponse = vbNo Then
    
        Exit Sub
    
    Else
    
        Sheets("RAW DATA").Unprotect
    
        ActiveWorkbook.RefreshAll
    
        Sheets("RAW DATA").Range("Données").Select
    
        Selection.SpecialCells(xlCellTypeConstants, 23).Select
    
        Selection.Locked = True
    
        Selection.FormulaHidden = True
    
        ActiveWorkbook.RefreshAll
    
        Sheets("RAW DATA").Range("A1").End(xlDown).Select
    
        Sheets("RAW DATA").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
    
            , AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
    
        Range("A1").End(xlDown).Select
    
        End If
    
    End If
    
    End Sub
    
    

    merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2018 à 14:09:40

      Salut,

      Si j'ai bien compris tu veux insérer des lignes pour garder toutes les mises en forme, validation et source de TCD ?

      Sinon la macro a l'air de faire exactement ce que tu veux faire donc ça va être à toi de repenser comment tu veux que ta macro fonctionne.

      Quelques idées possibles suivant comment tu travailles :

      - ajouter une ligne si il y a un certain mot-clé en A(n+1), par exemple si tu viens de remplir la ligne 7 mais tu veux encore en mettre une, tu écris "AJOUTER" en A8 et la macro va supprimer le contenu de A8 et insérer une ligne qui se retrouvera en ligne 8, pareil pour la protection, en mettant un truc en AGn

      - séparer la macro en deux et assigner des raccourcis à chacune, c'est plus rapide mais ça fait des raccourcis à apprendre et il faut en trouver qui ne sont pas utilisés d'habitude (par exemple prendre ctrl-c et ctrl-v serait une mauvaise idée)

      - demander de lignes à ajouter dès le début si tu sais

      Sinon pour faire un commetaire sur le code, tu utilises trop de .Select et Selection, ça prend un peu plus de temps et ça peut être changé par un utilisateur. Tu peux faire les opérations que tu fais sur Selection directement sur la Range que tu viens de sélectionner, par exemple :

      ' Ton code
       
          Sheets("RAW DATA").Range("Données").Select
        
          Selection.SpecialCells(xlCellTypeConstants, 23).Select
        
          Selection.Locked = True
          Selection.Protect 'params
      
      ' Devient
       
          Dim dataRange as Range
          Set dataRange = Sheets("RAW DATA").Range("Données").SpecialCells(xlCellTypeConstants, 23) ' on met la Range dans une variable
          dataRange.Locked = true
          dataRange.Protect 'params
       
      ' Ou alors encore mieux si tu ne te sers de cette Range nul part ailleurs, tu peux utiliser With
       
          With heets("RAW DATA").Range("Données").SpecialCells(xlCellTypeConstants, 23)
              .Locked = True
              .Protect 'params
          End With



      -
      Edité par Stormweaker 26 juillet 2018 à 14:11:38

      • Partager sur Facebook
      • Partager sur Twitter
        26 juillet 2018 à 14:47:25

        Bonjour,

        Merci pour cette réponse rapide. En fait, c'est ma première macroXL. Je l'ai créé en enregistrant et en agrémentant avec ce que je trouvais sur les forums, du coup, je ne sais pas faire autrement que Select et Selection :D.

        -Pour répondre à ta première question: La validation de données est sur toutes les colonnes A, C, D, F de la feuille XL. La mise en forme conditionnelle est sur le tableau nommé "Données": mettre les cellules en vert lorsque c'est rempli et mettre les erreurs volontaires (=NA()) en vert rayé. En dehors du tableau "données", toutes les cellules sont verrouillées. Du coup, comme tout est verrouillé, je veux qu'il insère automatiquement une ligne à la fin de mon tableau "Données" lorsque, je sélectionne "GALIEN" ou "ROUX".

        -Tout doit être verrouillé et pratiquement automatisé car par la suite, ça ne sera pas moi qui utilisera ce XL donc je préfère éviter les raccourcis.

        Lorsque je mets la première procédure dans un module, ça fonctionne mais lorsque je l'insère dans "microsoft excel object" avec "worksheet_change", il bug en me rajoutant une infinité de ligne.

        J'ai même testé ce code qui ne marche pas car j'ai toujours l'ajout infini car erreur:

        Dim Ligne As Long
        ' derniere ligne remplie de la colonne A
        Ligne = ActiveSheet.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
        ' boucle depuis la dernière ligne remplie jusqu'à la 1
        For n = Ligne To 1 Step -1  ' si necessaire de s'arrêter avant la ligne 1 changer To 1
        ' si cellule en A vide
        If Range("A" & n).Value <> "" Then
        ' alors insertion à la ligne suivante
        Rows(n + 1 & ":" & n + 1).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        End If
        Next
        End Sub
        
        • Le range, je le réutilise dans d'autre module.

        merci pour ton code. je vais le tester.

        -
        Edité par OliveeeRr 26 juillet 2018 à 14:52:02

        • Partager sur Facebook
        • Partager sur Twitter
          26 juillet 2018 à 17:42:12

          >Je l'ai créé en enregistrant et en agrémentant avec ce que je trouvais sur les forums

          Je pense qu'on a tous commencé comme ça ^^.

          Pourquoi la feuille destinée à recevoir des données entrées par l'utilisateur a des cellules vérouillées ? Sinon tu pourrais simplement faire juste une macro de validation.

          > lorsque je l'insère dans "microsoft excel object"

          Qu'est-ce que c'est ?

          Pour trouver la dernière ligne remplie de la colonne A il vaut mieux utiliser :

          Ligne = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row


          Ton code est vraiment infini ou juste très long à l'exécution ? Juste en regardant je vois rien qui l'empécherait de s'arrêter, par contre insérer une ligne à chaque cellule An non vide ça risque de prendre du temps à partir de quelques centaines de lignes.

          • Partager sur Facebook
          • Partager sur Twitter
            26 juillet 2018 à 18:01:34

            Stormweaker a écrit: >

            c'est quoi une macro de validation?

            en fait, j'ai verrouillé pour éviter qu'il ne se passe des événements non contrôlés/désirés. comme je n'utiliserai plus ce XL, je ne saurai pas si qqn l'a mal utilisé ou à supprimer des choses qu'il ne devrait pas donc je préfère tout restreindre tout en facilitant son utilisation.

            Stormweaker a écrit: >

            pour la dernière ligne, je ne veux pas la trouver, je veux qu'elle soit sélectionnée pour éviter de devoir dérouler toute la feuille RAW DATA et insérer ma ligne.

            Stormweaker a écrit: >

            le microsoft excel objet se trouve à gauche en dessous du titre "VBAproject" .

            une fois que j'exécute la macro ajout de ligne après avoir modifier la feuille, j'ai une multitude de ligne qui se créent. ça m'informe qu'il y a une erreur et après mon excel plante et redémarre.

            • Partager sur Facebook
            • Partager sur Twitter
              26 juillet 2018 à 18:34:09

              >c'est quoi une macro de validation?

              Une macro que tu écris pour valider que les données soient conformes à ce que tu attends, donc ça peut vérifier que des nombres soient rentrés, créer les mises en formes conditionnelles et les outils de validation de données déjà inclus dans Excel, etc...

              >j'ai verrouillé pour éviter qu'il ne se passe des événements non contrôlés/désirés

              Il me semble que le vérouillage empêche seulement qu'un utilisateur fasse une modification, mais comme tu veux qu'il modifie des trucs, autant lui donner une feuille entière, par exemple la feuille RAW DATA, à priori c'est l'utilisateur qui met ses trucs dedans sans se psoer de questions, par contre les autres feuilles qui donnent des résultats ou les TCD, eux tu peux les vérouiller.

              Si j'ai bien compris tu vérouilles tout sauf la plage "Données" de la feuille "RAW DATA", si il n'y a rien à protéger dans cette feuille ça n'a pas vraiment de sens de la vérouiller, et si il y a des trucs à vérouiller il vaut mieux les mettres autre part.

              >pour la dernière ligne, je ne veux pas la trouver, je veux qu'elle soit sélectionnée

              C'est pas ce que le code que tu m'as montré fait alors, ni ce que dit le commentaire juste au dessus de la ligne.

              >le microsoft excel objet se trouve à gauche en dessous du titre "VBAproject"

              Ah oui ok, tu as bien mis ta Sub Worksheet_Change dans la feuille "RAW DATA" de ce dossier du coup ?

              >ça m'informe qu'il y a une erreur

              Quelle est l'erreur ?

              -
              Edité par Stormweaker 26 juillet 2018 à 18:36:30

              • Partager sur Facebook
              • Partager sur Twitter
                27 juillet 2018 à 10:09:44

                Bonjour, Justement en rajoutant une ligne à mon tableau "données", il a la possibilité de faire des changements sur les cellules vides et non modifier les cellules pleines. Si je ne verrouille pas les cellules et qu'il écrit qlqs part d'autre, avec le verrouillage des cellules pleines, il risquerait de ne pas pouvoir supprimer cette donnée saisie. Je suis également obligée de verrouiller les cellules de la feuille de raw data car cette feuille permet d'enregistrer toutes les analyses qui ont été faites depuis des années et les nouvelles. donc ça ne peut pas être une feuille libre d'accès.

                pour la dernière cellule remplie: le code que j'ai mis me sélectionne la dernière cellule pleine de la colonne A.

                oui j'ai inséré ces procédures de Sub Worksheet_Change dans la feuille "RAW DATA"

                l'erreur, il me semble que c'était 1004.

                • Partager sur Facebook
                • Partager sur Twitter
                  27 juillet 2018 à 11:06:48

                  >cette feuille permet d'enregistrer toutes les analyses qui ont été faites depuis des années et les nouvelles

                  Dans ce cas pourquoi ne pas créer une feuille "nouvelles données", non vérouillée, qui permet à l'utilisateur de rentrer les nouvelles données, et ensuite ta macro s'occupera de les mettre dans la feuille RAW DATA ?

                  >pour la dernière cellule remplie: le code que j'ai mis me sélectionne la dernière cellule pleine de la colonne A.

                  Je suis pas sûr qu'on parle du même code, ma remarque était pour celui-ci :

                  ' derniere ligne remplie de la colonne A
                  Ligne = ActiveSheet.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

                  Pour moi ce bout de code récupère le numéro de la dernière ligne non vide de la colonne A.

                  >l'erreur, il me semble que c'était 1004.

                  Tu peux me donner le message d'erreur complet et l'endroit qui est surligné quand tu cliques sur "Débogage" dans le message d'erreur ?

                  -
                  Edité par Stormweaker 27 juillet 2018 à 11:09:49

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 juillet 2018 à 14:19:25

                    En fait, j'ai bien peur que créer une autre macro pour rawdata me complique la tache vu que je ne maîtrise pas les macro :s

                    Après une aide, j'ai reformulé ainsi mais ma ligne ne s'ajoute pas et ma colonne AF n'affiche pas le msgbox :(

                    'AjoutLigne Macro
                    Sub Worksheet_Change(ByVal Target As Range)
                    Dim dataRange As Range
                    If ActiveCell.Column = 1 Then
                        Response = MsgBox("Voulez-vous ajouter une ligne?", vbYesNo + vbQuestion, "Nouvelle ligne")
                        If Response = vbNo Then
                        Exit Sub
                        If Response = vbYes Then
                        Sheets("RAW DATA").Select
                        Sheets("RAW DATA").Range("A1").End(xlDown).Select
                        Sheets("RAW DATA").Unprotect
                        Selection.ListObject.ListRows.Add AlwaysInsert:=True
                        Sheets("RAW DATA").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
                            
                    'Verrouillage Macro
                    ElseIf ActiveCell.Column = 32 Then
                        Reponse = MsgBox("Avez-vous terminé TOUTES vos saisies dans RAW DATA?", vbYesNo + vbQuestion, "Verrouillage")
                        If Reponse = vbNo Then
                        Exit Sub
                        If Reponse = vbYes Then
                        Sheets("Feuille de calcul").Unprotect
                        Sheets("RAW DATA").Unprotect
                        Sheets("Valeur m±Umj").Unprotect
                        Sheets("Valeur max min").Unprotect
                        Sheets("Ecart Vm-Va").Unprotect
                        Sheets("Stabilité").Unprotect
                        Sheets("Homogénéité").Unprotect
                        Sheets("Capabilité").Unprotect
                        Sheets("Test stress T et HR").Unprotect
                        Sheets("Test stress durée").Unprotect
                        Sheets("VmE & VmIV").Unprotect
                        Sheets("Ecart VmE-VmIV").Unprotect
                        Sheets("%IVTracer").Unprotect
                        Sheets("Récapitulatif").Unprotect
                        ActiveWorkbook.RefreshAll
                        Set dataRange = Sheets("RAW DATA").Range("Données").SpecialCells(xlCellTypeConstants, 23)
                        dataRange.Locked = True
                        dataRange.FormulaHidden = True
                        Sheets("Récapitulatif").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
                            :=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables _
                            :=True
                        Sheets("%IVTracer").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowInsertingRows:=True, AllowDeletingRows:= _
                            True, AllowUsingPivotTables:=True
                        Sheets("Ecart VmE-VmIV").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("VmE & VmIV").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Test stress durée").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Test stress T et HR").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Capabilité").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Homogénéité").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Stabilité").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Ecart Vm-Va").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Valeur max min").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("Feuille de calcul").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowUsingPivotTables:=True
                        Sheets("Valeur m±Umj").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowUsingPivotTables:=True
                        Sheets("RAW DATA").Range("A1").End(xlDown).Select
                     
                        End If
                    End If
                    End If
                    End If
                    End If
                    End Sub
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juillet 2018 à 14:40:22

                      Tes End If sont mal placés, tout ton code est dans le bloc if Response =vbNo. Indente ton code pour voir ce type d'erreur (à la main ou avec http://www.vbindent.com/ par exemple).

                      Sinon je ne vois pas ce que ça changera, ça te demandera toujours si tu veux ajouter une ligne ou verrouiller la feuille à chaque fois que tu seras en colonne A ou AF, comme ton premier code.

                      Pourquoi déverouiller des feuilles dont tu ne te sers pas ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 juillet 2018 à 14:46:27

                        Je dois les déverrouiller pour mettre à jour tous mes TCD qui ont pour source RAW DATA sinon la mise à jour ne se fait pas.

                        merci pour le indente. je vais voir comment le faire à la main..

                        oui c'est bien ce que je veux que mes messages box fassent lorsque je suis en colonne A ou AF mais pas apparaître entre.

                        -
                        Edité par OliveeeRr 27 juillet 2018 à 14:52:23

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 juillet 2018 à 16:59:28

                          Dans ce cas il faut que tu trouves comment savoir quand l'utilisateur a fini d'entrer les données.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 juillet 2018 à 19:55:32

                            en fait, c'est bon. J'ai décidé de verrouiller à la fermeture du excel ce qui me permet d'enlever les messages box. Pour l'ajout de ligne, j'ai mis avec la sub double clic merci de m'avoir accordé de ton temps :) bonne soirée

                            • Partager sur Facebook
                            • Partager sur Twitter

                            VBA conditions indépendantes plages différentes

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown