Se connecter avec
S'enregistrer | Connectez-vous

Saisie guidée excel 2007

Dernière réponse : dans Programmation

Bonjour,
Je suis novice dans l'élaboration de macros sur excel 2007, et je ne m'en sors pas !
Je souhaiterai pouvoir établir une suite de commandes en VBA sur excel 2007 afin de guider la saisie de l'utilisateur. Je m'explique :
Dans une feuille de calcul, lorsque la 1ère cellule (Exemple C2) est saisie (une somme en €) puis validée, j'aimerai que la cellule suivante à saisir soit c3, puis après la saisie, que la la cellule suivante soit C4, puis la C7.Les renseignements sont différents à chaque saisie (poids, code postaux, etc...).

j'ai écrit cette petite séquence, mais elle ne fonctionne pas.
  1. Sub Suite_1()
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3. Range("C2").Select
  4. Private Sub Worksheet_Change(ByVal Target As Range)
  5. Range("C3").Select
  6. Private Sub Worksheet_Change(ByVal Target As Range)
  7. Range("C4").Select
  8. Private Sub Worksheet_Change(ByVal Target As Range)
  9. Range("C7").Select
  10. End Sub

Quelqu'un de confirmer est-il capable de m'aider.
Je remercie d'ors et déjà l'âme charitable qui saura prendre le temps de m'expliquer les raisons de mon échec.

Autres pages sur : saisie guidee excel 2007

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

:) 

Dans la définition de ta procédure Suite_1, tu définies des sous procédures Worksheet_Change, toutes du même nom. D'une part, il faudrait trouver des noms différents, d'autres part, VB ne permet pas de définir des sous-procédures. Donc Exit !

Je te propose deux solutions :

  • Utiliser les capacités d'Excel. Rien à voir avec la programmation. Mais je t'en parle quand même :)  Renseigne-toi sur le verrouillage des cellules et sur la protection de la feuille. Et oui, c'est comme ça qu'on fait.

  • Par programmation. La bonne solution est la précédente. Mais on peut tout faire par programmation. :sol: 

    1. Sub Worksheet_Change(ByVal Target As Range)
    2. If Target.Address(False, False) = "C2" Then Range("C3").Select
    3. If Target.Address(False, False) = "C3" Then Range("C4").Select
    4. If Target.Address(False, False) = "C4" Then Range("C7").Select
    5. End Sub


    Bon, j'insiste, ce n'est pas une jolie façon de faire.
    Expert Programmation

    Bonjour et bienvenu.

    Fais gaffe, le modérateur de cette partie du forum a beau être amiénois [:zeb], c'est un schizophrène qui va péter un câble :pt1cable:  si tu ne respectes pas le règlement : les bouts de programmes doivent être encadrés par les balises [code] [/code]. C'est comme ça.

    Bon ok ! Je reconnais que je n'y connais pas grand chose, mais j'essaie de faire les choses bien avec les moyens du bord... ...à savoir des moyens qui prennent l'eau !
    Plaisanterie mise à part, je suis un autodidacte. Et un autodidacte dans les prémices de l'apprentissage en matière de programmation. (Tu voies de que ça donne !)
    L'aide que je t'ai demandée servira (si j'y arrive...) à établir des devis. J'aurai souhaité pouvoir utiliser divers choix de paramètres, et en fonction de ces choix orienté le devis vers telle ou telle option...

    Qu'il est difficile de décrire ce que l'on souhaite faire précisément ! J'espère, en tout cas, que tu comprends ma démarche :??:  Parce que je ne sais pas si tout est clair.


    Pour en revenir à la séquence que tu as écrite, et comme je ne sais pas encore utiliser le verrouillage des cellules, je l'ai essayée (même si c'est pas jolie), mais elle ne fonctionne pas.
    Il faut à tout prix que je trouve pourquoi par moi-même. je cherche, et je te reviendrai si d'aventure je perdais mon latin !
    Merci pour tes éclaircissements, et encore bravo pour votre site. je ne manquerai pas de te revenir.
    Expert Programmation

    Je te rappelle que nous ne réalisons pas de prestation, mais nous nous entraidons entre développeurs. Et les programmeurs novices et/ou autodidactes sont les bienvenus.

    Précise donc ta demande et accompagne-la éventuellement d'un bout de code.

    Tiens étudie ça :
    1. Sub Worksheet_Change(ByVal Target As Range)
    2. MsgBox "La cellule nouvellement modifiée est " & Target.Address
    3. MsgBox "La cellule courante est " & Selection.Address
    4. Selection.Offset(2, 2)
    5. MsgBox "Plus maintenant :)"
    6. End Sub


    Et ça :
    1. Sub Worksheet_Change(ByVal Target As Range)
    2. If Target.Address = "$C$2" And Target.Value >= 10 Then
    3. MsgBox "Dix et plus : on va en C10"
    4. Range("C10").Select
    5. Else
    6. MsgBox "Moins de dix ! Recommence"
    7. Range("C2").Select
    8. End If
    9. End Sub


    Tu vois, avec des tests on va pouvoir faire des tas de choses :) 

    zeb a dit :
    Je te rappelle que nous ne réalisons pas de prestation, mais nous nous entraidons entre développeurs. Et les programmeurs novices et/ou autodidactes sont les bienvenus.

    Précise donc ta demande et accompagne-la éventuellement d'un bout de code.

    Tiens étudie ça :
    1. Sub Worksheet_Change(ByVal Target As Range)
    2. MsgBox "La cellule nouvellement modifiée est " & Target.Address
    3. MsgBox "La cellule courante est " & Selection.Address
    4. Selection.Offset(2, 2)
    5. MsgBox "Plus maintenant :)"
    6. End Sub


    Et ça :
    1. Sub Worksheet_Change(ByVal Target As Range)
    2. If Target.Address = "$C$2" And Target.Value >= 10 Then
    3. MsgBox "Dix et plus : on va en C10"
    4. Range("C10").Select
    5. Else
    6. MsgBox "Moins de dix ! Recommence"
    7. Range("C2").Select
    8. End If
    9. End Sub


    Tu vois, avec des tests on va pouvoir faire des tas de choses :) 



    Bonjour Zeb,
    Tu avais raison. La protection répond tout à fait à ce que j'attendais, et la programmation alourdit et complique vraiment la conception.
    alors merci bien pour tes conseils "zavisés" avec un "z" comme Zeb !

    Zeb,
    J'avance toujours sur mon projet, et je découvre un autre petit souci.
    Lorsque, sur la page 1 du classeur, je clique sur un des deux boutons auquel j'ai associé la macro suivante :

    1. Sub Export()
    2. Sheets("Paramètres Export").Select
    3. Range("C2:C4").Select
    4. Selection.ClearContents
    5. Range("C7:C9").Select
    6. Selection.ClearContents
    7. Range("C12").Select
    8. Selection.ClearContents
    9. Range("C14").Select
    10. Selection.ClearContents
    11. Range("C16").Select
    12. Selection.ClearContents
    13. Range("C18").Select
    14. Selection.ClearContents
    15. Rows("7:10").Select
    16. Selection.EntireRow.Hidden = True
    17. Rows("12").Select
    18. Selection.EntireRow.Hidden = True
    19. Rows("14").Select
    20. Selection.EntireRow.Hidden = True
    21. Rows("16").Select
    22. Selection.EntireRow.Hidden = True
    23. Rows("18").Select
    24. Selection.EntireRow.Hidden = True
    25. Range("C2").Select
    26. End Sub


    Il exécute correctement la macro, mais n'affiche plus l'un des quatre boutons de la page 2 qui sont eux-mêmes associés à d'autres macros.
    Pour les faire apparaitre, je dois saisir une valeur dans n'importe quelle cellule de la feuille 2 !
    Est-ce un problème de programmation ou de fantôme ?
    Pour information, voici les codes associés à chacun des quatre boutons :

    1. Sub Export_palettes()
    2. Rows("7:10").Select
    3. Selection.EntireRow.Hidden = False
    4. Range("C7").Select
    5. End Sub
    6.  
    7. Sub Export_volume()
    8. Rows("16").Select
    9. Selection.EntireRow.Hidden = False
    10. Range("C16").Select
    11. End Sub
    12.  
    13. Sub Export_au_mètre()
    14. Rows("12").Select
    15. Selection.EntireRow.Hidden = False
    16. Range("C12").Select
    17. End Sub
    18.  
    19. Sub Export_au_poids()
    20. Rows("14").Select
    21. Selection.EntireRow.Hidden = False
    22. Range("C14").Select
    23. End Sub


    Je suis relativement satisfait de ce que j'arrive à faire (pour un novice !), mais je n'ai pas encore ton esprit de programmeur averti et médaillé de bronze...
    ... ma médaille n'est encore qu'en chocolat !
    merci.
    Expert Programmation

    Up !

    Mon dieu, j'ai failli faire une attaque. Quel code horrible.
    Je ne supporte pas de voir un select suivi d'un Selection.
    C'est comme ça :
    http://www.presence-pc.com/forum/ppc/Programmation/sele...
    http://www.presence-pc.com/forum/ppc/Programmation/macr...
    http://www.presence-pc.com/forum/ppc/Programmation/sele...
    http://www.presence-pc.com/forum/ppc/Programmation/debu...
    http://www.presence-pc.com/forum/ppc/Programmation/supp...
    http://www.presence-pc.com/forum/ppc/Programmation/exis...
    http://www.presence-pc.com/forum/ppc/Programmation/aide...
    http://www.presence-pc.com/forum/ppc/Programmation/copi...
    http://www.presence-pc.com/forum/ppc/Programmation/reso...
    http://www.presence-pc.com/forum/ppc/Programmation/chem...
    http://www.presence-pc.com/forum/ppc/Programmation/macr...

    Bon alors, comme ça, c'est bien mieux :
    1. Sub Export()
    2. With Worksheets("Paramètres Export" )
    3. .Range("C2:C4" ).ClearContents
    4. .Range("C7:C9" ).ClearContents
    5. .Range("C12" ).ClearContents
    6. .Range("C14" ).ClearContents
    7. .Range("C16" ).ClearContents
    8. .Range("C18" ).ClearContents
    9. .Rows("7:10" ).EntireRow.Hidden = True
    10. .Rows("12" ).EntireRow.Hidden = True
    11. .Rows("14" ).EntireRow.Hidden = True
    12. .Rows("16" ).EntireRow.Hidden = True
    13. .Rows("18" ).EntireRow.Hidden = True
    14. End With
    15. End Sub
    16.  
    17. Sub Export_palettes()
    18. Rows("7:10" ).EntireRow.Hidden = False
    19. Range("C7" ).Select
    20. End Sub
    21.  
    22. Sub Export_volume()
    23. Rows("16" ).EntireRow.Hidden = False
    24. Range("C16" ).Select
    25. End Sub
    26.  
    27. Sub Export_au_mètre()
    28. Rows("12" ).EntireRow.Hidden = False
    29. Range("C12" ).Select
    30. End Sub
    31.  
    32. Sub Export_au_poids()
    33. Rows("14" ).EntireRow.Hidden = False
    34. Range("C14" ).Select
    35. End Sub


    Bon, je vois maintenant que tu caches pleins de lignes. Si tes boutons sont sur ces lignes, ils auront effectivement tendance à se planquer.
    Fais des essais en fonction de la position de tes boutons et détermine l'endroit le plus adéquat pour les y placer.

    Bonjour Zeb,
    Tu as raison : j'affiche toute l'étendue de ma méconnaissance du VBA, et de l'informatique en général !
    Néanmoins, je suis motivé et je n'ai pas l'intention de renoncer... ...alors je m'accroche au branches !

    J'ai corrigé mon code avec les indications que tu m'as données : (plus de sélect + sélection !!!) Il est certain que tout va plus vite, la réaction est plus rapide.
    Aussi, pour que le curseur se place en C2 sur la feuille "Paramètre export", j'ai ecrit une petite suite au code :
    1. Sheets("paramètres Export").Select
    2. Range("c2").Select

    Ma question est : y a t-il possibilité de réduire cette écriture ?

    Par ailleurs, mes boutons se cache toujours... ...J'ai tenté de les changer de place, et rien n'y fait. C'est même chiant à force !
    pour répondre à ta question : il n'y a pas de ligne cachées, à la place des lignes vides dans le code que je t'ai posté précédemment, il y a des lignes grisées dans le code de la macro. C'est moi qui ai passé des lignes afin que ce soit plus clair et pour matérialiser ces fameuses lignes continues et grisées.
    En tout cas, merci pour ton aide. Je progresse lentement, grâce à tes corrections.
    Expert Programmation

    Oh, nous ne nous sommes pas compris.
    Les lignes cachées sont les lignes de ta feuille de calcul, pas ceux de ton code !

    As-tu besoin de sélectionner (rendre actif et mettre au premier plan) ta feuille et ta cellule ?
    Si oui, laisse ce code.
    Si non, et bien sache que Excel sait travailler sur la feuille 12 tout en affichant la feuille 1. Et heureusement.

    Juste un tout petit détail minuscule. Sheets est la collection de toutes les feuilles, celles de calcul (Worksheets) et celles de graphisme (Charts). Tu peux donc, par soucis d'exactitude, utiliser la collection Worksheets.

    Maintenant un gros détail que j'ai raté :
    Range() c'est une plage de cellules désignée par le paramètre.
    Range().EntireRow c'est la ou les lignes entières concernées par la plage de cellules.
    Rows() c'est la ou les lignes entières désignées.

    Donc l'écriture Rows(n).EntireRow est inutile.

    Ca donne donc :
    1. Sub Export()
    2. With Worksheets("Paramètres Export" )
    3. .Range("C2:C4" ).ClearContents
    4. .Range("C7:C9" ).ClearContents
    5. .Range("C12" ).ClearContents
    6. .Range("C14" ).ClearContents
    7. .Range("C16" ).ClearContents
    8. .Range("C18" ).ClearContents
    9. .Rows("7:10" ).Hidden = True
    10. .Rows("12" ).Hidden = True
    11. .Rows("14" ).Hidden = True
    12. .Rows("16" ).Hidden = True
    13. .Rows("18" ).Hidden = True
    14. End With
    15. End Sub


    Quant à tes boutons qui disparaissent, je ne comprends pas où est ton problème :??: 

    J'ai l'impression que tu parles d'acné juvénile, lorsque que tu énonces la disparition de mes boutons...!!!
    Effectivement, j'ai besoin de rendre la saisie possible en c2 de la feuille 2.
    Merci pour tes précisions, et il me semblait bien avoir intégré la subtilité d'excel travaillant sur une page alors qu'elle n'est pas au premier plan. Je l'ai comprise au moment ou j'ai intégré tes corrections sur le code car la macro fonctionnait alors que je restait sur la première feuille.
    Le plan de mon classeur est le suivant :
    feuille 1 : présentation et choix : 2 boutons (import et export)
    feuille 2 : paramètres export : 3 cellules à renseigner + choix de 4 types de calcul (les 4 boutons qui disparaissent) : /palettes, /m, /volume, /poids.
    à chaque choix, je souhaite qu'apparaissent d'autres choix.
    ex :
    si choix /palette
    apparition de plusieurs dimensions de palettes et avoir la possibilité de panachage entre plusieurs type différents.
    Toutes les autres feuilles, concerne des calculs, et des renseignements divers que la feuille de calcul va rechercher pour donner le devis.
    Voilà, tu sais presque tout...
    Peut-être as-tu des suggestions ?

    Dis-moi s'il te plait...
    ... est-il possible de pouvoir éditer un devis en word à envoyer au client, avec les renseignements fournis dans le tableur excel, une fois les choix effectués ?
    Si oui, est-il possible par la validation sur un bouton par exemple de l'éditer de manière automatique selon une trame prédéfini ?

    Le souci avec l'informatique, c'est que les possibilités sont immenses, est d'un petit projet, qui ne prendrait que quelques jours, on en rajoute, on en rajoute, on en rajoute... et finalement : ça prend plus de temps que prévu car on veut fignoler, peaufiner.
    merci encore une fois pour le temps que tu consacres.
    Expert Programmation

    >>J'ai l'impression que tu parles d'acné juvénile, lorsque que tu énonces la disparition de mes boutons...!!!
    :lol: 

    Concernant l'interopérabilité entre Excel et Word, c'est possible, et c'est même assez facile. Reste à savoir ce que tu veux faire. Deux clefs : Automation (en VB, côté Excel et/ou Word) ou Mailing (côté Word).

    Tu veux qu'on en discute, fais donc un nouveau topic ;) 
    Lassé par la pub ? Créez un compte