As formas ou objetos de desenho são representadas por três objetos diferentes: a coleção Shapes, a coleção ShapeRange e o objeto Shape. Em geral, você usa a coleção Shapes para criar formas e para fazer uma iteração através de todas as formas em uma determinada planilha; você usa o objeto Shape para formatar ou modificar uma única forma; e usa a coleção ShapeRange quando deseja modificar várias formas da mesma maneira que você trabalha com várias formas na interface do usuário.
Definir propriedades para uma forma
Muitas propriedades de formatação de formas não são definidas por propriedades que se aplicam diretamente ao objeto Shape ou ShapeRange. Ao invés disso, atributos de forma relacionados são agrupados sob objetos secundários, como o objeto FillFormat, o qual contém todas as propriedades relacionadas ao preenchimento da forma ou o objeto LinkFormat, o qual contém todas as propriedades que são exclusivas de objetos OLE vinculados. Para definir propriedades para uma forma, você precisa primeiro retornar o objeto que representa o conjunto de atributos de forma relacionados e, em seguida, definir propriedades desse objeto retornado. Por exemplo, você usa a propriedade Fill para retornar o objeto FillFormat e, em seguida, define a propriedade ForeColor do objeto FillFormat para definir a cor de primeiro plano do preenchimento da forma especificada, conforme mostrado no exemplo seguinte.
Worksheets(1).Shapes(1).Fill.ForeColor.RGB = RGB(255, 0, 0)Aplicar uma propriedade ou método a várias formas ao mesmo tempo
Na interface do usuário, existem algumas operações que você pode efetuar com várias formas selecionadas; você pode, por exemplo, selecionar várias formas e definir todos os seus preenchimentos individuais de uma vez. Existem outras operações que você só pode efetuar com uma única forma selecionada; por exemplo, você só pode editar o texto em uma forma se uma única forma estiver selecionada.
No Visual Basic, existem duas maneiras de se aplicar propriedades e métodos a um conjunto de formas. Essas duas maneiras permitem que você efetue qualquer operação que você possa efetuar em uma única forma em um intervalo de formas, quer você possa ou não efetuar a mesma operação na interface do usuário.
- Se a operação funciona em várias formas selecionadas na interface do usuário, você pode efetuar a mesma operação no Visual Basic construindo uma coleção ShapeRange contendo as formas com as quais você deseja trabalhar e aplicando as propriedades e métodos apropriados diretamente à coleção ShapeRange.
- Se a operação não funciona em várias formas selecionadas na interface do usuário, você ainda pode efetuar a operação no Visual Basic fazendo um loop pela coleção Shapes ou por uma coleção ShapeRange que contenha as formas com as quais você deseja trabalhar, e aplicando as propriedades e métodos apropriados aos objetos Shape individuais na coleção.
Muitas propriedades e métodos que se aplicam ao objeto Shape e à coleção ShapeRange falham quando aplicados a determinados tipos de forma. Por exemplo, a propriedade TextFrame falha quando aplicada a uma forma que não pode conter texto. Se você não tem certeza de que uma determinada propriedade ou método pode ser aplicado a cada uma das formas de uma coleção ShapeRange, não aplique a propriedade ou método à coleção ShapeRange. Se você desejar aplicar uma dessas propriedades ou métodos a uma coleção de formas, você precisará fazer um loop pela coleção e testar cada forma individual para certificar-se de que ela é do tipo apropriado antes de aplicar a propriedade ou método a ela.
Criar uma coleção ShapeRange contendo todas as formas de uma planilha
Você pode criar um objeto ShapeRange contendo todos os objetos Shape de uma planilha selecionando as formas e, em seguida, usando a propriedade ShapeRange para retornar um objeto ShapeRange contendo as formas selecionadas.
Worksheets(1).Shapes.Select
Set sr = Selection.ShapeRangeNo Microsoft Excel, o argumento Index não é opcional para a propriedade Range da coleção Shapes, portanto você não pode usar essa propriedade sem um argumento para criar um objeto ShapeRange contendo todas as formas de uma coleção Shapes.
Aplicar uma propriedade ou método a uma coleção ShapeRange
Se você pode efetuar uma operação em várias formas selecionadas na interface do usuário ao mesmo tempo, você pode fazer o equivalente por programa construindo uma coleção ShapeRange e, em seguida, aplicando as propriedades ou métodos apropriados a ela. O exemplo seguinte constrói um intervalo de formas contendo as formas chamadas "Big Star" e "Little Star" em myDocument e aplica um preenchimento gradual a elas.
Set myDocument = Worksheets(1)
Set myRange = myDocument.Shapes.Range(Array("Big Star", _
"Little Star"))
myRange.Fill.PresetGradient _
msoGradientHorizontal, 1, msoGradientBrassVeja a seguir diretrizes genéricas de como as propriedades e métodos se comportam quando são aplicadas a uma coleção ShapeRange.
- A aplicação de um método à coleção é equivalente à aplicação do método a cada objeto Shape individual dessa coleção.
- A definição do valor de uma propriedade da coleção é equivalente à definição do valor da propriedade de cada forma individual desse intervalo.
- Uma propriedade da coleção que retorne uma constante retorna o valor da propriedade para uma forma individual da coleção se todas as formas da coleção têm o mesmo valor nessa propriedade. Se nem todas as formas da coleção têm o mesmo valor para a propriedade, ela retorna a constante "mista".
- Uma propriedade da coleção que retorne um tipo de dados simples (como Long, Single ou String) retorna o valor da propriedade de uma forma individual se todas as formas da coleção têm o mesmo valor nessa propriedade.
- O valor de algumas propriedades só pode ser retornado ou definido se houver exatamente uma forma na coleção. Se houver mais de uma forma na coleção, ocorrerá um erro em tempo de execução. Isso geralmente é o caso do retorno ou definição de propriedades quando a ação equivalente na interface do usuário só é possível com uma única forma (ações tais como edição de texto em uma forma ou edição dos pontos de uma forma livre).
As diretrizes anteriores também se aplicam quando você está definindo propriedades de formas que estão agrupadas sob objetos secundários da coleção ShapeRange, tais como o objeto FillFormat. Se o objeto secundário representar operações que possam ser efetuadas em vários objetos selecionados na interface do usuário, você poderá retornar o objeto de uma coleção ShapeRange e definir suas propriedades. Você pode, por exemplo, usar a propriedade Fill para retornar o objeto FillFormat que representa os preenchimentos de todas as formas da coleção ShapeRange. A definição das propriedades desse objeto FillFormat definirão as mesmas propriedades para todas as formas individuais da coleção ShapeRange.
Loop através de uma coleção Shapes ou ShapeRange
Mesmo que você não possa efetuar uma operação em várias formas na interface do usuário ao mesmo tempo selecionando-as e usando em seguida um comando, você pode efetuar a ação equivalente por programa fazendo um loop através da coleção Shapes ou ShapeRange que contenha as formas com as quais você deseja trabalhar, aplicando as propriedades e métodos apropriados aos objetos Shape individuais da coleção. O exemplo seguinte faz um loop através de todas as formas de myDocument e altera a cor de primeiro plano de cada forma que seja uma AutoForma.
Set myDocument = Worksheets(1)
For Each sh In myDocument.Shapes
If sh.Type = msoAutoShape Then
sh.Fill.ForeColor.RGB = RGB(255, 0, 0)
End If
NextO exemplo seguinte constrói uma coleção ShapeRange contendo todas as formas selecionadas no momento na janela ativa e define a cor de primeiro plano para cada forma selecionada.
For Each sh in ActiveWindow.Selection.ShapeRange
sh.Fill.ForeColor.RGB = RGB(255, 0, 0)
NextAlinhar, distribuir e agrupar formas em um intervalo de forma
Use os métodos Align e Distribute para posicionar um conjunto de formas umas em relação às outras ou em relação ao documento que as contém. Use o método Group ou o método Regroup para formar uma única forma agrupada a partir de um conjunto de formas.