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 :

Select ou Activate (bis)


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    technicien télévision retraité
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien télévision retraité

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut Select ou Activate (bis)
    Bonjour,

    J'ai écrit une macro qui permet de formater des données brutes qui alimentent, sur une autre feuille, 4 tableaux croisés dynamiques. Ceci se répète trois fois dans le classeur : une feuille de données suivie d'une feuille de tabeaux, ect.

    À la fin de la macro, avant de redonner le contrôle à l'utilisateur, je désire ramener la sélection à A2 dans chacune des 6 feuilles question d'uniformiser la vue. J'ai donc écrit ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' Remise de la sélection à "A1" pour toutes les feuilles
    On Error Resume Next
     
    For Feuille = 1 To Worksheets.Count    
        Sheets(Feuille).Select
        Range("A2").Select
    Next Feuille
    Puis, je me suis posé la question : Select ou Activate ?

    J'ai essayé les deux et je n'ai pas vu de différence évidente. J'ai donc refilé la question à notre ami Google et je suis arrivé ici sur une discussion daté de 2005.

    En gros, on disait que la question n'a plus vraiment d'importance vu que ces deux commandes (méthodes ?) sont de moins en moins employées presque, si j'ai bien compris, passées en désuétude. Et, on me suggère plutôt ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim f As Worksheet
     
      For Each f In ThisWorkbook.Worksheets
        f.Activate
        f.Range("A1").Activate
      Next
    Je comprends qu'utiliser un boucle est plus « moderne » que la bonne vieille boucle mais c'est la double présence de la méthode Activate qui m'étonne. Après qu'on m'ait dit qu'elle était en voie de dispartition. Voici la phrase exacte :
    Envoyé par alsimbad
    sans oublier bien sur que ces deux outils sont quasiment inutiles a une ou deux exceptions près.
    Je suis probablement un exemple parfait d'une de ces deux exceptions...

    Pour revenir à la bouche For Each, je l'emploi souvent. Chaque fois que je pense que le code sera plus compact et efficace. Mais dans le cas que je vous présente au début, c'était pas mal kif kif.

    Du moins, je le crois. Est-ce que je me trompe ? Je suis un vieux qui a appris le basic au début des années 80. J'ai travaillé fort, plus tard, pour passer de Wordbasic à VBA. Je suis ici pour apprendre.

    Pierre


    ---

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour

    comme ca a la volée
    histoire de ne pas voir les pages défiler tu pourrais faire comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub select_a2()
    Application.ScreenUpdating = False
    For Each feuille In ThisWorkbook.Worksheets
    feuille.Activate
    [A2].Select
    Next
    'ici on revient a la page ou tu veux revenir
    Sheets(" nom de la feuille sur la quelle tu veux revenir").Activate
    [A2].Select
     
    End Sub
    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir,

    histoire de n'utiliser ni Select ni Activate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Application.ScreenUpdating = False
    For Feuille = 1 To Worksheets.Count
        Application.Goto Sheets(Feuille).Range("A2")
    Next Feuille
       'ou
    Application.ScreenUpdating = False
    For Each sh In Worksheets
      Application.Goto Sheets(sh.Name).Range("A2")
    Next

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut,et la boucle est bouclée : http://www.developpez.net/forums/d10...-excel-2007-a/

  5. #5
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour Pier3d

    ... , je désire ramener la sélection à A2 dans chacune des 6 feuilles question d'uniformiser la vue. ...
    Puis, je me suis posé la question : Select ou Activate ?
    Dans ce cas la question ne se pose pas : il faut utiliser Select ou éventuellement Goto.

    J'ai essayé les deux et je n'ai pas vu de différence évidente.
    La différence est visible lorsque la sélection (initiale) comprend plusieurs éléments (feuilles ou cellules), deux cas peuvent se présenter :
    • l'activation porte sur un élément qui appartient à la sélection : l'élément est activé mais la sélection n'est pas modifiée.
    • l'activation porte sur un élément qui n'appartient pas à la sélection : l'élément est sélectionné et activé.


    Tu peux essayer le sélectionner des plages de cellules contenant A2 et d'autres sans A2, dans plusieurs feuilles. Tu peux aussi essayer de sélectionner toutes les feuilles.
    Lance chacune des deux macros (avec .Activate puis avec .Select) :
    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
    Private Sub Activer()
    Dim Idx As Integer
      For Idx = 1 To Worksheets.Count
        Worksheets(Idx).Activate
        ActiveSheet.Range("A2").Activate
      Next Idx
    End Sub
     
    Private Sub Sélectionner()
    Dim Idx As Integer
      For Idx = 1 To Worksheets.Count
        Worksheets(Idx).Select
        ActiveSheet.Range("A2").Select
      Next Idx
    End Sub
    et là tu verra la différence : Activate ne répond pas entièrement à ton cahier des charges.

    Quand à l'utilisation de For Each ou For To, la seconde mobilise moins de mémoire, mais il semblerait qu'aujourd'hui ce ne soit plus un critère prépondérant.

    Cordialement
    Patrice

  6. #6
    Membre averti
    Homme Profil pro
    technicien télévision retraité
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien télévision retraité

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    Bonjour,

    Merci à tous pour vos réponses. Soyez assurés qu'elles sont étudiées, testées et appréciées.

    @kiki29 :
    Salut,et la boucle est bouclée : http://www.developpez.net/forums/d10...-excel-2007-a/
    Pas tout à fait. Je me suis peut-être mal exprimé mais cette fois je vais être clair.

    @OrDonc : Merci, me voici maintenant avec trois options et grâce à vous je viens de découvrir cette version de Goto.

    Maintenant, je m'explique : En fait, ce n'est pas tant la sélection de [A1] dans chaque feuille que je désire comme de présenter la vue de cette cellule en haut à gauche de la fenêtre (de l'écran).

    L'enregistreur de macro est terriblement déficient à ce propos. Si je suis sur la cellule G134 et que je la vois, et que je fais Ctrl-home, je me trouve à aller à [A1] et, pouf !, la vue se déplace et JE VOIS [A1]. L'enregistreur de macro, lui, me dit seulement Or si je place ce code dans ma macro, la cellule [A1] est bien sélectionnée mais rien ne bouge. Ma vue reste à la ligne 134.

    La vraie question finalement est : comment fait-on, par programmation, pour ramener la vue en haut et à gauche de la feuille ? Quel code serait l'équivalent de Ctrl-home ?

    Et je viens de le découvrir en allant dans l'Aide lire un peu sur la méthode proposée par OrDonc. Il y a un paramètre « Défilement » qu'on peut ajouter à Goto. Et voici le code qui fait le travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Feuille In Worksheets
      Application.Goto Reference:=Worksheets(Feuille.Name).Range("A2"), Scroll:=True
    Next Feuille
    Encore une fois merci à tous. Je considère ce problème comme « Résolu ! ». Cependant, j'hésite à cliquer sur le bouton Résolu de peur que ça empêche l'ajout d'autres intéressants commentaires. Est-ce le cas ?

    Pier3d


    ---

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    J'ai écrit une macro qui permet de formater des données brutes qui alimentent, sur une autre feuille, 4 tableaux croisés dynamiques.
    Je ne doute guère que sur cette macro tu utilise des Select.
    La question de fond, pourquoi faire des sélections et chercher la(es) méthode(s) pour faire marche arrière.

    Mais, grâce à ce sujet et à OrDonc, j'ai pris connaissance de Application.Goto (En fait, je n'en avais jamais besoin auparavant)

  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    La vraie question finalement est : comment fait-on, par programmation, pour ramener la vue en haut et à gauche de la feuille ? Quel code serait l'équivalent de Ctrl-home ?
    Pour visualiser la cellule A1 de chaque feuille, sans modifier la sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
      Dim wsh As Worksheet
      For Each wsh In ThisWorkbook.Worksheets
        wsh.Activate
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
      Next wsh
    End Sub
    Patrice

  9. #9
    Membre averti
    Homme Profil pro
    technicien télévision retraité
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien télévision retraité

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    Merci Patrice740.

    Oui, après avoir découvert le Scroll (défilement) de Application.Goto, j'ai bien pensé que cette méthode devait exister aussi pour d'autres éléments de l'application, principalement les fenêtres. Mais comme, dans mon présent projet, je désire en même temps sélectionner A1 et afficher le haut gauche de la fenêtre, le Goto me convient très bien. J'aurai certainement des occasions pour utiliser Windows.Scroll dans le futur.

    @ mercatog :
    Je ne doute guère que sur cette macro tu utilise des Select.
    Hé oui. La macro comprend 480 lignes sur 3 procédures et dont 51 lignes de commentaires. La méthode Select est appelé 51 fois contre 11 fois pour Activate. C'est mal ?
    La question de fond, pourquoi faire des sélections et chercher la(es) méthode(s) pour faire marche arrière.
    Je ne pense pas faire souvent marche arrière... La marche de la macro est progressive, du point A au point B sans détour.

    J'ai de la difficulté à imaginer comment on peut se passer de Select.

    Mais, grâce à ce sujet et à OrDonc, j'ai pris connaissance de Application.Goto (En fait, je n'en avais jamais besoin auparavant)
    Vous êtes bien chanceux ! Pour moi, cela répond à un besoin que j'avais depuis longtemps. Bien sûr, comme me l'a expliqué Patrice740, il y a aussi le Windows.Scroll. Mais je désire également laisser le contrôle à l'utilisateur en ayant le curseur sur A1.

    Pierre (très heureux de connaître ce merveilleux forum)


    ---

  10. #10
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    La méthode Select est appelé 51 fois contre 11 fois pour Activate. C'est mal ?
    Oui, c'est trop mal.

    Un exemple (je suis en Feuil1 et je lance cette macro)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sheets("Feuil3").Activate
    Range("X450").Select
    Selection.Interior.Color=vbRed
    à la fin de la macro, je suis en Feuil3 et X450 a été colorée en rouge. Mais pour revenir où j'étais (en Feuil1), je dois faire marche arrière.

    Maintenant, (je suis en Feuil1 et je lance cette macro)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheets("Feuil3").range("X455").Interior.Color=vbRed
    à la fin de ma macro, je suis resté dans ma place et X455 de Feuil3 a été bel et bien colorée en rouge.

    Les Select et les Activate sont sûrement à éviter parce qu'ils sont source d'instabilité du code et de perte de temps

    On peut toujours travailler sans elles en instanciant convenablement les objets.

    Pour écrire dans une cellule X d'une Feuille Y (d'un classeur même classeur), on peut faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheets(Y).Range(X).Value="Toto"

  11. #11
    Membre éprouvé Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Par défaut
    Bonjour
    J'ai défendu aussi les "Select ou Activate" car il me semblait que le code fonctionnait bien avec, mais avec le temps on apprend et je confirme les précisions du grand Mercatog le code est instable, des erreurs surviennent, il faut le plus possible supprimer ses 2 termes toujours issus par l'enregistreur de macro qui est indispensable pour les débutants mais ensuite apprendre à épurer le code de ses "Select ou Activate".
    Un code avec des "Select ou Activate" est un code de débutant.
    Un code sans "Select ou Activate" est un code de professionnel, et il faut du temps et des déclics pour bien en comprendre tous les avantages > un code stable, une écriture magistrale…

    Cordialement

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    Je suis entiérement d'accord avec mercatog quand il dit :
    Les Select et les Activate sont sûrement à éviter parce qu'ils sont source d'instabilité du code et de perte de temps
    Par contre je n'arrive pas à comprendre ceci :
    Citation Envoyé par Vadorblanc
    Un code avec des "Select ou Activate" est un code de débutant.
    Un code sans "Select ou Activate" est un code de professionnel
    J'ai souvent eu un problème similaire à celui de Pier3d :
    À la fin de la macro, avant de redonner le contrôle à l'utilisateur, je désire ramener la sélection à A2 dans chacune des 6 feuilles question d'uniformiser la vue.
    Bien évidemment, dans mes macros, l'utilisation de select est limité au strict indispensable.
    Je précise qu'en général (et c'est probablement vrai pour Pier3d), c'est l'utilisateur qui est responsable des sélections éparpillées dans le fichier.

    @ Vadorblanc :
    Comment le professionnel est-il capable de résoudre ce problème sans utiliser Select
    (ni Goto et encore moins Activate qui de toute façon ne répond pas au besoin) ???

    Patrice

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 115
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un autre code qui manipule directement l'objet Feuille sans passer par sa propriété Name
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Feuille As Worksheet
     For Each Feuille In Worksheets
      Application.Goto Reference:=Feuille.Range("A2"), Scroll:=True
     Next
    Comment le professionnel est-il capable de résoudre ce problème sans utiliser Select (ni Goto et encore moins Activate qui de toute façon ne répond pas au besoin) ???
    Comme il s'agit ici de donner le focus à la cellule A2 de chaque feuille, je ne vois pas comment l'éviter.
    Cependant si c'est pour modifier la valeur ou la propriété d'une ou plusieurs cellules sans changer le focus d'une cellule de la feuille, il ne faut absolument pas utiliser Activate et Select.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour à tous
    Toutes les approches sont plus ou moins valables (dans une certaine mesure)
    Une autre proposition c'est d'utiliser l'évènement SheetActivate du workbook

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    On Error Resume Next 'au cas où on a des feuilles graphiques
    Range("A2").Select
    End Sub

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2009, 12h06
  2. [VBA pour Excel] Différence entre activate et select
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/10/2008, 17h20
  3. Activation d'un select
    Par CrazySeb dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/05/2007, 15h52
  4. activer un input lorsque l'on choisi une option ds un select
    Par netwebzone dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/04/2007, 23h12
  5. [Excel] selection et copier-coller de cellule sans activer les sheets
    Par franckB dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/04/2007, 23h26

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