Espaces dans les noms de Feuilles

sigismond

XLDnaute Occasionnel
Bonjour à tous,

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 :


ActiveWorkbook.Worksheets("Ma Feuille 1").Shapes.Count


ne fonctionne que si la feuille "Ma Feuille 1" est sélectionnée.

Ma requête est la suivante :
  • Connaissez vous d'autres situations de bugs potentiels ?
  • Connaissez vous des astuces pour contourner ces bugs ?
  • existerait-il une syntaxe particulière pour autoriser ces espaces dans les noms de feuille ?

Merci de m'apporter votre expérience car depuis que je travaille sur ce projet, rien ne marche, j'ai l'impression d'être redevenu débutant :D

déprimant, non ?

Sigismond
 

sigismond

XLDnaute Occasionnel
Re : Espaces dans les noms de Feuilles

Bonjour Job75

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.

Respect, et merci pour le déblocage.

Sigismond.
 

sigismond

XLDnaute Occasionnel
Re : Espaces dans les noms de Feuilles

Merci Odesta pour le temps consacré à m'aider à avancer dans ma réflexion.

Tu as pu voir par ailleurs que Job75 avait mis le doigt sur le caillou qui bloquait la machine, merci à lui car mon projet ronronne de nouveau.

Pour poursuivre notre raisonnement :

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 ^^


Ce que je veux écrire est cela :

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.

Merci de ton aide.

Sigismond.
 

Odesta

XLDnaute Impliqué
Re : Espaces dans les noms de Feuilles

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))


Olivier
 

sigismond

XLDnaute Occasionnel
Re : Espaces dans les noms de Feuilles

Bonjour,

Et merci de reformuler la question Odesta car je soupconne que nous ne sommes pas sur la même longueur d'onde.

(...)
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))

Olivier

Au stade où j'en suis (syntaxe VBA), je considère que les parties en rouge sont inutiles :

Code:
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range([COLOR="Red"]MonClass.Worksheets("Ma Feuille 1").[/COLOR]Cells(ln1, col1), [COLOR="Red"]MonClass.Worksheets("Ma Feuille 1").[/COLOR]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,

et surtout,

merci à toi de m'y aider.

Sigismond.
 

tototiti2008

XLDnaute Barbatruc
Re : Espaces dans les noms de Feuilles

Bonjour à tous,

je considère que les parties en rouge sont inutiles

Odesta et moi essayons (vainement :confused:) de t'expliquer que ces parties en rouge sont tout sauf inutiles.

en mettant

Code:
[FONT=Courier New]Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(Cells(ln1, col1), Cells(ln2, col2))[/FONT]

Cells(ln1, col1) et Cells(ln2, col2) ne pointent pas sur la feuille "Ma feuille 1" mais sur la feuille active quelle qu'elle soit

D'où, pour s'assurer que ces Cells pointent sur la bonne feuille, il faut soit utiliser un With, soit adopter l'écriture proposée par Odesta
 

Odesta

XLDnaute Impliqué
Re : Espaces dans les noms de Feuilles

Bonjour / re
Au stade où j'en suis (syntaxe VBA), je considère que les parties en rouge sont inutiles :

Code:
Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range([COLOR="Red"]MonClass.Worksheets("Ma Feuille 1").[/COLOR]Cells(ln1, col1), [COLOR="Red"]MonClass.Worksheets("Ma Feuille 1").[/COLOR]Cells(ln2, col2))

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ù :

Set MyRange = MonClass.Worksheets("Ma Feuille 1").Range(MonClass.Worksheets("Ma Feuille 1").Cells(ln1, col1), MonClass.Worksheets("Ma Feuille 1").Cells(ln2, col2))[/CODE]

D'où les morceaux en rouge, qui ont toutes leur importance.
Ceci n'a rien à voir avec les With / End with, qui sont juste des simplificateurs.


j'espère avoir été assez claire, désolé pour les fautes qui restent.

Cdt

Olivier
 

sigismond

XLDnaute Occasionnel
Re : Espaces dans les noms de Feuilles

Bonsoir,

Ta démonstration ébranle mes certitudes Odesta,

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.

et encore Bravo :)


Sigismond
 

Staple1600

XLDnaute Barbatruc
Re : Espaces dans les noms de Feuilles

Bonsoir

Pour enfoncer le clou :D
(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
 
Dernière édition:

sigismond

XLDnaute Occasionnel
Re : Espaces dans les noms de Feuilles

Bonjour,

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 :

  1. La fenêtre des variables locales n'est peut-être pas le bon outil, quel est le plus efficace ?
  2. 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.

Sigismond
 

Discussions similaires

Statistiques des forums

Discussions
312 858
Messages
2 092 871
Membres
105 545
dernier inscrit
pourmanger