VBA - Artigo 032 - Lidando com imagens


Lidando com imagens

Imagens ajudam a deixar o ambiente visualmente mais agradável, seja um quadro na parede, seja imagens em um site ou mesmo em suas planilhas e formulários.

Você certamente já deve ter visto que na caixa de ferramentas do formulário há um botão chamado Imagem. Clicando nele e colocando em algum ponto do formulário você irá acrescentar um objeto de imagem, que inicialmente vai aparecer como um quadrado cinzento sem nada dentro.

A primeira propriedade que deve ser definida em uma imagem é Picture, que irá carregar a imagem. Escolha uma entre os poucos formatos suportado, as principais extensões são bmp e wmf.

O formato bmp (BitMap) determina que cada pixel (ponto) do arquivo assume uma cor e seu tamanho é pré-determinado (80x80, por exemplo). Se você estender o arquivo, a qualidade da imagem não acompanhará e você verá a imagem com serrilhados. Por este motivo, o ideal é que arquivos bmp devem ser usados no tamanho especificado. Se for uma imagem de 80x80, as propriedades Height (altura) e Width (largura) deveriam ser iguais a 80. Deveriam, porque se você fizer isso verá que o Excel deixará uma borda de 10 pixels ao redor da figura, por razões que desconheço: 




Na prática a imagem foi adicionada como se fosse 60x60. Podemos editar a propriedade PictureSizeMode, cujos valores possíveis são:
- fmPictureSizeModeClip: mantém o arquivo no tamanho que o Excel importa;
- fmPictureSizeModeStretch: expande ambas as laterais até os limites do objeto imagem, mesmo que saia da proporção - a imagem ficará esticada se a proporção não for a mesma;
- fmPictureSizeModeZoom: expande a imagem até os limites do objeto imagem, mantendo a proporção em relação ao arquivo original.

Usando o valor fmPictureSizeModeZoom obtemos o seguinte resultado:



Como pode-se ver, aparece um serrilhado, indicando que a imagem foi estendida. Por outro lado, se definirmos as propriedades Height e Width para 60, obtemos o seguinte resultado:




Desconheço as razões porque as proporções no formulário são diferentes da imagem do arquivo. O jeito é sempre efetuar testes com as imagens antes de definir o tamanho da imagem no formulário e o tamanho das próprias imagens que serão inseridas. Outro detalhe importante é que fotos em formato jpg devem ser convertidas em bmp para poder usar no formulário. Há softwares gratuitos que permitem converter alguns formatos de arquivos de imagens, como o Paint.Net.

Já o formato wmf (Windows MetaFile) é uma imagem em formato vetorial, ou seja, a imagem é um conjunto de pontos, linhas e polígonos baseados em expressões matemáticas, sendo cada linha ou polígono equivalente a um vetor (ou caminho, como alguns softwares de desenho vetorial chamam). Arquivos em imagem vetorial podem ser estendidos sem perda de qualidade. Os formatos mais conhecidos e usados são EPS (Encapsulated Post Script, que está caindo em desuso), AI (Adobe Illustrator), CDR (CorelDraw) e SVG (Scalable Vector Graphics), sendo somente o último livre de royalties. Um software gratuito capaz de exportar arquivos WMF é o InkScape.

Arquivos em formato vetorial são excelentes para logotipos e desenhos, pois podemos aumentar o tamanho sem comprometer a qualidade da imagem. Outra vantagem é que não aparece o fundo branco que apareceu nas telas acima. Quem usa bastante o PowerPoint deve saber disso, devido ao costumeiro uso de imagens nas apresentações.


Colocando uma imagem vetorial e usando fmPictureSizeModeZoom para manter a imagem proporcionalmente dentro dos limites temos o seguinte resultado:




De certa forma ainda aparece um serrilhado, isto é uma limitação dos formulários no VBA, que estão limitados a 256 cores. De qualquer forma, está melhor que a versão bmp estendida. Não dá para saber o motivo da Microsoft não ter evoluído os formulários do Office dos tempos do Windows 95 para o formato Windows Presentation Foundation, muito mais modernos e visualmente agradáveis, o que é uma pena.

Há mais propriedades interessantes que podem ser editadas em um objeto imagem:
- BackStyle: estilo de fundo, pode ser fmBackStyleOpaque (fundo opaco, opção padrão) ou fmBackStyleTransparent (fundo transparente, ideal para imagens vetoriais);
- BorderStyle: estilo da borda, pode ser fmBorderStyleSingle (borda simples, opção padrão) ou fmBorderStyleNone (sem borda);
- PictureAlignment: alinhamento da figura, pode ser fmPictureAlignmentCenter (imagem no centro, opção padrão), fmPictureAlignmentTopLeft (imagem no topo à esquerda), fmPictureAlignmentTopRight (imagem no topo à direita), fmPictureAlignmentBottomLeft (imagem embaixo à esquerda) e fmPictureAlignmentBottomRight (imagem embaixo à direita);
- PictureTiling: permite que as imagens fiquem lado a lado quando está com valor True, o padrão é False;
- SpecialEffect: efeito especial, pode ser fmSpecialEffectFlat (sem efeito, opção padrão), fmSpecialEffectRaised ("levantado", como se fosse um botão), fmSpecialEffectSunken ("afundado", como um botão pressionado), fmSpecialEffectEtched ("gravado", como se houvesse um vinco ao redor da imagem) e fmSpecialEffectBump ("inchaço", tem uma borda grossa). Vale observar que alterar o valor desta propriedade altera a propriedade BorderStyle para fmBorderStyleNone, ou seja, sem borda.

Uma coisa interessante que é possível fazer é alterar a imagem via código. Por exemplo, no caso de um cadastro de pessoas, um objeto imagem pode exibir a foto da pessoa ativa no momento. Para fazer algo do tipo, é crucial ter alguns fatores em mente:
- As imagens devem ter o mesmo tamanho, caso contrário podem ficar deformadas ao exibir. Se você especificar que a imagem deve ser 80x100, todas deverão ter essas medidas;
- As imagens devem estar no mesmo local. O ideal é criar uma pasta (ou diretório) no mesmo local da planilha e manter as imagens dentro dessa pasta;
- Os nomes dos arquivos de imagens preferencialmente devem ser a chave (código, ID ou outra forma de identificação única) e devem ter a mesma extensão. Se você utilizar o nome de uma pessoa como nome do arquivo certamente terá problemas com homônimos. Exceções podem ser feitas se você estiver lidando com uma lista que não deve ser alterada e que não tenha objetos com o mesmo nome.


Um exemplo simples para visualizar o funcionamento:




Este formulário funcionará da seguinte maneira: a caixa de seleção tem dois valores: Homem e Mulher. Quando um valor for selecionado, a imagem aparecerá:



O código é o seguinte:

Private Sub UserForm_Initialize()
    InicializarSeletor
End Sub
Sub InicializarSeletor()
    frmSexo.cmbSelecionarSexo.Clear
    frmSexo.cmbSelecionarSexo.AddItem "Homem"
    frmSexo.cmbSelecionarSexo.AddItem "Mulher"
End Sub
Private Sub cmbSelecionarSexo_Change()
    Dim Imagem As String
    Imagem = ActiveWorkbook.Path & "\Imagens\" & _
        frmSexo.cmbSelecionarSexo.Value & ".wmf"
    frmSexo.imgSexo.Picture = LoadPicture(Imagem, 50, 100)
End Sub

O detalhe mais importante aqui é a forma de carregar a imagem. É preciso usar uma função chamada LoadPicture, que colocará a imagem dentro da propriedade Picture. Aqui usei três argumentos: endereço do arquivo, largura e altura (estes dois últimos são opcionais). Há um quarto parâmetro chamado flags, que pode ser um valor da enumeração LoadPictureConstants. Os valores possíveis são os seguintes: Default, Monochrome, VgaColor e Color.

O exemplo acima é bem simples, mas dá uma ideia do que você pode fazer para melhorar seus formulários. Você pode alterar uma imagem dinamicamente conforme as necessidades: fotos de pessoas ou imagens de produtos ajudam a incrementar o visual.

Enquanto em formulários temos limitações com formatos e cores, nas planilhas temos muito mais opções. É possível usar imagens vetoriais sem que aconteça o problema de serrilhado como visto anteriormente, pois temos acesso a mais de 16 milhões de cores. Além disso, é possível utilizar outros formatos de imagens populares, como jpg e png. Estes, da mesma forma que o bmp, perdem qualidade quando ampliados.

Se você tiver habilidade com desenho poderá transformar uma planilha em um formulário. Pode começar usando algumas formas do Office ou figuras encontradas na internet para entender o que é possível fazer. Fiz um exemplo bem simples aqui para demonstrar:


Perceba que aqui ocultei a barra de fórmulas, o menu, os títulos de linhas e colunas, além da grade, tirando a chamada "aparência de Excel". Você pode fazer isso manualmente na planilha, mas seu usuário pode mexer. Neste caso é bom editar os eventos referentes a essa planilha. Existem os eventos Activate e Deactivate que, como o próprio nome indica, são processados quando entramos ou saímos da planilha, respectivamente.

Portanto, precisamos editar o evento de entrada na planilha para não exibir os detalhes mencionados acima. Essas propriedades são definidas no objeto Application, que possui muitas outras propriedades que podem ser ajustadas conforme suas necessidades. Vejamos o que podemos fazer:

Private Sub Worksheet_Activate()
    Application.ActiveWindow.DisplayGridlines = False
    Application.ActiveWindow.DisplayHeadings = False
    Application.ActiveWindow.DisplayHorizontalScrollBar = False
    Application.ActiveWindow.DisplayVerticalScrollBar = False
    Application.DisplayFormulaBar = False
End Sub

Os nomes das propriedades explicam bem a função. DisplayGridlines exibe ou não as linhas de grade da planilha. DisplayHeadings é sobre o cabeçalho de linhas e colunas da planilha. DisplayHorizontalScrollBar e DisplayVerticalScrollBar se referem às barras de rolagem horizontal e vertical, respectivamente. Por fim, DisplayFormulaBar oculta ou exibe a barra de fórmulas. Existem muitos outros controles que podem ser definidos.

Como essas propriedades estão definidas no evento Worksheet_Activate, sempre que o usuário entrar nessa planilha os valores serão definidos e a planilha estará sempre com essa aparência. Mesmo que o usuário coloque a grade, por exemplo, ao sair e retornar à planilha a grade estará oculta de novo.

Com um pouco de prática e uma certa habilidade com imagens, você pode transformar planilhas em formulários que certamente irão impressionar os usuários. Certamente ainda há muito sobre imagens a aprender, mas o que foi visto aqui é um ótimo começo.


Para dúvidas sobre o artigo, comentários ou sugestões, utilize os comentários abaixo. Até o próximo artigo!

Pedro Martins

Pós-graduando em Business Intelligence e Big Data pela Faculdade Impacta de Tecnologia. Formado em Tecnologia em Eletrônica Digital com Ênfase em Microprocessadores


Catálogo de aulas (NOVIDADE)

Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.


Postagem Anterior Próxima Postagem