Activate : besoin ou pas selon la méthode employée

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

ma question porte sur la nécessité ou pas d'utiliser la méthode Activate.
Je lis à longueur de forum qu'il vaut mieux s'en passer (et plus encore de Select), autant que possible. Je soigne cette maladie de jeunesse, contractée au contact de l'enregistreur de macros …
J'arrive à coder "en direct" mais bute à présent sur un os qui introduit le doute dans mon esprit.
De manière à pouvoir mieux contrôler ce que fait mon code, j'ai saucissonné une appli en plusieurs Sub(), que je chaîne au final par des call() et ainsi, je dévermine chaque Sub() et peux donc me concentrer là où ça coince.
Pour tester chaque sub(), je me positionne sur la feuille en question et regarde si le code fait ce que je lui demande de faire. Etant sur la feuille qui va bien, tout fonctionne. Mais quand je lance l'enchainement, j'ai quelques surprises …

1) Tri de liste
Mon code pour trier une liste semble ne pas avoir besoin que je sois sur la feuille active
Je suis sur la feuille A et mon code n'utilise pas de sheets("B").activate … mais quelque chose comme

dim last as long
last=sheets("B").range("Z" & rows.count).end(xlup).row
msgbox "La dernière ligne de la liste en feuille B est " & last
puis mon code de tri …

le msgbox renvoie bel et bien la bonne valeur, donc je n'ai pas eu à activer la feuille B ….

2) Recherche de max() et min()
idem, même si je suis sur feuille "A", j'arrive à déterminer le max() et le min() d'une liste située en feuille "B"
Pour cela, je détermine une plage avec set MaPlage= sheets("B").range("Z" & rows.count).end(xlup).row
puis DateMax=worksheetfunction.Max(MaPlage)


3) Echec quand il faut "écrire" en feuille B
Si comme précisé plus haut je suis en feuille active "A", les instruction suivantes écrivent en feuille "A" et non "B"

with sheets("B")
for i=2 to dernlign
cells(i,31)="OK"
next i
end with

En fait, quand je contrôle au compte-gouttes, c’est-à-dire chaque routine, je me positionne en feuille "B", donc ça marche mais quand je lance l'enchainement via les call(), ça écrit "OK" en colonne 31 de la feuille "A" malgré le with sheets("B")


donc en conclusion, doit-on Activate la feuille quand on écrit dedans ? (et donc se passer de cette méthode tant qu'on ne fait que lire des données dans une feuille non active) ?
J'avance de façon empirique et ne trouve pas chez Microsoft ou autre de doctrine en la matière (mais peut-être n'ai-je pas les bonne sources d'info !)

Merci d'avance pour votre aide
 

MJ13

XLDnaute Barbatruc
Re : Activate : besoin ou pas selon la méthode employée

Bonjour Sebast, Misange, Job

En général, on peut souvent se passer des select, quoique je l'utilise souvent si je veux savoir où j'en suis. Par exemple, si je copie des fichiers et qu'il y a un bug, je vois tout de suite où j'en suis dans ma liste.

Après, en VBA, tout n'est pas écrit dans la marbre, tu dois coder comme tu le comprends et avec l'expérience cela viendra tout seul, à condition de ne pas t'arrêter plus d'un mois. Le plus important, c'est que cela fonctionne sans bugs.

Un bonne syntaxe actuellement est d'utilisé les paramètres des classeurs avec Workbooks(.....).Sheets(.....).cells(....).


De plus, tu peux regarder comment les experts d'XLD codent pour affiner ta syntaxe.

Bon codage :).
 

Sebast

XLDnaute Impliqué
Re : Activate : besoin ou pas selon la méthode employée

Bonjour à tous et merci pour votre aide,

j'avoue ne pas être trop avancé !

Misange : le lien mixe activate et select mais je n'emploie que activate dans mon code.
Il est précisé "Avant de sélectionner une plage dans une feuille, il faut activer la feuille" alors que justement, j'arrive à déterminer une plage même dans une feuille non active (c.f. points 1 et 2 de mon premier post)

MJ13 : je me passe bien des select et utilise bien la syntaxe complète
Code:
Workbooks(.....).Sheets(.....).cells(....)
Effectivement, à l'usage, ça vient tout seul mais comme on lit qu'il faut se débarasser des select/activate ...

job75 : bien vu ! Cependant, même si je n'ai pas mis le point, ça écrit bel et bien dans la feuille active ("A") et non ("B") malgré le with sheets("B").
Je n'ai pas le fichier sur mon ordi le weekend mais tu penses que ça pourrait être la raison ? En gros le code ne plante pas mais ne tient pas compte de l'instruction ?
Je vais reconstituer un fichier test et te revient pour confirmer.

Merci beaucoup
 

MJ13

XLDnaute Barbatruc
Re : Activate : besoin ou pas selon la méthode employée

Re

Quand même le meilleur conseil, est d'utiliser l'enregistreur de macro qui te permet de gagner un facteur 10 en terme de programmation et tu peux directement voir la syntaxe.

Le plus important, ce n'est pas de supprimer tous les select mais que ton code fonctionne assez rapidement pour ce que tu veux faire :).
 

MJ13

XLDnaute Barbatruc
Re : Activate : besoin ou pas selon la méthode employée

Re

Sinon, si tu es sur une autre feuille, tu peux tester ces 2 codes pour mieux comprendre:

Code:
Sub a()
dernlign = 10
With Sheets("B")
 For i = 2 To dernlign
 Cells(i, 1) = "OK"
 Next i
 End With
End Sub
Sub b()
dernlign = 10
 For i = 2 To dernlign
 With Sheets("B")
 .Cells(i, 1) = "OK"
 End With
 Next i
End Sub
 

Pièces jointes

  • With.xlsm
    15.7 KB · Affichages: 25

Sebast

XLDnaute Impliqué
Re : Activate : besoin ou pas selon la méthode employée

Re,

job75, je viens de tester et tu avais raison : c'est bel et bien la raison de mon erreur !
Elle est d'autant plus vicieuse qu'il ne s'agit pas d'un plantage (le déroulement ne s'arrête pas) et qu'il est difficile de la détecter car quand je debugge, je me place sur la feuille en question, donc ça renvoie le bon résultat ...

En conclusion, sans le point, ça ne tient pas compte de with / end with et avec le point, on peut être sur une tout autre feuille, le travail sera bien conforme à mes attentes !
Un grand merci pour ta vista, je ne me souciais pas trop du point, persuadé (à tort) qu'une mauvaise syntaxe aurait de toutes façons arrêté le programme.

MJ13 : oui, j'utilise encore beaucoup l'enregistreur, mais je sabre les passages inutiles. Avec ce que je viens d'apprendre (l'histoire du point manquant), je peux donc avancer et renoncer à un activate inutile. Cependant, je suis avec toi concernant le bon sens : priorité au résultat final, surtout quand on est programmeur occasionnel. Mais au moins aurais-je appris quelque chose aujourd'hui, qui me servira à progresser.

Encore merci à tous
 

Sebast

XLDnaute Impliqué
Re : Activate : besoin ou pas selon la méthode employée

Re,

MJ13 : tu as dégainé plus vite que ma réponse. J'ai procédé à un test équivalent à ce que tu as posté à 11 h 56 et arrive aux conclusions citées plus haut.
Un grand merci pour ton aide
 

MJ13

XLDnaute Barbatruc
Re : Activate : besoin ou pas selon la méthode employée

Re


J'ai procédé à un test équivalent à ce que tu as posté à 11 h 56 et arrive aux conclusions citées plus haut.

Chez moi, c'est plus bas :D (il suffit d'inverser l'ordre dans les options sur le forum).

Sinon, ce que l'on peut comprendre, c'est que si tu ne mets pas de point (comme sur la macro a), il considère qu'il doit mettre les données sur la feuille activée. Donc des qu'on mets des with, bien penser à mettre le point au bon endroit.

On aurait pu écrire aussi:

Code:
Sub d()
dernlign = 10
 For i = 2 To dernlign
 Workbooks(ThisWorkbook.Name).Sheets("B").Cells(i, 1) = "OK"
 Next i
End Sub

Mais avec le With, tu peux faire plusieurs actions, comme formater le texte, le format.
 
Dernière édition:

Sebast

XLDnaute Impliqué
Re : Activate : besoin ou pas selon la méthode employée

Re,

en fait, j'avais envoyé ma réponse avant de constater que tu avais répondu ...
J'étais effectivement arrivé aux mêmes conclusions : donc vraiment, autant mettre le point sinon on risque l'embrouille, d'autant plus qu'il n'y a pas plantage mais données erronnées.

Encore merci pour ta contribution
 

Discussions similaires

Statistiques des forums

Discussions
312 295
Messages
2 086 960
Membres
103 407
dernier inscrit
elliott.joliman@bforbank.