XL 2016 Erreur 438 sur une feuille appelée par objet

xUpsilon

XLDnaute Accro
Bonjour tout le monde,

Ca fait un moment que je ne suis pas passé par là mais j'ai encore besoin de votre aide.

Un problème de format j'imagine, probablement anodin mais je ne trouve pas d'explications :
Dans le cadre d'un projet, je définis des objets de type Excel.Workbook ou Excel.Worksheet.
Donc j'ai par exemple
VB:
Dim oWbk_Rofo As Workbook
Set oWbk_Rofo = Workbooks(soWbk_Rofo_Synthesis)
(soWbk_Rofo_Synthesis est une Const String)
J'utilise donc dans la suite oWbk_Rofo pour remplacer le fastidieux Workbooks(soWbk_Rofo_Synthesis).

De la même manière, j'essaye de set une Worksheet via un procédé similaire de Dim/Set.
Sauf que lorsque je souhaite utiliser ces variables pour appeler un range qui y est compris, ça me renvoie une erreur 438. Par exemple :
Code:
Set oWs_Rofo = oWbk_Rofo.Sheets("ROFO")
oWbk_Rofo.oWs_Rofo.Range(sCol_Cli_Synt_Rofo & nCollec + 2).Value = Coll_Clients(nCollec)
me renvoie une erreur 438.
Alors que passer directement par le nom comme ci-dessous fonctionne :
Code:
oWbk_Rofo.Sheets("ROFO").Range(sCol_Cli_Synt_Rofo & nCollec + 2).Value = Coll_Clients(nCollec)

Y a t'il une explication logique à tout cela ?
Merci d'avance !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @xUpsilon :),

Vous considérez le classeur : oWbk_Rofo
Les feuilles d'un classeur ne sont pas directement accessibles via une propriété de ce classeur.
oWbk_Rofo.oWs_Rofo ne désigne rien. Le premier terme est un classeur, le second est objet feuille qui n'existe pas dans les propriétés du classeur.
Pour accéder au feuilles du classeur, on passe par la propriété "collection de toutes les feuilles" ("Sheets") ou par la propriété de la "collection des seules feuilles de calcul" ("WorkSheets"). Ce sont les collections Sheets et WorkSheets qui font ensuite référence aux feuilles.

Donc pour référencer une feuille dans un classeur, on passe par monClasseur.Sheets("Feuille synthèse 2019") où "Feuille synthèse 2019" est le nom qui figure sur l'onglet de la feuille. On peut aussi passer par le rang de la feuille dans la collection monClasseur.Sheets(2) si la feuille est la 2ème feuille du classeur (moins sûr car l’utilisateur peut changer l'ordre des feuilles).

Dans la hiérarchie : Classeur ==> Feuille n'existe pas mais Classeur ==> collection Feuilles existe.

Dans votre cas c'est encore plus simple :
Vous avez déjà défini un objet qui représente votre feuille "Rofo" : oWs_Rofo
Pour désigner un range de cette feuille "Rofo", il suffit d'écrire oWs_Rofo.Range(.........)

Donc:
oWbk_Rofo.oWs_Rofo.Range(sCol_Cli_Synt_Rofo & nCollec + 2).Value = Coll_Clients(nCollec) ==> NON
oWs_Rofo.Range(sCol_Cli_Synt_Rofo & nCollec + 2).Value = Coll_Clients(nCollec) ==> OUI
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Spécifiez simplement oWs_Rofo comme expression Workseet, sans essayez de le qualifier de son Workbook Parent. C'est une variable à vous, non une de ses propriétés. Elle connaît son Parent, ne vous inquiétez pas.
Édition. Bonjour @mapomme je n'avais pas vu ton message.
 
Dernière édition:

xUpsilon

XLDnaute Accro
Bonjour @xUpsilon :),

Vous considérez le classeur : oWbk_Rofo
Les feuilles d'un classeur ne sont pas directement accessibles via une propriété de ce classeur.
oWbk_Rofo.oWs_Rofo ne désigne rien. Le premier terme est un classeur, le second est objet feuille qui n'existe pas dans les propriétés du classeur.
Pour accéder au feuilles du classeur, on passe par la propriété "collection de toutes les feuilles" ("Sheets") ou par la propriété de la "collection des seules feuilles de calcul" ("WorkSheets"). Ce sont les collections Sheets et WorkSheets qui font ensuite référence aux feuilles.

Donc pour référencer une feuille dans un classeur, on passe par monClasseur.Sheets("Feuille synthèse 2019") où "Feuille synthèse 2019" est le nom qui figure sur l'onglet de la feuille. On peut aussi passer par le rang de la feuille dans la collection monClasseur.Sheets(2) si la feuille est la 2ème feuille du classeur (moins sûr car l’utilisateur peut changer l'ordre des feuilles).

Dans la hiérarchie : Classeur ==> Feuille n'existe pas mais Classeur ==> collection Feuilles existe.

Dans votre cas c'est encore plus simple :
Vous avez déjà défini un objet qui représente votre feuille "Rofo" : oWs_Rofo
Pour désigner un range de cette feuille "Rofo", il suffit d'écrire oWs_Rofo.Range(.........)

Donc:
oWbk_Rofo.oWs_Rofo.Range(sCol_Cli_Synt_Rofo & nCollec + 2).Value = Coll_Clients(nCollec) ==> NON
oWs_Rofo.Range(sCol_Cli_Synt_Rofo & nCollec + 2).Value = Coll_Clients(nCollec) ==> OUI
Merci pour cette réponse, effectivement je n'avais pas tilté que une fois la feuille définie comme enfant d'un classeur, il n'y avait plus besoin de mentionner le classeur parent.

Bonne soirée !
 

xUpsilon

XLDnaute Accro
Petite question complémentaire si quelqu'un passait par là.
Quelle fonction est la plus légère entre RECHERCHEV et INDEX + EQUIV ?

J'ai un fichier vachement lourd qui m'oblige à désactiver le calcul automatique et je pense que mes RECHERCHEV nombreuses doivent être une source de problème importante.

Merci !
 

Etoto

XLDnaute Barbatruc
Quelqu'un avait indiqué ce lien, peut-etre pourrez-vous l'utiliser ?
Hello,

Hehehe, c'est mon lien 🤣 🤣 .


Fait juste gaffe, certains membres préféreraient que leurs noms soient précisé (droits d'auteur) mais moi ça me dérange pas, surtout que c'est pas moi qui ai fait cet article.

Allez, bonne journée
 

Etoto

XLDnaute Barbatruc
Dans mon cas (pb de lenteur) je n'ai pas pu l'utiliser mais ça peut servir à d'autres.
Oui, en effet, d'ailleurs, je m'excuse de ne pas avoir pu t'être utile.

Il a aussi été utile dans d'autres conversations, comme celle-ci :

 

Discussions similaires

Statistiques des forums

Discussions
312 355
Messages
2 087 549
Membres
103 588
dernier inscrit
Tom59300Tom