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 :

Precisions sur activate et eviter de l'utiliser


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Precisions sur activate et eviter de l'utiliser
    Bonjour, apres avoir cherché un peu sur internet, il semblerait que faire des activate ne soit pas bon pour la rapidite du code. Donc je vais m'efforcer de les reduire. Si j'ai bien compris, si on doit modifier le contenu d'une feuille , on est obigé de l'activer, par contre pour prendre des informations dedan , on est pas obligé. Est ce bien ca?

    Par exemple je veux recupérer des infos sur xlsheet1 , je ne vais pas l'activer , mais si je veux mettre ces valeurs dans une xlsheet2 , je dois l'activer.
    pouvez vous me donner plus de precisions , car je suis interessé pour reduire mon nombre important d'activate et select dans mon code . Je code beaucoup pour mon stage (tous les jours depuis 3 semaines), et c'est quelque chose que je voudrais ameliorer, car dans le doute j'active ou je selectionne tres souvent ... ce qui n'est pas une bonne chose je pense.

    Merci
    Allez le RC LEns

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    pour écrire une valeur dans une feuille, pas besoin de l'activer non plus!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil2").Range("A1").Value = Sheets("Feuil1").Range("A1").Value
    Ecrit la valeur de A1 de feuil1 dans A1 de feuil2

  3. #3
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut merci
    Effectivement , on en reviens a la question : "en gros dans quels cas est on obligé de l'activer...? "
    Je regarde un peu des codes et c'est vrai que j'arrive a deceler le niveau de la personne sur ca facilité a eviter d'utiliser des activate a tous va.. , je sais que l'on peut les eviter. Je sais qu'il m'est arrivé de devoir activer une feuille pour en recuperer des données sinon il restait dans l'autre feuille. Avez vous des régles à me donner ? histoire de structurer mes idées.
    Allez le RC LEns

  4. #4
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Resolu
    Apres plusieurs recherches , j'ai trouvé ma solution, je vais la comuniquée pour les gens que ca interresse.

    avec un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    application.workbook.open(strLien)
    set xlsheet = activeworkbook.worksheet(Nomfeuille)
    set MyXlsheet = thisworkbook.worksheet("DB")
    set MyRange = xlsheet.columns(1).find("Global Asia")
    tab = MyRange.value
    MyXlsheet.range(A1") = tab
    Voila on a pas d'activate et avec un timer j'arrive a ce que je voulais c'est a dire ne plus utiliser d'activate , ou du moins tres souvent

    Voila je pense que ca pourra aider pas mal de personnes car peu d'infos sont sur ca .
    Allez le RC LEns

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Simplification de niveau1 (y'en a encore si on veut)
    +
    Gestion de l'erreur que tu te prends à la figure si tu n'as pas de résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Wb As Workbook
     
    Set Wb = Application.Workbook.Open(strLien)
    Set MyRange = Wb.Worksheets(nomfeuille).Columns(1).Find("Global Asia")
     
    If Not MyRange Is Nothing Then
        ThisWorkbook.Worksheet("DB").Range("A1") = MyRange.Value
    End If

  6. #6
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Wb As Workbook
     
    Set Wb = Application.Workbook.Open(strLien)
    Set MyRange = Wb.Worksheets(nomfeuille).Columns(1).Find("Global Asia")
     
    If Not MyRange Is Nothing Then
        ThisWorkbook.Worksheet("DB").Range("A1") = MyRange.Value
    End If
    Donc on peut en nomant simplement mes objets, eviter de faire des activate ou meme des select, c'est bien ca l'idée?
    Allez le RC LEns

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Oui c'est ça

    c'est le principe de VBA, les objets sont dans des collections, sur un système de poupées russes :

    - collection Workbooks pour les classeurs
    - collection Worksheets pour les feuilles de calculs (cette collection est d'ailleurs une sous collection des Sheets, cette collection étant l'union des feuilles de calculs et des feuilles graphiques)
    - collection Cells pour les cellules

    dès lors que tu ne stipule pas à VBA l'arborescence complète de l'objet (= toutes les collections parentes), il utilise l'objet actif des collections non précisées

    c'est pour ça qu'en général quand on débute en VBA, on utilise à tort et à travers des Select et Activate, qui servent à rendre actif l'objet qu'on veut utiliser ....
    alors qu'il est beaucoup plus propre, rapide, lisible, fiable ... de référencer la collection

    ça provoque cependant une surcharge d'écriture dans le code, on va donc optimiser ça en :

    - mettant l'objet dans une variable (on parle d'instancier un objet) : ainsi, on écrit une seule fois les objets des collections parentes et ensuite on utilise la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MaCellule as Range
    Set MaCellule = Workbooks("MonClasseur").Worksheets("MaFeuille").Range("A1")
    ' MaCellule est complètement identifiée, et VBA ne la confondra jamais avec le A1 d'une autre feuille ou d'un autre classeur
    - utilisant l'instruction With, qui permet de spécifier un objet, et d'utiliser ses propriétés ou méthodes sans avoir à toujours ré écrire l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With MaCellule
        .Value = "toto"
        With .Font
            .Interior.ColorIndex = 2
            .Bold = True
        End With
    End With

    Un code bien pensé et bien structuré :

    - sera rapide et efficace
    - n'aura jamais de comportement imprévu
    - devient souple et évolutif facilement
    - est compréhensible pour toute personne ne l'ayant pas écrit

    Au travail maintenant


    Ps : au sujet de ton .Find, il faut toujours tester si le Range qu'elle retourne existe, sinon ton code va planter quand il n'y a pas de résultat.
    étant donné qu'un Range est un objet, on regarde s'il n'est pas égal à Nothing
    Sans ça, tu vas ensuite utiliser l'objet dans ton code...mais vu qu'il n'existe pas ... VBA est pas content

  8. #8
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut merci
    Je vais etre bref mais ton explication etait vraiment parfaite , tu m'as vraiment bien expliqué , et maintenant je suis sure et j'ai bien compris et pour le find , je ferais un test maintenant .

    Je te remercie bcp pour cette reponse qui est tout simplement parfaite et pourras surement aider de nombreux forumeurs.

    merci
    Allez le RC LEns

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Ah et j'ai oublié

    pour ta question "quand utiliser un select ou un activate" ?

    il faut savoir qu'activer et sélectionner, ça prend du temps et des ressources.

    certains te dirons "on a jamais besoin...blablabla...c'est pour les débutants"

    je nuancerais en disant "uniquement en dernier recours, quand la perte de temps et inférieure à la perte qu'on aurait en ne le faisant pas"

    c'est vague n'est-ce pas ? c'est normal, car ces cas sont très rares

    personnellement, je ne les utilise que dans deux cas :

    - quand l'utilisateur veut qu'en fin de code (ou tout autre moment), une cellule ou autre objet soit sélectionné (c'est son droit)

    - quand je crée des objet (Forme, graphique, bouton...), ils n'ont pas encore de nom
    donc j'effectue un Select en même temps que je crée l'objet, ce qui m'évite de boucler sur la collection de ces objets pour le trouver (et parfois on peut même pas le trouver avec la boucle)

    Va voir ce code, en ligne 58, tu vas comprendre : http://www.developpez.net/forums/d15...o/#post8256320

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    Citation Envoyé par joe.levrai Voir le message
    ....
    - quand je crée des objet (Forme, graphique, bouton...), ils n'ont pas encore de nom
    donc j'effectue un Select en même temps que je crée l'objet, ce qui m'évite de boucler sur la collection de ces objets pour le trouver (et parfois on peut même pas le trouver avec la boucle)

    Va voir ce code, en ligne 58, tu vas comprendre : http://www.developpez.net/forums/d15...o/#post8256320..
    ce n'est pas un bon exemple le select est toujours inutile :


    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
    Dim sh As Worksheet
    Dim shChar As Shape
    Dim plage As Range
    '(...)
    Set sh = ThisWorkbook.Sheets(1)
    Set plage = sh.Range("A1:B27")
    '(...)
    With sh
        Set oMonGraphe = .Shapes.AddChart(xlLine).Chart
    '....
     
     
    End With
     
    '(...)
        With oMonGraphe
     
            .SetSourceData plage
            '(....)
        End With

  11. #11
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    merci pour le recadrage

    comme quoi on est jamais parfait .... surtout que ce que tu fais (instanciation sur création, ouverture etc...) .... je lui ai montré quelques messages plus avant !!

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    J'ajouterais 2 informations utiles.

    • L'utilisation des Select provoque de l'instabilité
      Lorsqu'un traitement est long, l'utilisateur risque de vouloir voir où il en est.
      Si, par malheur, il clique sur une cellule, tout le processus est perturbé.
    • L'usage de With - End With n'est pas qu'une facilité d'écriture.
      En l'utilisant, on permet au compilateur de ne pas devoir recalculer l'objet à chaque appel.
      Gain de temps et de ressources
      A utiliser sans modération
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser connexion OLEDB sur Active Directory
    Par jff42 dans le forum Access
    Réponses: 0
    Dernier message: 05/11/2014, 18h48
  2. Réponses: 3
    Dernier message: 22/08/2007, 16h53
  3. besoin de precision sur gluLookAt!
    Par bakonu dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/04/2004, 19h05
  4. precision sur le pilotage du port parallele
    Par fransouik dans le forum C++Builder
    Réponses: 18
    Dernier message: 26/02/2004, 13h28
  5. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46

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