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
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ;-)
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 ;-)
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 ;-)
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 ;-)
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" <tsuefnal@hotmail.com> a écrit dans le message de
news:18c9301c44b44$4a2ed8e0$a001280a@phx.gbl...
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 ;-)
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 ;-)