OVH Cloud OVH Cloud

probleme VBA / Visio

2 réponses
Avatar
nemo
J'ai deja post=E9 plus bas mais je me rends compte qu'il est=20
impossible de me r=E9pondre sans plus d'=E9l=E9ments. Je recois=20
donc le message d'erreur "Invalid sheet identifier"=20
lorsque j'execute la fonction suivante dans VBA. Toutes=20
mes variables sont d=E9clar=E9es et il y a des shapes sur la=20
page active. Quelqu'un aurait-il une id=E9e sur la source du=20
probl=E8me? La r=E9cursivit=E9 est-elle prise en charge dans=20
VBA? Merci d'avance





Public Function recExplore(strNodeKey As String)

CrochOpen =3D Chr(60)
CrochClose =3D Chr(62)
Espace =3D Chr(32)
Attrib =3D Chr(61) & Chr(34)
Guil =3D Chr(34)
Slash =3D Chr(47)

(strNodeKey).Children)

UserForm1.TreeView1.Nodes(strNodeKey).Selected =3D True
intChildren =3D UserForm1.TreeView1.Nodes
(strNodeKey).Children

If intChildren =3D 0 Then

intLenKey =3D Len(strNodeKey) - 1
strShapeKey =3D Left(strNodeKey, intLenKey)
intShapeKey =3D strShapeKey
For i =3D 1 To Visio.ActivePage.Shapes.Count
Next i
Set shpObjB =3D Visio.ActivePage.Shapes(intShapeKey)
nrows =3D shpObjB.RowCount(Visio.visSectionProp)

Print #3, CrochOpen; shpObjB.Master; Espace;

For k =3D 0 To nrows - 1
Set celObj =3D shpObjB.CellsSRC(Visio.visSectionProp, k,=20
0)
ValName =3D celObj.ResultStr(Visio.visNone)
Set celObj =3D shpObjB.CellsSRC(Visio.visSectionProp, k,=20
2)
LabelName =3D celObj.ResultStr(Visio.visNone)

Debug.Print shpObjB.Name, LabelName, ValName
Print #3, LabelName; Attrib; ValName; Guil; Espace;
Next k
Print #3, CrochClose;

Else

intLenKey =3D Len(strNodeKey) - 1
strShapeKey =3D Left(strNodeKey, intLenKey)
intShapeKey =3D strShapeKey
For i =3D 1 To Visio.ActivePage.Shapes.Count
Next i
Set shpObjB =3D Visio.ActivePage.Shapes(intShapeKey)
nrows =3D shpObjB.RowCount(Visio.visSectionProp)

Print #3, CrochOpen; shpObjB.Master; Espace;

For k =3D 0 To nrows - 1
Set celObj =3D shpObjB.CellsSRC(Visio.visSectionProp, k,=20
0)
ValName =3D celObj.ResultStr(Visio.visNone)
Set celObj =3D shpObjB.CellsSRC(Visio.visSectionProp, k,=20
2)
LabelName =3D celObj.ResultStr(Visio.visNone)

Debug.Print shpObjB.Name, LabelName, ValName
Print #3, LabelName; Attrib; ValName; Guil; Espace;
Next k
Print #3, CrochClose;
=20
=20
Set tvn =3D UserForm1.TreeView1.Nodes
(intShapeKey).Child.FirstSibling
For m =3D 1 To intChildren
recExplore (tvn.Key)
Set tvn =3D tvn.Next
Next m
=20
Print #3, CrochOpen; Slash; shpObjB.Master; CrochClose

End If

End Function

2 réponses

Avatar
nemo
Merci pour la reponse rapide tout d'abord. J'ai essayé
ligne par ligne (je savais pas que ca existait:)) et c la
ligne suivant qui pose probleme apparement

Set shpObjB = Visio.ActivePage.Shapes(intShapeKey)

j'ai beau chercher je vois pas, le intshapekey est
pourtant bien defini et a une valeur a ce moment-la de l
execution. Concernant la recursivité je voudrais savoir
une chose de maniere plus precise: si, dans ma fonction
récursive, j'emploie une variable lambda (c'est le cas
dans ma procedure avec shpObjB), le programme va t il
garder en memoire toutes les valeurs de la variable pour
les reutiliser en temps voulu? (ici par exemple j'emploie
shpObjB au tout debut pour le noeud racine de mon arbre,
ensuite la fonction recursive explore tout l'arbre, de la
racine vers les feuilles, mais en remontant a nouveau vers
la racine la fonction devrait executer des instructions
avec une valeur de shpObjB qui a change au cours de l
execution..). Je sais c'est pas tres clair mais je me
disais que peut-etre ca pourrait etre ca?

En tout cas merci encore pour la reponse, je vais analyser
cette ligne sous toutes les coutures ;-)
Avatar
Patrice Henrio
Il faut vérifier la valeur de la variable intShapeKey au moment de l'erreur.
Tu fais cela en mode déboggage en demandant une variable espion.
Une autre façon est de passer le curseur de la souris sur le nom de la
variable, tu dois voir s'afficher la valeur
Enfin dernière façon, juste avant la ligne en question tu introduis la ligne
suivante
debug.print intShapeKey
cela permet d'afficher dans la fenêtre exécution les valeurs successives de
ta variable. La valeur qui bloque est la dernière affichée.
Tu peux faire la même chose avec msgbox intShapeKey, mais cela t'oblige à
appuyer sur "entrée" à chaque affichage, pénible si la valeur défaillante
est la centième.
Toujours dans la fenêtre espion tu peux faire afficher
visio.activePage.Shapes ce qui te permettra de visualiser les propriétés de
cet objet.

Normalement dans une fonction les paramètres ne devraient pas changer mais
c'est vrai que vb (et la plupart des langages) ne se préoccupe pas de cela.
Je te conseille de passer les valeur "byval"

Ainsi
Function Test(ByRef X as integer)
X=2*X
Test = X
End function

Test renverra 2 fois son paramètre, mais celui-ci sera aussi changé.

Function Test(Byval X as integer)
X=2*X
Test = X
End function

Test renverra toujours 2 fois son paramètre, mais celui-ci conserve sa
valeur de départ.

Dans le cas un on utilise directement la variable, dans le cas deux on
utilise un copie de la variable qui elle reste bien cachée et est
inaccessible.

Pour en revenir à la récursivité, le parcours d'un arbre est un exemple
classique d'utilisation de la récursivité.

Un arbre est défini en algo par
arbre= vide ou liste (noeud, arbre)
(il s'agit de la structure la plus générale d'arbre, et non pas d'arbre
binaire, le cas le plus courant dans lequel chaque sous-arbre ne comporte
que deux noeuds)
Le parcours se fait ainsi
Action Traiter(arbre)
si non estvide(arbre)
alors
Pourchaque noeud
Traiter(arbre)
Fin Pour
sinon TraiterVide
FinSi
Fin Action

Ainsi pour connaitre le nombre de noeuds d'un arbre

Fonction CompterLesNoeuds(Arbre)
Dim Résultat as integer
Si non EstVide(Arbre)
alors
Résultat=Longueur(Liste)
Pour chaque Noeud
Résultat=Résultat+CompterLesNoeuds(sous-arbre)
Fin POur
sinon
CompterLesNoeuds=Résultat
FinSi
Fin Fonction

Comme je ne sais pas exactement comment tu as implanté ton arbre (structure
de données) et que je ne connais pas exactement ce que tu veux obtenir, je
ne peux pas te traduire directement ta demande en vba.
Salut.

"nemo" a écrit dans le message de
news:18c9301c44b44$4a2ed8e0$
Merci pour la reponse rapide tout d'abord. J'ai essayé
ligne par ligne (je savais pas que ca existait:)) et c la
ligne suivant qui pose probleme apparement

Set shpObjB = Visio.ActivePage.Shapes(intShapeKey)

j'ai beau chercher je vois pas, le intshapekey est
pourtant bien defini et a une valeur a ce moment-la de l
execution. Concernant la recursivité je voudrais savoir
une chose de maniere plus precise: si, dans ma fonction
récursive, j'emploie une variable lambda (c'est le cas
dans ma procedure avec shpObjB), le programme va t il
garder en memoire toutes les valeurs de la variable pour
les reutiliser en temps voulu? (ici par exemple j'emploie
shpObjB au tout debut pour le noeud racine de mon arbre,
ensuite la fonction recursive explore tout l'arbre, de la
racine vers les feuilles, mais en remontant a nouveau vers
la racine la fonction devrait executer des instructions
avec une valeur de shpObjB qui a change au cours de l
execution..). Je sais c'est pas tres clair mais je me
disais que peut-etre ca pourrait etre ca?

En tout cas merci encore pour la reponse, je vais analyser
cette ligne sous toutes les coutures ;-)