Utilisation de "ActiveSheet.Shapes"
Bonjour à tous,
J'ai construit sous Excell VBA un produit afin de pouvoir gérere mon arbre généalogique.
Ce workbook posséde plusieurs feuilles dont une (appelée "arbre") contient mon arbre généalogique construit à partir de "Zone de texte", chacune contenant le nom d'un membre de mon arbre (voir un extrait : image ci dessous)
Si je clique sur un des noms j'ouvre un Userform qui me met en évidence tous les renseignements relatifs à l'état civil de la personne (date de naissance, de décès, de mariage, ses enfants, etc ...). Pour cela je'extrait de la "zone de texte" le nom qu'elle contient grace à l'instruction
nom = ActiveSheet.Shapes("ZoneTexte " & zonenom).TextFrame.Characters.Text 'récupération du texte de la zone de texteTout marche à merveille et j'en profite pour remercier les personnes qui m'ont aidé à résoudre les petites questions que je me suis posées, et en particulier LouRed et Eriiic
Mais voila, j'ai voulu agrémenter mon produit en ajoutant un Userform "Menu" qui apparait dès le lancement de mon produit
En cliquant sur le bouton "Voir mon arbre" j'accède à la feuille "arbre" présentée ci-dessus afin de pouvoir utiliser la procédure précédente ..... et la ça ne marche plus, j'ai un message d'erreur si je clique sur un nom afin d'utiliser le bout de code présenté ci-dessus
Message d'erreur : "l'élément portant ce nom est introuvable"
Quelle peut en être la raison ?
Merci à vous de bien vouloir vous pencher sur cette question
bonjour Jacky,
la feuille "active", elle est la même à ce moment, vous n'êtes pas dans une autre feuille ?
Bonjour BsAlv,
Je ne comprends pas très bien, pour accéder à la feuille "arbre" à partir de mon menu j'utilise le code suivant en cliquant sur le bouton adéquat
Private Sub Bt_arbre_Click()
Worksheets("arbre").Activate
Worksheets("arbre").Select
Usf_intro.Hide
End Subferais-je une erreur ?
De plus en cherchant je me suis aperçu qu'en utilisant le menu, quand je veux extraire le nom de la personne inscrit dans la ""Zone de texte", le nom de cette dernière (qui est un nombre) n'est plus reconnu
nom = ActiveSheet.Shapes("ZoneTexte " & zonenom).TextFrame.Characters.Text 'récupération du texte de la zone de textezonenom = " " alors qu'il devrait être égal au numéro de la "Zone de texte" cocernée
re,
apparament, cela n'est pas le problème.
Y-a-t-il plusieurs shapes avec le même nom dans votre feuille ? Demandez la position avec. Si ce n"est pas la cellule que vous pensez, alors, il y a des doublons ... (mais c'est difficile de le dire sans fichier)
with ActiveSheet.Shapes("ZoneTexte " & zonenom)
msgbox .TextFrame.Characters.Text & vblf & .topleftcell.address
end withre,
Bart, je ne peux pas utiliser votre bout de code car zonenom est vide
En effet j'ai plusieurs Shapes dans ma feuille, mais ils ont tous un nom différent
De plus si je passe pas par mon Userform Intro, tout se passe bien et votre petit bout de code me donne bien l'adresse de la cellule sur laquelle se trouve la "zone de texte"
J'en perds mon latin !!
Cordialement
Bonjour,
Il n'y a, à priori, aucune raison ici d'utiliser ActiveSheet.
Remplace donc tes ActiveSheet par Worksheets("arbre").
nom = WorkSheets("arbre").Shapes("ZoneTexte " & zonenom).TextFrame.Characters.Textou, encore mieux, dans un bloc With :
With WorkSheets("arbre")
nom = .Shapes("ZoneTexte " & zonenom).TextFrame.Characters.Text
End WithSi, la variable zonenom est vide, il y a une raison liée au code. Donne nous donc l'intégralité du code déclenché lors du clic sur une Shape.
De plus, la commande Usf_intro.Hide ne fait que "masquer" ledit UserForm.
Pour le "fermer", utilise plutôt la commande Unload Me :
Private Sub Bt_arbre_Click()
Worksheets("arbre").Activate
Worksheets("arbre").Select
UnLoad Me
End SubBonjour Franck
Voici le bout de code qui me permet d'extraire le nom de la personne apparaissant dans ma zone de Texte
nom = WorkSheets("arbre").Shapes("ZoneTexte " & zonenom).TextFrame.Characters.Text 'récupération du texte de la zone de texte
sosa = Val(nom)
place = sosa + 2
nom = Mid(nom, InStr(InStr(nom, Chr(10)) + 1, nom, Chr(10))) ' supprime les sauts de ligne
nom = Mid(nom, 2) ' supprime les Chr(10)
.Txt_nom.Value = nomSi je ne passe pas par mon Userform "menu" tout marche bien, sinon zonenom, qui en fait n'est que le numéro de la Zone de Texte, est vide
Si ce bout de code est insuffisant pour que tu puisses trouver et résoudre le problème, je peux te faire parvenir, en message privé, la totalité du fichier concernant ma généalogie, il fait environ 125 Ko
Bien cordialement
Jacky
Je n'ai pas besoin de ton fichier, mais juste du code complet se déclenchant au clic sur ta Shape. Y compris ce qu'il y a avant et après "nom = WorkSheets("arbre").Shxxx".
De Sub Machin() à End Sub.
Bonjour,
Je peux me tromper mais... En me crevant les yeux sur ton image, j'ai bien l'impression que la feuille contenant toutes les zones de Texte ne s'appelle pas "arbre" ?
En tout cas ce n'est pas ce qu'on voit sur l'image...
A+
Non galopin, il s'agit bien de la feuille "arbre", la preuve :
Franck, voici ce que tu me demandes
Private Sub UserForm_Activate()
Dim l, h, I, J, T, sosa, place, htemoin, rang, rang2, henfants As Integer
Dim nom, chemin, naissance, deces, Union As String
Dim feuille As Worksheet
Set feuille = Worksheets("données")
l = Application.Width
h = Application.Height
With Usf_details
.StartUpPosition = 0
.Left = 0
.Top = 0
.Width = l - 8
.Height = h
' Titre
Call presentation(.Txt_nom, 8 * l / 10, 40, 50, l / 10)
'recherche du sosa et du nom et prénom
nom = Worksheets("arbre").Shapes("ZoneTexte_" & zonenom).TextFrame.Characters.Text 'récupération du texte de la zone de texte
sosa = Val(nom)
place = sosa + 2
nom = Mid(nom, InStr(InStr(nom, Chr(10)) + 1, nom, Chr(10))) ' supprime les sauts de ligne
nom = Mid(nom, 2) ' supprime les Chr(10)
.Txt_nom.Value = nom
' recherche du numéro d'ordre de l'individu choisi
For I = 3 To feuille.Range("A65536").End(xlUp).Row
If feuille.Range("A" & I).Value = sosa Then
place = sosa + 2
' Individu
' sa naissance
date_naissance = feuille.Range("C" & place).Value
lieu_naissance = feuille.Range("D" & place).Value
temoin1_naissance = feuille.Range("E" & place).Value
temoin2_naissance = feuille.Range("F" & place).Value
naissance = "né(e) le : " & date_naissance & " à " & lieu_naissance
If temoin1_naissance = "" And temoin2_naissance = "" Then
témoins_naissance = ""
Else
temoins_naissance = "furent témoins : " & temoin1_naissance & " et " & temoin2_naissance
End If
naissance = naissance & " " & temoins_naissance
Call presentation(txt_naissance, 8 * l / 10, 30, 150, l / 10)
.txt_naissance.Value = naissance
' son décès
................. 'ensuite ça concerne la gestion des données d'état civil, comme ce fut le cas pour la naissance
Next I
End With
End SubMais j'en suis désolé d'insister, tout fonctionne à merveille si je supprime l'Userform "Menu" et accède directement à la feuille "arbre" dès l'ouverture du fichier
Pas encore. Mais on avance. Sissi!
zonenom est déclarée ou? Comment?
La Sub que je souhaites également c'est celle du clic sur la Shape. Là tu me donnes le code d'activation de l'UserForm.
re,
zonenom est déclaré en début de procédure : dim zonenom as Integer (j'ai hésité entre integer et String, mais pas bien longtemps
La Sub que je souhaites également c'est celle du clic sur la Shape. Là tu me donnes le code d'activation de l'UserForm.
Là je ne comprends pas, car je n'ai nullement eu besoin de créer une Sub en cliiquant sur ma Shape, dès que je place ma souris sur la Shape le curseur se transforme en une main et si je clique toute la procédure se met en route et j'obtiens ce que je veux (bien sur si je ne passe pas par mon "Menu"). Pour se faire j'ai au préalable construit une macro pour chacune des Zones de Texte
Voici par exemple la macro qui correspond à la zone de texte 276
Sub ZoneTexte276_Cliquer()
zonenom = Worksheets("arbre").Shapes("ZoneTexte 276").Name
zonenom = Mid(zonenom, 9) ' pour ne conserver que le nom sans le numéro sosa
Usf_details.Show
End SubJ'espère t'éclairer
zonenom est déclaré en début de procédure : dim zonenom as Integer
zonenom doit être déclarée en dehors de toutes procédures, dans l'entête (tout en haut avant tout autre code) d'un Module "standard" (pas un module de feuille, ni d'userform).
Déclare là en Public :
Public zonenom As IntegerEnsuite, as-tu essayé d'UnLoad l'userform intro?
Private Sub Bt_arbre_Click()
Worksheets("arbre").Activate
Worksheets("arbre").Select
UnLoad Me
End SubFranck, j'ai suivi tes conseils et j'ai tpujours le même problème , désolé
Par contre je viens xe découvrir que le zonenom recherché est bien trouvé quand je clique sur la zone texte, donc quand je lance la macro
Sub ZoneTexte276_Cliquer()
zonenom = Worksheets("arbre").Shapes("ZoneTexte 276").Name
zonenom = Mid(zonenom, 9)
MsgBox zonenom
Usf_details.Show
End SubLe MsgBox zone nom me renvoie bien le numéro de la Zone de texte, soit 276
Franck,
J'ai enfin trouvé la raison pour laquelle ma procédure se plantait :
Dans l'appel du nom, par le biais de la macro, ce nom sort en tant que String, il me faut donc le transformer en Integer pour pouvoir l'utiliser dans ma recherche du
Worksheets("arbre").Shapes("ZoneTexte " & nom).TextFrame.Characters.Text mais comme nom doit être un Integer, il me faut le renomer par exemple en numero
Worksheets("arbre").Shapes("ZoneTexte " & numero).TextFrame.Characters.Text et enfin, après avoir modifié ma macro de la façon suivante, je m'en sors
Sub ZoneTexte276_Cliquer()
zonenom = Worksheets("arbre").Shapes("ZoneTexte 276").Name
zonenom = Mid(zonenom, 9)
numero = Val(zonenom)
Usf_details.Show
End SubJe tiens à te remercier énormément pour la patience qui fut la tienne et espère te retrouver le cas échéant sur le forum
Bonne soirée et au plaisir
Bien cordialement
Jacky