Identificare una Forma (Shapes) e lavorarci. - dal 04/09/04 pagina vista: volte

articolo correlato: "Lavorare con gli "oggetti"    (27/03/05) ActiveX e non"

Esiste già un articolo sufficientemente chiarificatore sugli Shapes (Forme, ma anche Immagini) sull'altro sito, sezione vba, l'articolo "Shapes(Forme) lavorare con gli..", ma continuano domande su come identificare uno Shape, in particolare uno Shape "Immagine"posto su un foglio di lavoro, per copiarlo in un'altra posizione.

Premesso che esiste la possibilità di usare un'istruzione appropriata per compiere un copia/incolla di un'immagine posta su un foglio di lavoro, che si basa sul metodo CopyPicture, che vediamo sotto, inserisco a seguire dei suggerimenti che valgono per tutti i tipi di Forme.

Routine che sfrutta il metodo CopyPicture: le istruzioni prevedono di definire le celle comprese dalla dimensione dell'immagine: se l'immagine è piccola e ricopre una sola cella, indicheremo il riferimento a quella cella, altrimenti indicheremo l'intervallo delle celle interessate. Nell'esempio stiamo supponendo che l'immagine interessi la zona B13:E17; per la destinazione invece sarà sufficiente indicare una sola cella, quella da cui inizierà l'incollaggio

Sub CopiaImmagine()
Worksheets("Foglio1").Range("B13:E17").CopyPicture xlScreen, xlBitmap
Worksheets("Foglio2").Paste Destination:=Worksheets("Foglio2").Range("B2")
End Sub

Passiamo agli Shapes (o Forme). Per spiegare come poter individuare una Forma, è necessario precisare che esistono molti tipi di Forme che possiamo inserire in un Foglio, ed ognuna viene identificata oltre che dal nome della Forma, seguito dal suo numero indice, anche dal TIPO di Forma. (il numero indice viene assegnato da Excel, in maniera progressiva, a secondo del numero delle forme già inserite, anche se poi cancellate, INDIPENDENTEMENTE dal tipo). Per identificare il Tipo possiamo usare una delle seguenti costanti degli Shapes (sono Proprietà MsoShapeType), oppure il numero che rappresenta la costante:

num.

proprietà

num.

proprietà

1 msoAutoShape 11 msoLinkedPicture
2 msoCallout 16 msoMedia Non può essere utilizzata con questa proprietà. Questa costante è utilizzata con le forme nelle altre applicazioni di Microsoft Office.
20 msoCanvas 12 msoOLEControlObject
3 msoChart 13 msoPicture
4 msoComment 14 msoPlaceholder Non può essere utilizzata con questa proprietà. Questa costante è utilizzata con le forme nelle altre applicazioni di Microsoft Office
21 msoDiagram 18 msoScriptAnchor
7 msoEmbeddedOLEObject -2 msoShapeTypeMixed
8 msoFormControl 19 msoTable
5 msoFreeform 17 msoTextBox
6 msoGroup 15 msoTextEffect
9 msoLine 10 msoLinkedOLEObject

Ci troviamo quindi di fronte alla necessità, sia di identificare il nome, sia il tipo per poter identificare uno Shape. Una routine veloce che può fornirci il nome ed il tipo (numero) di ogni Forma presente su un foglio, può essere questa:

Sub TutteLeForme()
Set MioDoc = Worksheets(1)
For Each sh In MioDoc.Shapes
MsgBox sh.Name & " di tipo " & sh.Type
Next
End Sub

Questa ci fornirà nome e Tipo di ogni Forma, esempio:

dove "Picture 3" indica il nome di un'immagine presente sul foglio, e inserita come terza Forma, ed il suo tipo MsoShapeType che corrisponde al n. 13 (vedi tabella sopra).

Per lavorare con una Forma, va prima selezionata, e quindi useremo il metodo Select. Potremo anche creare un ciclo che identifichi tutte le Forme appartenenti ad un determinato tipo. Creeremo un'istruzione If..Then specificando il Tipo di Shape che intendiamo selezionare, e una volta trovato, usciremo dal ciclo selezionandolo. Potranno seguire istruzioni su cosa farcei, per esempio, copiarlo in un'altra destinazione, indicando foglio, se diverso da quello di provenienza, e cella in cui incollare. Vediamo una routine:

Sub TrovaESeleziona()
Set MioDoc = Worksheets(1)
For Each sh In MioDoc.Shapes
If sh.Type = msoPicture Then  '
(oppure sh.Type = 13, che è equivalente)

sh.select

Exit For

End If
Next

'....seguono istruzioni su cosa fare con lo Shape selezionato
End Sub

In questo modo selezioneremo uno Shape "Immagine", ma se le immagini sono più di una ? Dovremo creare una condizione che ci consenta di scegliere quale "Immagine" selezionare. La maniera che propongo è quella di porre una domanda : se sarà quella giusta, la selezioneremo, ed usciremo dal ciclo, altrimenti le passiamo in rassegna tutte fino a che non viene scorsa quella che cerchiamo. Vediamo una possibile routine.

Sub TrovaESeleziona2()
Set MioDoc = Worksheets(1)
For Each sh In MioDoc.Shapes
If sh.Type = msoPicture Then  '
(oppure sh.Type = 13, che è equivalente)

Dim idomanda As Integer

idomanda = MsgBox("Questa è un'immagine, vuoi selezionare la " & sh.Name & " ?", vbYesNo)
If idomanda = vbYes Then
sh.Select

Exit For

End If
Next

'....seguono istruzioni su cosa fare con lo Shape selezionato
End Sub

Vediamo le istruzioni da inserire se volessimo copiare l'immagine selezionata sol foglio2, nella cella D9:

......istruzioni sopra per la ricerca

Selection.Copy
Worksheets(2).Activate
Range("D9").Select
ActiveSheet.Paste

End Sub

Queste routine si possono eseguire differenziando il tipo di Forma da cercare, oppure anzichè copiarla, eseguire altre istruzioni.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org