Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

shape text box: restituire nome e contenuto dell'oggetto forma

96 views
Skip to first unread message

RE.MOTO

unread,
May 29, 2022, 1:43:21 PM5/29/22
to
Buon pomeriggio. Perdonata la mia ignoranza:
se questa istruzione:
ActiveSheet.Shapes(Application.caller).Name
msg box ActiveSheet.Shapes(Application.caller).Name

mi restituisce il tipo-nome di oggetto-forma su cui ho fatto click, l'istruzione
ActiveSheet.Shapes(Application.caller).Text
oppure
ActiveSheet.Shapes(Application.caller).Value
dovrebbe restituirmi il contenuto dell'oggetto-forma che in questo caso sarebbe un testo? ovvero il nome di un mese? Ma non lo fa! Cosa sbaglio?

Ringrazio anticipatamente

RE.MOTO

by....@gmail.com

unread,
May 29, 2022, 1:52:25 PM5/29/22
to
Il giorno domenica 29 maggio 2022 alle 19:43:21 UTC+2 RE.MOTO ha scritto:

Ciao a che ti serve sapere il testo di una forma, puoi invertire il processo

scrivere in una cella il testo o valore che vuoi dare alla forma, a questo punto basta sapere il valore della cella.

Ciao By Sal (8-D

RE.MOTO

unread,
May 29, 2022, 2:14:41 PM5/29/22
to
Capito. Non so se fa al caso mio, ma sto costruendo una macro che viene chiamata tutte le volte in cui in foglio1 faccio click sul nome di un mese contenuto in 12 textbox in modo che a seconda del texbox contenente il mese su cui si è fatto click vengono gettati dei valori in foglio 2 nella cella E2. Avevo trovato quella porzione di codice che ho creduto potesse fare al caso mio ma non riesco a farmi restituire il contenuto della text box su cui faccio click. In altre parole nella macro ad un certo punto dovrò scrivere Foglio2(E2) - lo so che non si scrive così - = il contenuto della textbox1.

Oddio non lo so se sono riuscita spiegarmi .. lo spero, è difficilissimo!

RE.MOTO

by....@gmail.com

unread,
May 30, 2022, 1:44:04 AM5/30/22
to
Ciao definiamo un poco il pulsante per il mese, è una shape cioè una forma oppure è un textbox creato con activex.

nel primo caso, a te non interessa il testo che contiene lo shape, in quanto puoi collegare lo shape a qualsiasi macro crei la macro per Gennaio e la colleghi allo shape.
se poi hai una macro uguale per tutti i mesi che discrimina il testo dello shape, puoi fare in 2 modi o ti leggi il nome assegnato allo shape oppure gli assegni allo shape tu il nome del mese, fatto questo sai il caller premuto a quale mese si riferisce.

nel secondo caso già conosci il Textbox, quindi textbox1 sarà gennaio e cosi di seguito

comunque potresti usare 1 cella di convalida per scegliere il mese invece di 12 pulsanti, più pulito e sicuro di non sbagliare

comunque senza un esempio mi resta difficile consigliarti

Ciao By Sal (8-D

casanmaner

unread,
May 30, 2022, 1:47:31 AM5/30/22
to
Il giorno domenica 29 maggio 2022 alle 19:43:21 UTC+2 RE.MOTO ha scritto:
Dovrebbe essere

ActiveSheet.Shapes(Application.caller).OleFormat.Object.Value

RE.MOTO

unread,
May 30, 2022, 4:12:20 AM5/30/22
to
Buongiorno By Sal, buongiorno Casanmaner, rispondo a ritroso.
Casanmaner ho provato il tuo suggerimento ma VBA non lo accetta restituendo codice di errore 438 con messaggio "Proprietà o metodo non supportato dall'oggetto". Poi all'istruzione che ho postato io ho provato ad anteporre MSGBOX VAL(tutta l'istruzione) com test ma restituisce 0. Avrebbe dovuto restituire Gennaio se c'è scritto gennaio. Invece no, restituisce "0", sai dirmi il perché ?

By Sal dunque trattasi di oggetti moduli (non-userform). Inizialmente erano shape rettangoli, ma visto che ci sono le caselle di testo ho preferito queste pensando che scrivendo all'interno il nome del mese e trasformato in numero esso potesse essere veicolato in una cella.
Non ho voluto/potuto usare in questo caso le celle di convalida, sebbene molto più facili da usare e gestire, perché la videata dispone alla vista dell'operatore i mesi lungo un asse orizzontale e facendo click sul mese desiderato si richiedono le cosiddette "esigenze di servizio" ovvero risorse umane necessarie per supportare un turno di lavoro per il quale sono richieste particolari prestazioni esterne al luogo di lavoro. Cerco di fare compiere meno click possibili e movimenti col mouse. Certo hai colto bene By Dal, vorrei usare la stessa macro per gestire le chiamate dei 12 mesi e, a secondo del mese chiamante di foglio1, la macro deve scrivere dei numeri da 1 a 12 in una determinata cella di foglio2. A me può stare bene anche se scrive il mese in lettere, poi la formattazione della cella ricevente lo converte in numero.
Pensavo di usare un Select Case ma non riesco a trovare una istruzione semplice che legga e restituisca il contenuto della CasellaDiTesto. In effetti però, a pensarci mentre scrivo, dici bene che non serve il contenuto del textbox... Se A ha chiamato scrivi , ho capito.
E' chiaro che se adotto la soluzione "Se la forma1 ha chiamato scrivi gennaio in Foglio2 cella E2" moltiplicato per 12 volte dovrebbe funzionare ma volevo riuscire a scrivere una macro più sintetica.
E quindi la mia idea è la seguente (ma non so se tecnicamente è sostenibile):

1) Dichiaro di avere delle textbox numerate da textbox16 a textbox27
2) Dichiaro che per ciascuna delle 12 textbox corrisponde un mese
3) Per ciascuna textbox che ha chiamato il contenuto (cioè il mese) converti in numero
4) Scrivi il contenuto del mese nel foglio2 cella E2.

Se i 4 punti sono filologicamente corretti di questi dovrei essere capace di scrivere il punto 3 e 4 e parte del punto 1. Smanettando e scopiazzando dovrei riuscire a completare il tutto.
Se esiste invece una istruzione simile a quella che mi ha fornito Casanmamer che restituisce il contenuto dell'oggetto chiamante anziché il nome sarei a cavallo cioè credo che scriverei una cosa più lunga di quanto vorrei ma mi consolerebbe il raggiungere il risultato.

grazie per l'attenzione

RE.MOTO

RE.MOTO

unread,
May 30, 2022, 4:41:08 AM5/30/22
to
Dunque forse ci sono. Questo topic di Mauro Gamberini farebbe al caso mio. Mi restituisce adeguatamente riadattato il nome del mese. Ora vediamo cosa riesco a combinare...
https://answers.microsoft.com/it-it/msoffice/forum/all/ottenere-il-testo-di-un-oggetto-shape/556b18f7-6c4e-402f-8b92-55caea146868

RE.MOTO

casanmaner

unread,
May 30, 2022, 4:47:29 AM5/30/22
to
Il giorno lunedì 30 maggio 2022 alle 10:12:20 UTC+2 RE.MOTO ha scritto:
> Buongiorno By Sal, buongiorno Casanmaner, rispondo a ritroso.
> Casanmaner ho provato il tuo suggerimento ma VBA non lo accetta restituendo codice di errore 438 con messaggio "Proprietà o metodo non supportato dall'oggetto". Poi all'istruzione che ho postato io ho provato ad anteporre MSGBOX VAL(tutta l'istruzione) com test ma restituisce 0. Avrebbe dovuto restituire Gennaio se c'è scritto gennaio. Invece no, restituisce "0", sai dirmi il perché ?
>
Io avevo provato con un oggetto grafico di testo e non mi dava errori.
Avevo inserito una forma "casella di testo".
Tu che oggetto hai inserito?

RE.MOTO

unread,
May 30, 2022, 5:26:42 AM5/30/22
to
Capito Casanmaner. E se volessi utilizzarlo su un oggetto appunto quale una textbox non-useform?
Grazie

RE.MOTO

casanmaner

unread,
May 30, 2022, 8:30:20 AM5/30/22
to
Il giorno lunedì 30 maggio 2022 alle 11:26:42 UTC+2 RE.MOTO ha scritto:
> Capito Casanmaner. E se volessi utilizzarlo su un oggetto appunto quale una textbox non-useform?

Se intendi i controlli activex mi sa che occorre affidarsi a un modulo di classe per intercettare gli eventi senza dover creare una routine per ciascun controllo.

RE.MOTO

unread,
May 30, 2022, 8:48:50 AM5/30/22
to
Allora avrei risolto in questo modo. Grazie ai commenti riportati nel link richiamato al mio messaggio precedente, ho potuto lavorare su due istruzioni molto efficaci soprattutto la seconda più della prima.Eccole in ordine:
1) ActiveSheet.Shapes(Application.Caller).Name
mShape=ActiveSheet.Shapes(Application.Caller).Name
ActiveSheet.Shapes(mShape).Select
MsgBox Selection.Characters.Text

2)ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Text

Entrambe rilevano il contenuto dell'oggetto che ha effettuato una chiamata: per esempio una textbox a cui è stata associata una macro. Le istruzioni rilevano l'oggetto che ha effettuato la chiamata macro, la seleziona e ne estrae contenuto (dell'oggetto).
Mentre la prima effettua il compito in più passaggi, la seconda nella stessa istruzione contempla sia la chiamata alla macro proveniente dall'oggetto a cui la macro è stata associata che il testo contenuto nell'oggetto che ha effettuato la chiamato macro. Non so se mi sono spiegato bene. Per fare un esempio: se textbox1 contiene la parola "gennaio" con un test MsgBox, il messaggio mi restituisce "gennaio" poi con una sempre lavorazione della stringa generata otterrò "01". In definitiva posso dire di avere risolto.
Grazie

RE.MOTO

RE.MOTO

unread,
May 30, 2022, 8:51:35 AM5/30/22
to
ho risolto così:

Sub Esigenze_per_Mese()
Dim tbxmth As String
Sheets("ESIGENZE").Visible = True
Sheets("DISTRIBUZIONE").Select
txbx = ActiveSheet.Shapes(Application.caller).TextFrame.Characters.Text
mymese = 1 & " " & txbx
N = Month(mymese)
Sheets("ESIGENZE").Range("E2").Value = N
Sheets("DISTRIBUZIONE").Visible = False
End Sub

Grazie
RE.MOTO


P.S.: che ne dite?

casanmaner

unread,
May 30, 2022, 8:59:20 AM5/30/22
to
Se funziona e soddisfa le tue esigenze vuol dire che va bene :-)
Per quanto riguarda la gestione del modulo di classe degli eventi dell'activex questo potrebbe essere un esempio

Nel progetto vba ho aggiunto un modulo di classe nominato "Classe1" dove ho inserito questo codice:

Option Explicit

Public WithEvents oTextBox As MSForms.TextBox

Private Sub oTextBox_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox oTextBox.Value
End Sub

Ho inserito un modulo standard nominato "Modulo1" dove ho inserito questo codice:

Option Explicit

Dim oTextControls() As New Classe1

Sub ImpostaOggettiTextBox()
Dim ctrl As OLEObject
Dim cont As Long
Dim ws As Worksheet
Set ws = ActiveSheet '<--- settare il foglio che contiene i controlli
For Each ctrl In ws.OLEObjects
If TypeName(ctrl.Object) = "TextBox" Then
cont = cont + 1
ReDim Preserve oTextControls(1 To cont)
Set oTextControls(cont).oTextBox = ctrl.Object
End If
Next ctrl
End Sub

Ho lanciato la sub "ImpostaOggettiTextBox" per caricarli in memoria (questa routine potrebbe essere lanciata all'apertura del file o quando viene attivata la cartella di lavoro).

Quando eseguo il doppio click all'interno dei textbox viene lanciato il messaggio con il valore presente nel textbox.

RE.MOTO

unread,
May 30, 2022, 9:53:06 AM5/30/22
to
Provo un pò di vergogna a scriverlo ma è la realtà non ho mai provato a scrivere un modulo classe perché ho un netto rifiuto tra immotivato. Tutte le volte che mi imbatto in esso storco gli occhi. Quello che non capisco il motivo per il quale debba appoggiarmi su una programmazione diciamo parallela. Grazie

RE.MOTO

casanmaner

unread,
May 30, 2022, 10:33:05 AM5/30/22
to
Il giorno lunedì 30 maggio 2022 alle 15:53:06 UTC+2 RE.MOTO ha scritto:
> Provo un pò di vergogna a scriverlo ma è la realtà non ho mai provato a scrivere un modulo classe perché ho un netto rifiuto tra immotivato. Tutte le volte che mi imbatto in esso storco gli occhi. Quello che non capisco il motivo per il quale debba appoggiarmi su una programmazione diciamo parallela. Grazie
>
In questo caso il motivo starebbe nel fatto che puoi gestire il medesimo evento per più controlli.
Mettiamo che tu abbia 12 pulsanti che, quando clicchi, fanno qualcosa di piuttosto standard ma che si differenzia in base al nome del pulsante su cui si è cliccato
Dovresti ripetere 12 volte il codice per l'evento "click" (dove molte righe sarebbero di comando sarebbero del tutto simili e con differenze solo per altre cose).
Utilizzando il modulo di classe e creando la "collezione" di pulsanti presenti puoi gestire tutto con un unico evento a cui dire cosa fare in base al pulsante su cui si è cliccato.

RE.MOTO

unread,
May 30, 2022, 11:26:40 AM5/30/22
to
Capito. Chiara la spiegazione, chiarissima. Grazie
Mi vien da pensare che forse nel mio progetto ne avrei dovuto usare un pò di classi. Vedrò in seguito.

RE.MOTO
0 new messages