Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

changer la valeur d'une Zone de texte par VBA

27 réponses
Avatar
Bernard Rey
Bonjour,=20

J'ai "h=E9rit=E9" d'un classeur Excel truff=E9 de Zones de Texte=20
(de la barre d'outils "Contr=F4les") et j'essaye=20
d=E9sep=E9r=E9ment de trouver comment on doit s'y prendre pour=20
en modifier la valeur, via VBA (Excel 2000).

J'ai fait plusieurs essais, du style :

With Workbooks(Classeur).Sheets(Feuille).Shapes(MaZone)
.Characters.Text =3D "NouvelleValeur" 'entre autres
End With

Mais =E7a me r=E9pond toujours "Propri=E9t=E9 ou m=E9thode non g=E9r=E9e =

par cet objet". J'ai beau faire... aucun r=E9sultat ! Grrrr !

Quelqu'un saurait me dire ce qui m'=E9chappe ? Comment=20
attrape-t-on la valeur d'un "TextBox" ??? Merci,

--=20
Bernard Rey - Toulouse

7 réponses

1 2 3
Avatar
michdenis
Bonjour,

Tous les objets contenus dans une feuille de calcul appartiennent à la collection (classe d'objet) "Shapes".

Cependant, on a regroupé ces objets en des sous-classes d'objet..

Certaines d'entre elles ont été subdivisé pour tenir compte de la diversité des objets.

à titre d'exemple : Pour obtenir la liste des objets appartenant à la famille MsoAutoShape on peut procéder comme ceci:

Dim K As MsoAutoShapeType
K = msoShape32pointStar

Pour obtenir la liste : Entrer les 2 lignes de code précédentes dans une procédure et après avoir typé le symbole "=" excel
vous propose dans une liste déroulante, une liste exhaustive du type d'objet que vous pouvez définir.

'-------------------------------------
Sub LesShapesEtLeurType()

Dim S As Shape
Dim T As MsoShapeType

'Const msoAutoShape = 1
'Const msoCallout = 2
'Const msoChart = 3
'Const msoComment = 4
'Const msoEmbeddedOLEObject = 7
'Const msoFormControl = 8
'Const msoFreeform = 5
'Const msoGroup = 6
'Const msoLine = 9
'Const msoLinkedOLEObject = 10
'Const msoLinkedPicture = 11
'Const msoMedia = 16 (&H10)
'Const msoOLEControlObject = 12
'Const msoPicture = 13
'Const msoPlaceholder = 14
'Const msoScriptAnchor = 18 (&H12)
'Const msoShapeTypeMixed = -2 (&HFFFFFFFE)
'Const msoTable = 19 (&H13)
'Const msoTextBox = 17 (&H11)
'Const msoTextEffect = 15

Dim A As Integer
For Each S In ActiveSheet.Shapes
A = A + 1
Select Case S.Type

Case 1
Range("A" & A) = S.Name
Range("B" & A) = "msoAutoShape"
Range("C" & A) = S.OLEFormat.Object.Name
Case 2
Range("A" & A) = S.Name
Range("B" & A) = "msoCallout"
Range("C" & A) = S.OLEFormat.Object.Name
Case 3
Range("A" & A) = S.Name
Range("B" & A) = "msoChart"
Range("C" & A) = S.OLEFormat.Object.Name
Case 4
Range("A" & A) = S.Name
Range("B" & A) = "msoComment"
Range("C" & A) = S.OLEFormat.Object.Name
Case 5
Range("A" & A) = S.Name
Range("B" & A) = "msoFreeform"
Range("C" & A) = S.OLEFormat.Object.Name
Case 6
Range("A" & A) = S.Name
Range("B" & A) = "msoGroup"
Range("C" & A) = S.OLEFormat.Object.Name
Case 7
Range("A" & A) = S.Name
Range("B" & A) = "msoEmbeddedOLEObject"
Range("C" & A) = S.OLEFormat.Object.Name
Case 8
Range("A" & A) = S.Name
Range("B" & A) = "msoFormControl"
Range("C" & A) = S.OLEFormat.Object.Name
Case 9
Range("A" & A) = S.Name
Range("B" & A) = "msoLine"
Range("C" & A) = S.OLEFormat.Object.Name
Case 10
Range("A" & A) = S.Name
Range("B" & A) = "msoLinkedOLEObject"
Range("C" & A) = S.OLEFormat.Object.Name
Case 11
Range("A" & A) = S.Name
Range("B" & A) = "msoLinkedPicture"
Range("C" & A) = S.OLEFormat.Object.Name
Case 12
Range("A" & A) = S.Name
Range("B" & A) = "msoOLEControlObject"
Range("C" & A) = S.OLEFormat.Object.Name
Case 13
Range("A" & A) = S.Name
Range("B" & A) = "msoPicture"
Range("C" & A) = S.OLEFormat.Object.Name
Case 14
Range("A" & A) = S.Name
Range("B" & A) = "msoPlaceholder"
Range("C" & A) = S.OLEFormat.Object.Name
Case 15
Range("A" & A) = S.Name
Range("B" & A) = "msoTextEffect"
Range("C" & A) = S.OLEFormat.Object.Name
Case 16
Range("A" & A) = S.Name
Range("B" & A) = "msoMedia"
Range("C" & A) = S.OLEFormat.Object.Name
Case 17
Range("A" & A) = S.Name
Range("B" & A) = "msoTextBox"
Range("C" & A) = S.OLEFormat.Object.Name
Case 18
Range("A" & A) = S.Name
Range("B" & A) = "msoScriptAnchor"
Range("C" & A) = S.OLEFormat.Object.Name
Case 19
Range("A" & A) = S.Name
Range("B" & A) = "msoTable"
Range("C" & A) = S.OLEFormat.Object.Name
Case -2
Range("A" & A) = S.Name
Range("B" & A) = "msoShapeTypeMixed"
Range("C" & A) = S.OLEFormat.Object.Name
End Select
Next

End Sub
'-------------------------------------


Salutations!





"michdenis" a écrit dans le message de news:
Bonjour Bernard,

Le code que j'ai donné s'applique à une zone de texte ( zone de texte en provenance de la barre d'outils dessin ), si ton
"Textbox" est issu de la boîte à outils Contrôle, Alain Cross t'a donné un exemple de la ligne de code à utiliser.


Salutations!


"Bernard Rey" a écrit dans le message de news:eeef01c3f148$83f3fb10$
Doit-on sélectionner une zone de texte ou non ? Voici un
exemple de code illustrant les 2 façons de faire :


Est-ce parce que j'utilise Excel 2000 ? En tout cas,
aucune de ces méthodes ne fonctionne :

Dim T As TextBox
Set T = Worksheets(1).Shapes("MaZone").OLEFormat.Object


Là, j'obtiens une "Incompatibilité de type" !

a = TypeName(T)
T.Text = "denis"



Worksheets(1).Shapes("MaZone").Select


Cette fois, la Zone de Texte est bien sélectionnée

a = TypeName(Selection)


Réponse : a = "OLEObject" (jusqu'ici tout va bien)

Selection.Text = "coucou"


Message "Propriété ou Méthode non gérée par cet objet",
bref, comme d'hab :-/


Celle-là aussi fonctionne :

Worksheets(1).Shapes("MaZone").OLEFormat.Object.Text
= "allo"


La routine : "Propriété ou Méthode non gérée par cet objet"

Merci tout de même de ces essais.


En fait, la seule syntaxe qui fonctionne (du moins dans
mon cas) est celle proposée par Frédéric :

Sheets("MaFeuille").TextBox1.Value = "ce qu'on veut"

Note : cette syntaxe est tout de même étonnante, puisque
"TextBox1" est le nom effectif du contrôle. Il semble
impossible de le remplacer par une variable, comme ici
(échec garanti chez moi) :

MaVariable = "TextBox1"
Sheets("MaFeuille").MaVariable.Value = "n'importe"

Mais bon, c'est juste la curiosité. Au moins j'arrive à
faire remplir le formulaire en automatique, maintenant, je
ne vais pas me plaindre, c'était tout de même le but...

Encore merci à tous les intervenants, et toutes mes
excuses pour mon insistance naïve...

--
Bernard Rey - Toulouse

Avatar
Bernard Rey
Bonjour Bernard,


Bonjour Michel (?)

Le code que j'ai donné s'applique à une zone de texte
(zone de texte en provenance de la barre d'outils dessin)


D'où les problèmes...

si ton "Textbox" est issu de la boîte à outils Contrôle,


Eh oui, et ça faisait partie de ma question initiale. Je
n'utilise *JAMAIS* les outils de la boîte Contrôle en ce
qui me concerne (de plus cette boîte n'existe carrément
pas dans la version Mac - que j'utilise à peu près autant
que la version Windows).

Mais là, j'étais confronté à un classeur écrit n'importe
comment (mélange d'objets, de macros enregistrées, etc.)
mais que je ne peux pas modifier et pour lequel j'étais
obligé de trouver une solution de remplissage automatique
(justement pour ne plus l'avoir sous les yeux) ;-)

Alain Cross t'a donné un exemple de la ligne de code à
utiliser.


Oui, et Frédéric une autre. Mais la solution d'Alain me
plaît plus, je l'ai donc adoptée...

Encore (et encore) merci à tous les intervenants,


--
Bernard Rey - Toulouse

Avatar
michdenis
Bonjour,

Si vous avez des objets appartenant à la barre d'outils "Formulaire" et à la barre d'outils "Contrôle", avez-vous déjà
remarqué qu'en cliquant sur un bouton radio, si ce dernier appartient à la barre d'outils formulaire, la cellule de la
feuille de calcul qui était sélectionnée demeure sélectionner lors du clic sur le bouton radio. Il n'en est pas de même si le
bouton radio est issu de la boîte à outils "contrôle". Cela s'applique aussi autres contrôles des barres d'outils.

De fait, les contrôles issus de la barre d'outils "Formulaire" font parti intégrante de l'application excel. La programmation
de leur code est imbriquée dans celle de l'application excel. Les contrôles de la barre d'outils "Contrôle" sont issus de la
technologie "Activex " du début des années 90. Ce sont en fait des objets dont leur code complet est défini dans un fichier
extérieur à excel et qui sont indépendants d'excel. Le même fichier .dll peut aussi bien servir à l'application Word,
PowerPoint ... Il devient alors évident pourquoi les contrôles issus de la barre d'outils "formulaire" n'ont pas évolué. Il
est beaucoup plus facile de modifier un fichier .dll contenant un contrôle et de le distribuer après modifications que de
modifier le code d'un contrôle formulaire... les modifications faites au code dans l'application Excel ne s'applique pas
nécessairement dans les autres applications Microsoft....

Comme les contrôles issus des 2 barres d'outils sont du même genre, "Textbox", "combobox", "optionbutton", il a fallut créer
une hiérarchie de ces objets. Je crois c'est ce qui explique que l'on doive utiliser "object.object" pour désigner l'objet
lui-même, si il appartient à la collection "OleObjects" . C'est comme si ces objets appartenaient à un niveau inférieur dans
l'hiérarchie des objets de la classe Shape.

Je ne connais pas vraiment un bon livre sur le sujet qui traite particulièrement de ce sujet. Si quelqu'un en connaît,
j'aimerais bien qu'il partage sa bibliographie sur ce thème.


Salutations!





"Daniel.M" a écrit dans le message de news:
Alain,


Workbooks(Classeur).Sheets(Feuille).Shapes(MaZone).OLEFormat.Object.Object.Text

= "NouvelleValeur"

2 fois Object!?!
Taboire! Il va me falloir un cours sur la hierarchie des objets Excel! Surtout
en ce qui concerne les Shapes.

Merci bien,

Daniel M.

Avatar
Daniel.M

Par contre, Taboire ?, c'est un HS spécial JPS ?



:-) Non, mais c'est vrai qu'il pourrait l'adopter.

C'est une onomatopée un peu vieillote de chez nous qui traduit l'inconfort
(prononcez tabwère). :-)

Daniel M.

Avatar
Daniel.M
Merci Denis pour les renseignements et la petite histoire de ces contrôles.

Daniel M.
Avatar
Frédéric Sigonneau
Bonsoir,

Juste pour le schmilblick, parce qu'il est bien évident que tu choisis la
solution qui te convient, il n'est pas nécessaire d'activer ou de sélectionner
le classeur pour utiliser la syntaxe que je t'ai proposée. Tu peux parfaitement
écrire, dans le code d'un autre classeur que Classeur1.xls :

Workbooks("Classeur1.xls").Sheets("Feuil1").TextBox1.Value = "coucou"

S'il est important pour toi de pouvoir passer par une collection d'objets, la
collection OLEObjects autorise une syntaxe plus concise (façon de parler :) que
Shapes (en tout cas avec Excel XP, mais je pense que c'est OK pour 2000 et 97
également) :

Workbooks("Classeur1.xls").Sheets("Feuil1"). _
OLEObjects("textbox1").Object.Value = "coucou"

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Essaye comme ça :
Workbooks(Classeur).Sheets(Feuille).Shapes
(MaZone).OLEFormat.Object.Object.Text = "NouvelleValeur"


Oui Alain ! Merci ! Comme ça ça marche. De plus, ça a
l'avantage (par rapport à la méthode indiquée par
Frédéric) de ne pas nécessiter l'activation du classeur.
Pas que ce soit dramatique, mais par certains côtés, c'est
tout de même plus "propre" comme ça ;-)

Encore merci (et encore merci à tous) !

--
Bernard Rey - Toulouse



Avatar
Bernard Rey
Frédéric Sigonneau :
Juste pour le schmilblick, parce qu'il est bien évident
que tu choisis la solution qui te convient, il n'est pas
nécessaire d'activer ou de sélectionner le classeur pour
utiliser la syntaxe que je t'ai proposée. Tu peux
parfaitement écrire, dans le code d'un autre classeur
que Classeur1.xls :

Workbooks("Classeur1.xls").Sheets
("Feuil1").TextBox1.Value = "coucou"


En effet, au temps pour moi ! Merci pour cette relance !
A force de tentatives infructueuses, j'ai dû finir par ne
plus avoir les évidences en face des trous ;-)

S'il est important pour toi de pouvoir passer par une
collection d'objets,


Pas spécialement, en ce qui me concerne. Mais dans
d'autres situations, peut-être...

la collection OLEObjects autorise une syntaxe plus
concise (façon de parler :) que Shapes (en tout cas avec
Excel XP, mais je pense que c'est OK pour 2000 et 97
également) :

Workbooks("Classeur1.xls").Sheets("Feuil1"). _
OLEObjects("textbox1").Object.Value = "coucou"


Je note dans mes tablettes aussi. Match nul, donc (c'est
moi dans le rôle du nul, bien sûr) ;-)))

--
Bernard Rey - Toulouse



Essaye comme ça :
Workbooks(Classeur).Sheets(Feuille).Shapes
(MaZone).OLEFormat.Object.Object.Text = "NouvelleValeur"


Oui Alain ! Merci ! Comme ça ça marche. De plus, ça a
l'avantage (par rapport à la méthode indiquée par
Frédéric) de ne pas nécessiter l'activation du classeur.
Pas que ce soit dramatique, mais par certains côtés,
c'est tout de même plus "propre" comme ça ;-)

Encore merci (et encore merci à tous) !

--
Bernard Rey - Toulouse





1 2 3