Diego ha diversi grafici in una cartella di lavoro. Ogni grafico contiene due caselle di testo con la data dei dati correnti e la data in cui il grafico è stato aggiornato. Diego vorrebbe modificare il testo in queste caselle di testo del grafico con una macro ma non conosce la tecnica corretta per eseguire l’operazione.
Questo, ovviamente, può essere fatto con una macro, ma dovresti capire che esiste un modo per farlo senza una macro. Se lo desideri, puoi collegare ciò che viene mostrato in una casella di testo al contenuto di una cella. Ciò significa che potresti rendere ciascuna delle tue caselle di testo “dinamica” in modo che tutto ciò che devi fare sia cambiare ciò che si trova nella cella associata. Quella cella potrebbe contenere un valore di testo, un valore numerico, una data o una formula: non ha molta importanza.
Ecco come ottenere questa tecnica: seleziona la casella di testo che desideri associare a una cella facendo clic su di essa una sola volta. Le “maniglie” dovrebbero apparire all’esterno della casella di testo. Quindi, nella barra della formula, inserisci un riferimento di cella. Puoi farlo inserendolo in questo modo:
=$C$15
Questo lega il contenuto della casella di testo a qualunque cosa si trovi nella cella C15. Puoi anche, se preferisci, eliminare tutto ciò che si trova nella barra della formula e, con la barra della formula attiva, fare clic sulla cella che desideri collegare. L’indirizzo della cella dovrebbe apparire nella barra della formula. Premi Invio e l’attività è completata.
Ora digita qualcosa nella cella associata. Qualunque cosa digiti dovrebbe apparire immediatamente nella casella di testo.
Invece, prima di poter fornire alcune potenziali risposte relative alle macro, avrai bisogno di un po’ di informazioni di base sul modello a oggetti di Excel, accessibile tramite VBA.
Esistono due tipi di grafici che possono essere contenuti in una cartella di lavoro: un foglio grafico e un grafico incorporato. I fogli grafici sono rappresentati da un oggetto Chart e appartengono alla collezione Charts. I grafici incorporati, invece, sono rappresentati da un oggetto Chart che appartiene alla raccolta ChartObjects che, a sua volta, appartiene a un oggetto Worksheet.
Se posizioni una casella di testo su un foglio grafico, è possibile accedervi nel modo seguente:
Sub FindTextBoxes1()
Dim c As Chart
Dim s As Shape
Dim sMsg As String
Dim sName As String
For Each c In ActiveWorkbook.Charts
For Each s In c.Shapes
If s.Type = msoTextBox Then
sMsg = s.TextFrame2.TextRange.Text
sName = s.Name
MsgBox "Testo: " & sMsg, vbOKOnly, sName
End If
Next s
Next c
End Sub
Questa macro scorre ogni foglio grafico e poi ogni casella di testo su ogni foglio grafico. Tutto ciò che è contenuto in ciascuna casella di testo viene quindi visualizzato in una finestra di messaggio. Se vuoi cambiare il contenuto delle caselle di testo, tutto ciò che devi fare è impostare la proprietà Text dell’oggetto TextRange.
Le caselle di testo sui grafici incorporati sono una storia diversa. Perché? Perché è possibile che la casella di testo non faccia realmente parte del grafico, ma faccia parte del foglio di lavoro. In altre parole, il “genitore” della casella di testo potrebbe essere il grafico incorporato oppure il foglio di lavoro.
Un buon modo per scoprire se la casella di testo fa parte del grafico incorporato è creare una macro simile a quella appena presentata. Questa, tuttavia, può scorrere ogni grafico incorporato in ciascun foglio di lavoro e trovare ogni forma (casella di testo) all’interno di quel grafico.
Sub FindTextBoxes2()
Dim w As Worksheet
Dim c As ChartObject
Dim s As Shape
Dim sMsg As String
Dim sName As String
For Each w In ActiveWorkbook.Worksheets
For Each c In w.ChartObjects
For Each s In c.Chart.Shapes
If s.Type = msoTextBox Then
sMsg = "Questa casella di testo è figlia del "
sMsg = sMsg & "grafico incorporato" & vbCrLf
sMsg = sMsg & "Testo: " & s.TextFrame2.TextRange.Text
sName = s.Name
MsgBox sMsg, vbOKOnly, sName
End If
Next s
Next c
For Each s In w.Shapes
If s.Type = msoTextBox Then
sMsg = "Questa casella di testo è figlia del "
sMsg = sMsg & "foglio di lavoro" & vbCrLf
sMsg = sMsg & "Text: " & s.TextFrame2.TextRange.Text
sName = s.Name
MsgBox sMsg, vbOKOnly, sName
End If
Next s
Next w
End Sub
Quando esegui la macro, vedrai una finestra di messaggio per ogni casella di testo che in realtà è figlia dei grafici incorporati. Verrà quindi visualizzata una finestra di messaggio per tutte le caselle di testo figlie del foglio di lavoro. Come nella macro precedente, anche questa controlla che l’oggetto Shape sia realmente una casella di testo prima di visualizzare qualsiasi informazione su di essa. Ciò è particolarmente importante quando si esamina ogni forma nel foglio di lavoro, poiché anche tutti i grafici incorporati nel foglio sono considerati parte della raccolta Shapes.
Come in precedenza, per modificare il testo contenuto in una casella di testo è sufficiente modificare la proprietà Text dell’oggetto TextRange.