XL 2010 Question sur l'utilisation de SET

RichardS

XLDnaute Junior
Bonjour,

Le fait d'utiliser
Dim F as Worksheet et
SET F=workbooks("Test2").sheets("Feuil1")
est très intéressant mais il y a des restrictions que je ne comprend pas. Pourriez vous me les expliquer SVP.
Prenons un exemple : J'ai 2 fichiers TEST1.xlsm et TEST2.xlsm. Tous les deux sont ouverts et TEST1 est actif.
Si je fais F.cells(1,1)="OK" cela fonctionne et dans la cellule 1,1 vient bien s'inscrire OK.
Par contre si j'essaye de faire un select sur la même cellule, cela ne fonctionne pas.
F.cells(1,1).select ne fonctionne pas
Ces éléments sont décrits en détail dans le fichier Word joint.
Pourquoi cela fonctionne t-il dans un cas et pas dans l'autre. Bien sur il y a moyen de contourner mais j'aimerai bien comprendre.
Si vous pouviez me répondre, j'apprécierai

Merci d'avance
RichardS
 

Pièces jointes

  • Il y a 2 classeurs xlsm ouverts.docx
    108.8 KB · Affichages: 12

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @RichardS , le Forum

Si tu regardes mes codes dans mes interventions, je déclare toujours tous mes objets WorkBook, WorkSheet, Range (etc) et je fais ensuite un Set d'Objet sur chacun.

Il est dans les "Best Practices" de procéder de la sorte quand on développe quelque chose de "sérieux" et surtout de pérenne pour faire face au plus grands nombres de cas de figures.

Il n'y a pas de "limitation". Beaucoup moins en tout cas que de NE PAS les déclarer et faire un Set clair et précis.

Tu dois imaginer que VBA interprète ainsi "tous les acteurs" en jeu dans l'algo quand on lui "explique" (dès le début du code) qui est qui et qui fait quoi avec les "bornes" bien définies pour chaque objet.

Maintenant ton exemple :
F.cells(1,1).select ne fonctionne pas

C'est idem que si tu ne fais PAS de déclaration de Variable et de Set, en tapant :
Workbooks("Test2.xlsm").Sheets("Feuil1").Cells(1,1).Select

Donc ça n'a rien à voir avec le Set d'Objet, c'est tout simplement que si cette "Feuil1" n'est pas actuellement la Feuille Active, tu ne peux pas demander à VBA de faire la sélection d'une cellule de cette dite feuille.

Et le fait de faire des Set d'objets "dans les règles de l'art" normalement évite au développeur d'avoir recours aux fameux "Select" qui ne font qu'alourdir et ralentir le Code. VBA peut travailler totalement "virtuellement" en ayant tout dans la RAM sans aller "voir physiquement" les cellules...

Si maintenant en fin de traitement, tu veux que l'utilisateur se retrouve sur une Cellule "X" il suffit d'expliquer à VBA avant :
With F
.Activate
.Cells(1,1).Select
End With

Bonne découverte du monde VBA
@+Thierry
 

RichardS

XLDnaute Junior
Ma question portait sur le fait qu'il y a une différence de fonctionnement que je ne m'expliquait pas entre 2 lignes de code :
F.cells(1,1)="OK" qui fonctionne
et
F.cells(1,1).select qui ne fonctionne pas.
Je crois comprendre dans ton explication que dans un cas il travaille virtuellement via la RAM et que dans l'autre cas, il doit intervenir physiquement sur une feuille qui n'est pas active.

Je vais m’intéresser aux best practices pour éviter de poser ce genre de questions. Mais quand même, j'aime bien comprendre les choses.

Merci pour ta réponse
 

_Thierry

XLDnaute Barbatruc
Repose en paix
F.cells(1,1)="OK" qui fonctionne

Oui pour ceci ou bien d'autres actions, (Sans Select) VBA sait où écrire sans avoir à lui sélectionner la cellule. (VBA a le schéma complet du (des) classeur(s) en RAM si bien déclaré.

C'est uniquement le Select qui doit rester logique, on ne peut pas selectionner quelque chose quand on n'est pas dans la pièce où se trouve ce quelque chose (mais on peut toujours "penser" à cet objet...)

Bonne journée
@+Thierry
 

Discussions similaires