Il y a longtemps que j'ai proscris l'usage des espaces (et des accents) dans les noms de feuilles de mes projets, ce qui fait que je n'ai plus d'expérience des conséquences.
J'ai hérité d'un projet qui utilise, lui, ces espaces dans les noms de feuilles et je suis obligé de faire avec.
Parmi les bugs identifiés : l'impossibilité depuis le code d'adresser une feuille qui n'est pas active :
et bravo pour ce coup dans le mille.
il faut connaitre l'astuce car je ne saisis pas bien la logique du processus.
D'accord aussi pour limiter le recours à Select et Activate.
Il se trouve que les objets Workbook et Chart sont disjoints et que je n'ai trouvé que Activate / ActiveChart comme passerelle.
Et pour reprendre l'explication de tout à l'heure sur la "cells"
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(Cells(ln1, col1), Cells(ln2, col2))
devrait s'écrire, si l'on en factorise pas :
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(MonClass.Worksheets("Ma Feuille 1").Cells(ln1, col1), MonClass.Worksheets("Ma Feuille 1").Cells(ln2, col2))
Voila, où Tototiti et moi voulions ne venir. Il faut faire attention à ce que l'on pointe ^^
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(H5:S8)
je n'utilise la structure Cells que pour pouvoir indexer le H, le 5, le S et le 8
sous réserve qu'à l'exécution du code toutes les variables soient chargées et valides.
Pour la structure With ....End With je préfère la remplacer par un Set sur une variable objet au prix évidemment d'un encombrement mémoire car j'avoue ne pas faire systématiquement le Set xyz = Nothing de cloture.
Bonjour
Je n'ai pas compris la question.
ceci ne répond pas à ton besoin ?
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(MonClass.Worksheets("Ma Feuille 1").Cells(ln1, col1), MonClass.Worksheets("Ma Feuille 1").Cells(ln2, col2))
(...)
ceci ne répond pas à ton besoin ?
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(MonClass.Worksheets("Ma Feuille 1").Cells(ln1, col1), MonClass.Worksheets("Ma Feuille 1").Cells(ln2, col2))
Si ton expérience diffère peux tu m'expliquer pourquoi et quelles en sont les conséquences.
Soyons clair, je ne rentre pas dans une querelle syntaxique dans le seul but d'alimenter la diatribe. Pour moi la meilleure syntaxe est celle que comprend l'interpréteur. Si je pose la question c'est pour évoluer dans cette direction,
Pour la structure With ....End With je préfère la remplacer par un Set sur une variable objet au prix évidemment d'un encombrement mémoire car j'avoue ne pas faire systématiquement le Set xyz = Nothing de cloture.
Ok, pas de problème sur l'incompréhension :
L'objet Cells fait réference à une cellule est qui positionnée dans une feuille, elle même apartenant à un classeur.
Lorsque tu utilises un "activate" ou un "select" tu es placé automatiquement dans le classeur que tu souhaites, et dans la feuille sur laquelle tu travailles, il n'y a donc aucun impact sur le fait que tu n'indiques pas où pointe le Cells. En quelque sorte, le classeur et la feuille sont IMPLICITES.
Maintenant, tu travailles sur un classeur A (feuille#1), pour remplir la cellule "A1" en indiquant que cette cellule est égale au contenu de la cellule "F22" du classeur B ; feuille n°1 :
Tu écrira ceci :
Cells(1,1).Value = classeur("B").feuille("n°1").cells(22,6).value
Hors, si tu n'actives pas le classeur A, il est possible que ton programme soit sur un autre classeur, donc pour ne pas l'activer, tu écrira ceci :
classeur("A").feuille("#1").Cells(1,1).Value = classeur("B").feuille("n°1").cells(22,6).value
Maintenant, retournons à ton cas :
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(Cells(ln1, col1), Cells(ln2, col2))
Le "Set MyRange =" n'est pas le coeur du problème, puisque son
fonctionnement est simple, regardons la syntaxe après le '='
MonClass.Worksheets("Ma Feuille 1").Range( xxx ) permet de définir une plage sur la feuille ("Ma Feuille 1") du classeur 'MonClass'.
Pour définir une zone, nous sommes d'accord qu'il faut que la zone soit contenue dans le classeur et dans la feuille souhaités.
Hors, le code contenu dans les parenthèses :
Cells(ln1, col1), Cells(ln2, col2)
n'indique en rien que tu pointes sur la feuille ("Ma Feuille 1") du classeur 'MonClass', mais uniquement que tu pointes vers le classeur et la feuille actuellement activés. Si par chance, ce sont les bonnes, la zone sera bien sélectionnée, dans le cas contraire, plantage d'où :
Jusqu'à présent, je considérais que dans :
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(MonClass.Worksheets("Ma Feuille 1").Cells(ln1, col1), MonClass.Worksheets("Ma Feuille 1").Cells(ln2, col2))
tout ce qui est en aval de : MonClass.Worksheets("Ma Feuille 1")
en était un sous-ensemble et était donc implicitement contenu dedans.
d'où mon impression d'inutilité.
Si j'ai bien compris les conséquences de ce que je faisais, dans 95% des cas ça marche et de temps en temps ça plante (Bingo c'est exactement ce qui se passe)
Le point de départ de ce fil en est une illustration, je cherchais la cause de ces plantages dans les espaces dans les noms de feuille et c'est toi Odesta qui a le premier décelé autre chose.
Je n'ai pas encore réfléchi à toutes les implications de ceci (ça rallonge drôlement le code, je comprends mieux les With...End With).
Je n'aurai une idée claire qu'en écrivant du code nouvelle manière et en constatant de visu la fiabilisation du résultat.
Merci à vous deux Odesta et tototiti pour vous être renvoyé la balle à mon sujet, à deux vous avez réussi à insinuer le doute, vecteur d'évolution.
Pour enfoncer le clou
(tu vois pas de Select, pas d'Activate et cela fonctionne non ? )
Code:
Sub CherchBug2()
Dim sPath$, mess$, i As Byte
Dim MonClass As Workbook, MonGraph As Object
sPath = ThisWorkbook.Path & "\"
Application.ScreenUpdating = False
Set MonClass = Workbooks.Open(sPath & "Satellite.xls")
Set MonGraph = MonClass.Worksheets("Analyse Graphique").ChartObjects(1).Chart
With MonGraph
For i = 1 To 2
mess = _
mess & "Formule " & i & " : " & .SeriesCollection(i).Formula & vbLf & _
"colorIndex " & i & " : " & .SeriesCollection(i).Border.ColorIndex & vbLf
Next
End With
MonClass.Close 0
MsgBox mess, vbInformation, "Il est ou le bug ?"
End Sub
PS: c'est juste de l'humour, rien de méchant, sigismond
EDITION: cela fonctionne aussi ainsi
Code:
Sub CherchBug3()
Dim sPath$, mess$, i As Byte
Dim MonGraph As Object
sPath = ThisWorkbook.Path & "\"
Application.ScreenUpdating = False
Set MonGraph = _
Workbooks.Open(sPath & "Satellite.xls").Worksheets("Analyse Graphique").ChartObjects(1).Chart
With MonGraph
For i = 1 To 2
mess = _
mess & "Formule " & i & " : " & .SeriesCollection(i).Formula & vbLf & _
"colorIndex " & i & " : " & .SeriesCollection(i).Border.ColorIndex & vbLf
Next
End With
ActiveWorkbook.Close 0
MsgBox mess, vbInformation, "Il est ou le bug ?"
End Sub
Retour sur le fil après quelques jours "Off" because pont de l'Ascension.
Merci pour ton intervention, Stapple 1 600 dans la mesure où elle révèle une lacune dans les sources d'information que je pratique.
Je m'explique :
Quand je cherche des infos sur le modèle d'objet Excel (dans le but de les manipuler avec VBA), j'utilise beaucoup la fenêtre des variables locales.
Par exemple ici : je cherche à atteindre la propriété Formula de SeriesCollection.
Je place un point d'arrêt dans mon code après la ligne Set Monclass =...
j'exécute le code jusqu'à ce point d'arrêt,
Je peux ainsi décortiquer à loisir (dans la fenêtre des variables locales) l'intégralité de l'objet MonClass dans son état actuel.
L'ennui c'est que je découvre, grâce à toi, que ça ne correspond pas à la réalité.
En effet :
l'objet : Workbooks.Open(sPath & "Satellite.xls").Worksheets("Analyse Graphique")
ne présente pas dans ses propriétés la collection "ChartObjects"
alors que comme ton code fonctionne, j'en déduis qu'elle existe bien.
De cette constatation je tire deux questions :
La fenêtre des variables locales n'est peut-être pas le bon outil, quel est le plus efficace ?
Je n'arrive à atteindre les propriétés d'un objet qu'en partant du tronc (l'objet WorkBook). Est-il possible de les appeler "en l'air" sans se rattacher à WorkBook (directement ou indirectement par la création en mémoire d'objets intermédiaires) ?
Merci à tous ceux qui mettent leur énergie à faire progresser ce fil.