Sie sind auf Seite 1von 54

Funções de planilha'!

A1
Arquivo de exemplos do Microsoft Excel
Índice analítico

Funções de planilha
Fórmulas de exemplo para concluir tarefas comuns da planilha.

Formatação condicional
Demonstra como alterar a formatação (ou seja, fonte, cor da célula)
aplicada à célula, dependendo do seu valor atual.

Validação de dados
Mostra como definir restrições para valores que podem ser inseridos
em uma célula.

Rótulos de gráficos
Macro para automatizar o rótulo de um gráfico de dispersão (XY).

Repetindo tarefas
Exemplo de código de macro em loop e uma explicação sobre como
modificar código gravado para repetir tarefas em um intervalo de
células ou em um intervalo selecionado.

A Microsoft fornece exemplos de procedimentos do Visual Basic for Applications somente para ilustração, sem garantia expressa ou implícita, incluind
mas não limitado a, a garantia implícita de comercialidade e/ou adequação a fins específicos. Os procedimentos do Visual Basic dessa pasta de traba
são providos 'como estão' e a Microsoft não garante que possam ser usados em todas as situações. Ao mesmo tempo que os Engenheiros do Micros
AnswerPoint podem auxiliar na explicação da funcionalidade de uma determinada macro, eles não irão modificar estes exemplos para fornecerem
funcionalidades adicionais, nem mesmo auxiliá-lo na construção de macros para atender às suas necessidades específicas. Se você possui pouca
experiência em programação, deve consultar um dos Microsoft Solution Providers.
plos do Microsoft Excel
Índice analítico

Matrizes
Código de macro para demonstrar como transferir conteúdo da
matriz para uma planilha.

Exemplos API
Como implementar o uso de chamadas de API de dentro do
ambiente de programação do Microsoft Excel.

Eventos
Exemplos para demonstrar como alguns eventos podem disparar
código de macro a ser executado.

Automação
Exemplo de código de macro para demonstrar como o Microsoft
Excel pode automatizar outros aplicativos do Microsoft Office.

ADO (Objetos de dados ActiveX)


Exemplos que ilustram tarefas comuns do banco de dados através
de código.

pplications somente para ilustração, sem garantia expressa ou implícita, incluindo,


ação a fins específicos. Os procedimentos do Visual Basic dessa pasta de trabalho
usados em todas as situações. Ao mesmo tempo que os Engenheiros do Microsoft
ma determinada macro, eles não irão modificar estes exemplos para fornecerem
e macros para atender às suas necessidades específicas. Se você possui pouca
consultar um dos Microsoft Solution Providers.
Exemplos de funções de pasta de trabalho
Esta pasta de trabalho contém exemplos de fórmulas que podem ser usadas para concluir tarefas comuns
em planilhas. As células que contém fórmulas estão em azul. Para exibir um exemplo de fórmula,
posicione o cursor do mouse sobre a célula para exibir o comentário ou pressione CTRL+j para alternar
entre exibir valores e exibir fórmulas na pasta de trabalho. Para obter mais informações sobre uma função
de planilha, selecione a célula que contém a função e clique no botão Editar fórmula (=) na barra
de fórmulas.

Suprimindo a exibição dos valores de erro


É comum que as fórmulas das pastas de trabalho retornem um valor de erro
(#DIV/0!, #N/D, #VALOR!,#REF! e #NUM!) quando são baseadas em um valor não esperado.
Um exemplo é uma fórmula de divisão simples. Se a célula de origem contiver um zero, o erro
#DIV/0! será retornado.

Origem A Origem B Fórmula Original Nova Fórmula


25 0 #DIV/0!

Uma forma geral para expressar isto seria:


=SE(ÉERRO(<fórmula>),"",<fórmula>)
onde <fórmula> é a fórmula para qual você deseja suprimir o valor do erro. Se
<fórmula> retornar um erro, esta instrução retornará "" (um caractere nulo),
caso contrário, retornará o resultado de <fórmula>.

Uma outra maneira de suprimir a exibição de valores de erro é usando o novo recurso
Formatação condicional do Excel 2000. O recurso Formatação condicional permite
que você tenha células exibindo diferentes formatos dependendo do seu conteúdo. Para
valores de erro, você deverá seguir as seguintes etapas:
1. Selecione a célula a ser formatada (nesse caso, $E$41).
2. Clique em Formatação condicional no menu Formatar.
3. Na primeira caixa suspensa, selecione A fórmula é.
4. Na caixa de edição ao lado, digite: =ÉERRO($E$41).
5. Clique no botão de formatação e selecione um formato. Neste caso, foram usados um plano
de fundo azul e a mesma fonte azul.
6. Clique em OK.

O resultado é que para valores de erro, a cor da fonte é igual à cor do plano de fundo e nada será
exibido.

Origem A Origem B Formato Original Novo Formato


25 0 #DIV/0! #DIV/0!

Indexando, comparando e procurando valores


Uma das tarefas mais comuns do Gerenciador de lista é localizar um valor na interseção de uma
coluna e uma linha, dentro de um intervalo retangular de células em uma planilha. O Assistente de
pesquisa o auxiliará a escrever fórmulas para realizar esta tarefa.

Para usar esse recurso, selecione uma célula no intervalo de dados que deseja utilizar e, em seguida,
selecione Ferramentas / Assistente / Pesquisa e siga as etapas do assistente.

Se os itens de menu não estiverem presentes e para obter informações adicionais sobre como usar ou
instalar o Assistente de pesquisa, use o Assistente do Office e efetue uma pesquisa usando
a expressão "Assistente de pesquisa".

Fórmulas de soma condicional


Uma outra tarefa comum no Excel é o cálculo da soma dos valores que atendem a condições específicas.
O Assistente de soma condicional ajuda você a escrever fórmulas para realizar esta tarefa.

Para usar esse recurso, selecione uma célula na lista que deseja resumir e, em seguida, selecione
Ferramentas / Assistente / Soma condicional e siga as etapas do assistente.

Se os itens de menu não estiverem presentes e para obter informações adicionais sobre como usar ou
instalar o Assistente de soma condicional, use o Assistente do Office e efetue uma pesquisa usando
a expressão "Assistente de soma condicional".
Formatação condicional
A formatação condicional permite que você altere a formatação aplicada à
célula, dependendo do valor atual da célula. Este procedimento pode agilizar
a auditoria em planilhas grandes realçando automaticamente exceções. A
formatação condicional permite que você aplique até três condições
separadas em uma célula.

A formatação condicional permite que você altere estilos de fontes, bordas e


padrões de células.

Exemplo 1 de formatação condicional

4
7
As células H10:H14 contêm três regras de formatação condicional que
texto
alterarão a formatação das células dependendo dos valores inseridos nelas.
1
Para ver as condições aplicadas às células, selecione a célula H10 e clique 15
em Formatação condicional no menu Formatar.

Exemplo 2 de formatação condicional - Ocultando valores de erros

Este exemplo ilustra como usar a formatação condicional para ocultar valores 2.5
de erros que são retornados pelas fórmulas. Neste exemplo, as células H21 e 4
H23 exibiriam normalmente o código de erro #DIV/0!. A formatação #DIV/0!
condicional aplicada define a cor da fonte das células que contêm um valor 5
de erro para que ela corresponda com o plano de fundo da planilha.
#DIV/0!
Para ver as condições aplicadas às células, selecione a célula H19 e clique
em Formatação condicional no menu Formatar.
10 4
20 5
30
40 8
50
Validação de dados
A validação de dados permite que você defina restrições para os valores
que podem ser inseridos em uma célula. Os exemplos a seguir
apresentam vários cenários comuns para usar a validação de dados.

Exemplo 1 de validação de dados - Restringindo entrada para valores numéricos

As células H9:H13 foram formatadas com uma regra de validação que


restringe entradas de células para valores numéricos. Este exemplo
utiliza o estilo Parar para o Alerta de erro, impedindo que você efetue
uma entrada inválida na célula selecionada.

Para ver as configurações de validação desse exemplo, selecione a


célula H9 e clique em Validação no menu Dados.

Exemplo 2 de validação de dados - Restringindo o tamanho de uma entrada de texto

As células H19:H23 foram formatadas com uma regra de validação que


restringe o tamanho das entradas de texto para sete caracteres ou
menos. Este exemplo utiliza o estilo Aviso para o Alerta de erro, que
fornece a opção de cancelar a entrada atual ou inserir o valor inválido na
célula selecionada.

Para ver as configurações de validação para esse exemplo, selecione a


célula H19 e clique em Validação no menu Dados.

Exemplo 3 de validação de dados - Restringindo entrada para um intervalo de números inteiros

As células H30:H34 foram formatadas com uma regra de validação que


irá alertá-lo se você não inserir um número inteiro entre 1 e 10. Este
exemplo utiliza o estilo Informações para o Alerta de erro, que informa a
inserção de uma entrada inválida, mas permite que você mantenha o
valor atual.

Para ver as configurações de validação para esse exemplo, selecione a


célula H30 e clique em Validação no menu Dados.

Exemplo 4 de validação de dados - Restringindo a entrada de célula para uma lista de valores

As células H41:H45 foram formatadas com uma regra de validação que


restringe as entradas para uma lista de valores. A lista de entradas
válidas está contida nas células M41:M49. Quando você seleciona uma
célula no intervalo H41:H45, uma seta suspensa aparece nessa célula.
Ao clicar na seta, a lista de entradas válidas é exibida. Você pode
simplesmente clicar na entrada que deseja fazer. Este exemplo utiliza o
estilo Parar para o Alerta de erro, que impede que você efetue uma
entrada inválida na célula.

Para ver as configurações de validação para esse exemplo, selecione a


célula H41 e clique em Validação no menu Dados.
Ao clicar na seta, a lista de entradas válidas é exibida. Você pode
simplesmente clicar na entrada que deseja fazer. Este exemplo utiliza o
estilo Parar para o Alerta de erro, que impede que você efetue uma
entrada inválida na célula.

Para ver as configurações de validação para esse exemplo, selecione a


célula H41 e clique em Validação no menu Dados.
Luis
Jorge
Paulo
João
José
Pedro
Daniel
Carlos
Edison
Anexando rótulos a um gráfico de dispersão (XY)
Rótulos Valores X Valores Y
Dados1 2 5 Colocar
Colocar rótulos
rótulos
Dados2 9 7 em Redefinir
Redefinir gráfico
gráfico Exibir
Exibir código
código
em gráficos
gráficos
Dados3 5 3
Dados4 4 8

No Microsoft Excel, embora não haja nenhuma


No Microsoft
forma Excel,
interna para embora
anexar não haja nenhuma
automaticamente Valores Y
forma interna para anexar automaticamente
rótulos de texto a um gráfico de dispersão (xy),
rótulos deusar
textouma
a um gráfico derealizar
dispersão (xy), 9
você pode macro para esta
você
tarefa. pode usar uma macro para realizar esta 8 8
tarefa. 7 7
A macro anexada demonstra como aplicar 6
A macro
rótulos anexada
a gráficos dedemonstra
dispersão como
(xy) e aplicar
assume
rótulos a gráficos de dispersão (xy) eestejam
assume 5 5
que seus dados e rótulos associados Valores Y
que seus dados e rótulos associados 4
organizados em sua planilha da mesmaestejam
forma
organizados
que estão nas em sua planilha
células da mesma
sombreadas acima.forma 3 3
que estão nas células sombreadas acima. 2
Para aplicar os rótulos de pontos de dados, 1
Para aplicar
pressione os rótulos
o botão de rótulos
Colocar pontos de
emdados,
pressione o botão Colocar rótulos em 0
gráficos.
gráficos. 1 2 3 4 5 6 7 8 9 10
Para remover os rótulos para outra
Para remover pressione
demonstração, os rótulos opara outra
botão Redefinir
demonstração,
gráfico. pressione o botão Redefinir
gráfico.
Para exibir o código de macro anexado à
Para exibir
planilha, o código
pressione de macro
o botão anexado
Exibir código.à
planilha, pressione o botão Exibir código.
persão (XY)
Repetindo tarefas

Muitas vezes, é necessário realizar a mesma tarefa em um grupo de itens. Esses itens podem ser
células em um intervalo, planilhas em uma pasta de trabalho ou pastas de trabalho em um
aplicativo. Embora o gravador de macro não grave loops, pode ainda ser usado para gravar a
tarefa principal a ser repetida. Em seguida, com algumas pequenas modificações no código
gravado, vários tipos de loop podem ser criados, dependendo do que é necessário para um
determinado projeto.

Os exemplos abaixo têm foco em um cenário onde o programador possui um intervalo de células
em uma coluna A contendo números e, dependendo do valor da célula, deseja alterar a cor da
célula correspondente na coluna B.

Primeiramente, podemos gravar o processo de etapa única para alterar a cor de fundo de uma
célula:
Para gravar: no menu Ferramentas, clique em Macro e, em seguida, clique em Gravar nova
macro. Durante a gravação, no menu Formatar, clique em Células. Em seguida, clique na guia
Padrões e selecione uma cor.

Este exemplo usa o amarelo (.ColorIndex=6). Termine a gravação usando o botão Parar gravação
na barra de ferramentas Parar gravação. A cor da célula selecionada no momento será alterada e
a seguinte macro será gravada:

Ir
Ir para
para código
código exemplo
exemplo
Sub Recorded_Macro() Macro
Macro gravada
gravada
'
' Macro gravada em 18/11/98
'
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End Sub

Observação: Se, durante a gravação, você selecionar uma célula, sua macro poderá conter algo
como Range("A3").Select. Você deve remover essa linha, pois, sempre que esta macro for
executada, essa linha forçará a seleção da célula especificada no objeto Range. Caso você queira
que aquela célula seja selecionada primeiramente, então remova a linha.

Agora, podemos modificar ligeiramente o código e acrescentar uma das várias estruturas de loop
ao código gravado.

Loop For Each...Next


Caso seja conhecido o intervalo de células ao qual desejamos aplicar a ação gravada, podemos
usar um loop For Each…Next. Neste exemplo, também desejamos afetar somente a célula na
coluna B, se a célula em A for maior do que 20. Para tal, acrescentamos uma instrução If em
torno da instrução With gravada. Isto assegura que a cor será alterada somente se a condição
da instrução If for verdadeira. Por último, porque desejamos alterar a célula correspondente uma
coluna à direita da coluna A (coluna B), iremos substituir a propriedade Selection no código
gravado pelo método Offset do objeto célula em loop (cell_in_loop). O código resultante terá a
seguinte aparência:
Ir
Ir para
para código
código exemplo
exemplo
For_Each_Next
For_Each_Next
Sub For_Each_Next_Sample()
'
' Macro gravada em 18/11/98
'
For Each cell_in_loop In Range("A1:A5")
If cell_in_loop.Value > 20 Then
With cell_in_loop.Offset(0, 1).Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Next
End Sub

Loop For…Next
Se você sabe quantas vezes deseja que o loop seja executado, pode usar um loop For..Next.
Usando nosso exemplo, se você deseja verificar somente 10 células abaixo, com início na célula
selecionada, então o código gravado modificado teria a seguinte aparência:

Ir
Ir para código exemplo
Sub For_Next_Sample() For_Next
For_Next

For Contador = 0 To 9
If Selection.Offset(Contador, 0).Value > 20 Then
With Selection.Offset(Contador, 1).Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Next
End Sub

Neste caso, o objeto Selection está sendo usado para que o código não seja específico a um
dado intervalo, mas que sempre executará um loop em 10 (de 0 a 9 como um contador) células
abaixo da célula ativa. A variável Contador é incrementada a cada loop e pode ser usada dentro
da estrutura do loop. Aqui é usada como um argumento Offset para indicar quantas linhas serão
deslocadas na Selection (a célula atual). Então, se iniciarmos esta macro e a célula ativa é A1, no
primeiro loop a variável Contador será igual a 0. Sendo assim, serão deslocadas 0 linhas a partir
de A1, como apresentados na instrução Selection.Offset(Contador, 0).Value.

Do…Loop

Para determinar se um loop deve ser terminado, com base em uma certa condição, o uso de um
Do...Loop seria apropriado. Esta estrutura de loop permite que você verifique as condições da
variável ou das propriedades antes do loop ser executado. No exemplo abaixo, o loop é
executado até que o número de linha da célula referenciada, Selection.Offset(Contador,
0).Row, tenha excedido 100. Isto pode ser útil quando você deseja que um loop não seja
executado após a linha 100.
Ir
Ir para
para código
código exemplo
exemplo
Sub Do_Loop_Sample() Do_Loop
Do_Loop

Contador = 0
Do Until Selection.Offset(Contador, 0).Row > 100
If Selection.Offset(Contador, 0).Value > 20 Then
With Selection.Offset(Contador, 1).Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Contador = Contador + 1
Loop
End Sub

Observação: Existem outros três tipos de loops Do… disponíveis. As formas variadas oferecem
maior flexibilidade, conforme necessário, em circunstâncias diversas.

Para obter mais informações sobre este loop e informações mais detalhadas sobre as outras
estruturas de loop, acesse a Ajuda a partir do ambiente do Visual Basic e use a palavra-chave
looping.
Trabalhando com matrizes

A maneira mais comum para transferir o conteúdo de uma matriz para uma planilha é através de
um loop, como, por exemplo, um loop For...Next. Um loop For...Next permite que você indexe a
matriz e transfira elementos da matriz um por vez para o seu endereço de destino. Você pode
conseguir este mesmo resultado, sem o uso de um loop, usando o Visual Basic, Applications
Edition, propriedade FormulaArray do objeto Range.

Em Visual Basic, Applications Edition, a orientação de uma matriz unidimensional é horizontal.


Assim sendo, se o intervalo de células em uma pasta de trabalho que irá receber o conteúdo de
uma matriz tiver a mesma orientação (ou seja, uma linha para várias colunas), o conteúdo pode
ser transferido com uma única instrução FormulaArray. Por exemplo:

Sub ArrayDump1() 'Para uma matriz unidimensional horizontal


Dim x(1 To 10) As Double 'Declara um matriz de tamanho 10
For j = 1 To 10 'Calcula valores de exemplo Ir
Ir para
para código
código exemplo
exemplo
x(j) = j * j ArrayDump1
ArrayDump1
Next j
'Transfere o conteúdo da matriz para uma área horizontal
Range(Cells(2, 1), Cells(2, 10)).FormulaArray = x
End Sub

O exemplo acima funciona perfeitamente quando as células da pasta de trabalho de destino


possuem somente uma linha. Entretanto, quando o conteúdo de uma matriz precisar ser
transferido para um intervalo de células com orientação vertical em vez de horizontal (ou seja,
uma coluna para várias linhas), o exemplo acima não é mais válido.

Em uma matriz bidimensional, você deve mudar a orientação da matriz. Para tal, você pode
declarar a matriz como uma matriz bidimensional com dimensões de várias linha por uma coluna.
Por exemplo:

Sub arraydump2() 'Para uma matriz bidimensional vertical Ir


Ir para
para código
código exemplo
exemplo
'Declara uma matriz de dez linhas por uma coluna ArrayDump2
ArrayDump2
Dim x(1 To 10, 1 To 1) As Double
'Calcula valores randômicos
For j = 1 To 10
x(j, 1) = j * j
Next j
'Transfere o conteúdo da matriz para uma área vertical
Range(Cells(1, 2), Cells(10, 2)).FormulaArray = x
End Sub

A matriz bidimensional apresentada neste exemplo permite que o Visual Basic defina a orientação
da matriz como vertical. Sendo assim, a matriz pode ser transferida para uma pasta de trabalho
sem o uso de um loop.
Exemplos API
Uma API (Application Programming Interface, interface de programação de aplicativo) é uma função contida
em arquivo DLL. Normalmente, essas funções são usadas por janelas e outros aplicativos, mas elas também
podem ser usadas pelo usuário final.
Observação: Tenha cuidado ao efetuar chamadas de API. Salve seu trabalho com freqüência para evitar
quaisquer problemas.

Como foram projetadas para serem chamadas pelo sistema e por aplicativos, a maioria das interceptações
de erro não foi implementada. Isto significa que você pode causar danos ao sistema, paradas ou provocar
efeitos indesejáveis ao tentar chamadas de API. Os exemplos a seguir mostram como usar algumas
APIs básicas. Elas foram testadas no Windows98. Há várias maneiras de usar essas funções
e cabe ao programador determinar qual função melhor atenderá às suas necessidades.

Verificando todas as letras de unidade

O exemplo a seguir usa a função GetLogicalDriveStrings para efetuar loop em todas as unidades lógicas.
As unidades lógicas são compartilhamentos de rede mapeados e unidades de CD-ROM removíveis e fixas.

Option Explicit
Private Declare Function GetLogicalDriveStrings _
Lib "kernel32" Alias "GetLogicalDriveStringsA" _
(ByVal nBufferLength As Long, _
Sub Get_Logical_Drive_String()
Dim DrvString As String
Dim TotDrvs As Long Ir
Ir para código exemplo
Get_Logical_Drive_String
Get_Logical_Drive_String
Dim Contador As Integer

'TotDrvs retorna o número total de caracteres em seqüência de retorno


TotDrvs = GetLogicalDriveStrings(0&, DrvString)
'DrvString é o buffer criado para armazenar a seqüência de caracteres
DrvString = String(TotDrvs - 1, " ")
'Chamar GetLogicalDriveStrings pela segunda vez preenche a seqüência
'com dados válidos
'exemplo "a:\ c:\ d:\ e:\ "
TotDrvs = GetLogicalDriveStrings(TotDrvs, DrvString)

'Analisa a seqüência de retorno exibindo cada uma em uma caixa de mensagens


For Contador = 1 To TotDrvs Step 4
MsgBox Mid(DrvString, Contador, 3)
Next Contador
End Sub

Retornando resolução de vídeo

O exemplo de código a seguir retorna a resolução de vídeo atual


e exibe as informações em uma caixa de mensagens.
Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) _
As Long

'Constantes para GetSystemMetrics

Const SM_CXSCREEN = 0 ' Largura da tela


Const SM_CYSCREEN = 1 ' Altura da tela

Sub Get_System_Metrics()

Dim XVal As Long, YVal As Long Ir


Ir para
para código
código exemplo
exemplo
YVal = GetSystemMetrics(SM_CYSCREEN) Get_System_Metrics
Get_System_Metrics
XVal = GetSystemMetrics(SM_CXSCREEN)
MsgBox "Sua resolução de tela é " & XVal & " por " & YVal

End Sub

Recuperando nome do usuário conectado

O código a seguir retornará o nome do usuário conectado no momento.

Option Explicit
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, _
nSize As Long) As Long

Sub Get_User_Name()

Ir
Ir para código exemplo
Dim lpBuff As String * 25 Get_User_Name
Get_User_Name
Dim ret As Long, UserName As String
ret = GetUserName(lpBuff, 25)
UserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
MsgBox UserName

End Sub

Retornar o nome curto de caminho de um nome extenso de arquivo e caminho

A função a seguir utiliza um nome extenso de arquivo e retorna o nome curto de arquivo,
exibindo os dois em uma caixa de mensagens.

Private Declare Function GetShortPathName Lib "KERNEL32.DLL" _


Alias "GetShortPathNameA" _
(ByVal lpctstrLongName As String, _
ByVal lptstrShortName As String, _
ByVal bufLen As Long) As Long
Sub Get_Short_Name()
Dim LongStr As String, ShortStr As String Ir
Ir para
para código exemplo
Get_Short_Name
Get_Short_Name
Dim lStrLen As Long, lRet As Long

'LongStr é qualquer variável ou nome extenso de arquivo apontando


'para um arquivo
LongStr = ThisWorkbook.FullName
lRet = GetShortPathName(LongStr, ShortStr, lStrLen)
'Isto permite a criação de um buffer com o mesmo tamanho
'da seqüência retornada, economizando o trabalho de ter que
'separar a parte esquerda do buffer para obter a seqüência de caracteres
ShortStr = String(lRet, " ")
lRet = GetShortPathName(LongStr, ShortStr, lRet)
MsgBox LongStr & " foi convertido para " & ShortStr
End Sub

Retornar o nome do computador

O exemplo de código a seguir mostra como usar a função GetComputerName para retornar o
nome do computador.

Option Explicit
Private Declare Function GetComputerName Lib "kernel32" _
Alias "GetComputerNameA" (ByVal lpBuffer As String, _
nSize As Long) As Long

Sub Get_Computer_Name() Ir
Ir para código exemplo
Dim Comp_Name_B As String * 255 Get_Computer_Name
Get_Computer_Name
Dim Comp_Name As String
GetComputerName Comp_Name_B, Len(Comp_Name_B)
'mas a seqüência é sempre finalizada com uma seqüência de final nulo,
'possibilitando o uso da função Chr(0) para localizar esse final
Comp_Name = Left(Comp_Name_B, InStr(Comp_Name_B, Chr(0)))
'e retorna somente o nome do computador
MsgBox Comp_Name
End Sub

Localizar o espaço livre disponível no disco rígido

O exemplo de código a seguir mostra como localizar o espaço livre disponível, bem como o tamanho total
do disco rígido.

Option Explicit
Private Declare Function GetDiskFreeSpace Lib "KERNEL32.DLL" _
Alias "GetDiskFreeSpaceA" (ByVal lpRoot As String, _
dwSectors As Long, _
dwBytes As Long, _
dwFreeClusters As Long, _
dwTotalClusters As Long) As Long

Sub Get_Disk_Free_Space()
Dim f As Long, iSectors As Long
Ir
Ir para
para código
código exemplo
exemplo
Dim iTotal As Long, rTotal As Long
Get_Disk_Free_Space
Get_Disk_Free_Space
Dim iFree As Long, rFree As Long
Dim iBytes As Long
Dim sName As String, s As String
sName = "C:\"
f = GetDiskFreeSpace(sName, iSectors, iBytes, iFree, iTotal)
rFree = iSectors * iBytes * CDbl(iFree)
rTotal = iSectors * iBytes * CDbl(iTotal)
If f Then
s = sName
s = s & " tem " & Format(rFree, "#,###,###,##0")
s = s & " bytes livres de " & Format(rTotal, "#,###,##0") & " Total de "
_ "bytes"
End If
MsgBox s
End Sub

Retornando o local da pasta do sistema


O exemplo de código a seguir mostra como recuperar o local da pasta do sistema.

Option Explicit
Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long

Sub Get_System_Directory()
Dim Sys_Dir As String, Res As Long
Res = GetSystemDirectory(Sys_Dir, 0&)
Sys_Dir = String(Res - 1, " ") Ir
Ir para
para código
código exemplo
exemplo
Res = GetSystemDirectory(Sys_Dir, Res) GetSystemDirectory
GetSystemDirectory
MsgBox Sys_Dir
End Sub

Descobrindo se o sistema é capaz de executar arquivos WAV

O exemplo de código a seguir chama seletivamente o sistema para ver se há dispositivos capazes
de executar arquivos WAV.

Option Explicit
Declare Function waveOutGetNumDevs Lib "winmm" () As Long

Sub Num_Devs()
Dim i As Long
Ir
Ir para código exemplo
i = waveOutGetNumDevs()
Num_Devs
Num_Devs
If i > 0 Then ' Há pelo menos um dispositivo.
MsgBox "Você pode executar dados Wave"
Else
MsgBox "Não é possível executar dados Wave"
End If
End Sub

Definindo Excel com "Sempre visível"

O exemplo de código a seguir mostra como fazer para que o Microsoft Excel fique "Sempre visível". Este
procedimento impede que outros aplicativos sejam exibidos na frente do Microsoft Excel.

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
Ir
Ir para
para código
código exemplo
exemplo
ByVal y As Long, _
SetOnTop
SetOnTop
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Global Const HWND_TOPMOST = -1
Global Const HWND_NOTOPMOST = -2

Sub SetOnTop()
Dim WinHnd As Long, SUCCESS As Long
WinHnd = FindWindow("xlmain", Application.Caption)
SUCCESS = SetWindowPos(WinHnd, HWND_TOPMOST, 0, 0, 0, 0, Flags)
'A linha a seguir existe somente para alternar o Excel para a operação normal
'após 20 segundos
Application.OnTime Now + TimeValue("00:00:20"), "NotOnTop"
End Sub
Sub NotOnTop()
Dim WinHnd As Long, SUCCESS As Long
WinHnd = FindWindow("xlmain", Application.Caption)
SUCCESS = SetWindowPos(WinHnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flags)
End Sub
Programando com eventos
Muitas vezes, os programadores desejam que um certo evento dispare uma macro para executar uma tarefa.
O Microsoft Excel 2000 oferece esta capacidade. Os eventos sempre estão associados a um objeto. Como
exemplos temos uma planilha ou uma pasta de trabalho. Neste arquivo de exemplo, mostraremos somente
poucos dos eventos disponíveis e usaremos uma MsgBox como um filtro para demonstrar até onde um código
normal poderia chegar. Para obter mais informações sobre qualquer um desses ou outros eventos, clique no
assistente no VBE e use a palavra "evento" e o nome do objeto como sua palavra-chave (ex: eventos planilha).

BeforeDoubleClick
Um tipo bem conhecido de evento é o BeforeDoubleClick em uma planilha. Um exemplo bem simples teria a
seguinte aparência:

Private Sub BeforeDoubleClick_Worksheet(ByVal Target As Excel.Range, Cancel As


Boolean)
MsgBox "Você clicou duas vezes na célula " & Target.Address
Cancel = True
End Sub

Este evento será iniciado sempre que o usuário clicar duas vezes em uma célula da planilha. O parâmetro
Target é passado para a macro para que o programador saiba que célula foi clicada duas vezes. O argumento
Cancel tem False como valor padrão mas pode ser alterado para True pelo código. Definindo Cancel como
True irá cancelar a ação padrão do evento. Neste caso, a ação padrão para o clique duplo em uma célula é
alternar para o modo de edição da célula. Já que Cancel foi definido como True, isso não ocorrerá. Se você
ainda desejar que a ação padrão seja executada, remova a linha Cancel=True.

Change
Outro evento útil é o Change em uma planilha. Sempre que o usuário informar um novo valor em uma célula,
este evento será iniciado.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


MsgBox "Esta planilha foi alterada na célula " & Target.Address
End Sub

Observação: Este evento não ocorre caso a planilha tenha acabado de ser recalculada. Existe um evento
chamado Calculate que será iniciado quando a planilha é recalculada.

BeforeClose
Um evento útil relacionado à pasta de trabalho é BeforeClose. Esse evento pode ser usado para executar
tarefas "de limpeza" antes que um arquivo seja salvo ou fechado.

Sub Workbook_BeforeClose(Cancel As Boolean)


a = MsgBox("Deseja realmente fechar esta pasta de trabalho?", vbYesNo)
If a = vbNo Then Cancel = True
End Sub

Neste exemplo, o usuário é avisado que o arquivo será fechado, independentemente do arquivo ter sido salvo
ou não.
Usando eventos com objetos de Aplicativos
Antes que seja possível usar eventos com objeto Application, você deve criar um novo módulo classe e
declarar um objeto com tipo Application com a palavra-chave WithEvents. Por exemplo, assuma que um novo
módulo classe tenha sido criado e denominado EventClassModule. O novo módulo classe possui o seguinte
código.

Public WithEvents App As Application

Após o novo objeto ter sido declarado com seus eventos, ele é exibido na caixa de listagem drop-down no
módulo classe e você pode escrever procedimentos de evento para o novo objeto. Ao selecionar o novo objeto
na caixa Objeto, os eventos válidos para aquele objeto serão relacionados na caixa de listagem suspensa
Procedimentos.

Entretanto, antes que os novos procedimentos sejam executados, você deve conectar o objeto declarado no
módulo classe com o objeto Application. Para tal, você pode usar o seguinte código, em qualquer módulo.

Dim X As New EventClassModule

Sub InitializeApp()
Set X.App = Application
End Sub

Após executar o InicializeApp, o objeto App no módulo classe aponta para o objeto do Aplicativo Microsoft
Excel e os procedimentos do evento no módulo classe serão executados quando ocorrer o evento.

Observação: Para obter mais informações sobre todos os eventos, consulte o arquivo de ajuda do VBA.
Automação
A Automação é um recurso do Component Object Model (COM, modelo de objeto componente), uma tecnologia que
os aplicativos utilizam para expor seus objetos a ferramentas de desenvolvimento, linguagens de macro e outros
aplicativos que suportem Automação. Por exemplo, um aplicativo de planilha eletrônica pode expor uma planilha,
gráfico, célula ou intervalo de células, cada um como um tipo diferente de objeto. Um processador de texto pode
expor objetos, como, por exemplo, um aplicativo, um documento, um parágrafo, uma frase, um marcador ou uma
seleção. Os exemplos a seguir demonstram como automatizar tarefas entre o Microsoft Excel e outros aplicativos
Microsoft.
Para obter mais informações sobre Automação, consulte Compreendendo a automação na ajuda do VBA.

MICROSOFT ACCESS
Este exemplo retorna a localização dos bancos de dados de exemplo do Microsoft Access.

Sub MS_Access()
Dim AccDir As String
Dim acc As Object Ir
Ir para
para código
'Automação OLE para o Access automação
automação
Set acc = CreateObject("access.application") MS_Access
'Retorna o caminho para msaccess.exe
AccDir = acc.SysCmd(Action:=acSysCmdAccessDir)
'Exibe o caminho
MsgBox "O arquivo MSAccess.exe está localizado em " & AccDir
'Libera o espaço de armazenamento da variável
Set acc = Nothing
End Sub

MICROSOFT WORD
Este exemplo copia o gráfico da planilha Rótulos de gráficos para um novo documento do Microsoft Word.
Sub MS_Word()
Dim wd As Object
'Cria uma sessão do Microsoft Word
Set wd = CreateObject("word.application")
'Copia o gráfico na planilha Rótulos de gráficos
Worksheets("Rótulos de gráficos").ChartObjects(1).Chart.ChartArea.Copy
Ir
Ir para
para código
código
'Torna o documento visível
automação
automação
wd.Visible = True
MS_Word
MS_Word
'Ativa o Microsoft Word
AppActivate wd.Name
With wd
'Cria um novo documento no Microsoft Word
.Documents.Add
'Insere um parágrafo
.Selection.TypeParagraph
'Cola o gráfico
.Selection.PasteSpecial link:=True, DisplayAsIcon:=False, Placement:=wdInLine
End With
Set wd = Nothing
End Sub

MICROSOFT POWERPOINT
Este exemplo copia um gráfico da planilha Rótulos de gráficos para uma nova apresentação do PowerPoint.

Sub MS_PowerPoint()
Dim ppt As Object, pres As Object
'Cria uma sessão do Microsoft PowerPoint
Set ppt = CreateObject("powerpoint.application")
'Copia o gráfico na planilha Demonstração de rótulos de gráficos
Worksheets("Rótulos de gráficos").ChartObjects(1).Copy
Ir
Ir para
para código
código
'Cria um novo documento no Microsoft PowerPoint
automação
automação
Set pres = ppt.Presentations.Add MS_Powerpoint
MS_Powerpoint
'Adiciona um slide
pres.Slides.Add 1, ppLayoutBlank
'Torna o PowerPoint visível
ppt.Visible = True
'Ativa o PowerPoint
AppActivate ppt.Name
'Cola o gráfico
ppt.ActiveWindow.View.Paste
Set ppt = Nothing
End Sub

MICROSOFT OUTLOOK
Este exemplo cria e adiciona informações a uma nova tarefa do Outlook. Execute o Outlook e clique em Tarefas na
barra do Outlook para exibir a nova tarefa.
OBSERVAÇÃO: Pode levar alguns minutos para que a tarefa seja exibida.
Sub MS_Outlook()
'Para este exemplo, clique em Referências no menu Ferramentas e Ir para
para código
Irselecione automação
códigoas
automação
'bibliotecas de objetos do Microsoft Outlook 9.0. MS_Outlook
MS_Outlook
Dim ol As Object, myItem As Object
'Cria uma sessão do Microsoft Outlook
Set ol = CreateObject("outlook.application")
'Cria uma tarefa
Set myItem = ol.CreateItem(olTaskItem)
'Adiciona informações à nova tarefa
With myItem
.Subject = "Nova tarefa do VBA"
.Body = "Esta tarefa foi criada através da Automação do Microsoft Excel"
.NoAging = True
.Close (olSave)
End With
'Remove objetos da memória
Set ol = Nothing
End Sub
ADO (Objetos de dados ActiveX)
ActiveX Data Objects (ADO, objetos de dados ActiveX) permite a manipulação
direta de um banco de dados. Vários exemplos que ilustram tarefas comuns do
banco de dados estão incluídos nesta pasta de trabalho.

Recuperar dados via drivers ISAM


Este exemplo recupera dados de um arquivo do dBase e coloca o resultado em
uma nova planilha. Para esse exemplo, é necessário que o driver do Microsoft
dBase esteja instalado. O arquivo Clientes.dbf também precisa estar instalado.

Sub RetrieveISAMdata()
'' OBSERVAÇÃO: Esta sub-rotina requer que você faça referência à
''' última versão da seguinte biblioteca:
'''
'' Biblioteca do Microsoft ActiveX Data Objects

Dim conn As ADODB.Connection


Dim rst As ADODB.Recordset Ir
Ir para
para código
código exemplo
exemplo
Dim NewBook As Workbook Recuperar
Recuperar dados
dados ISAM
ISAM
Dim PathToDatabase As String
Dim i As Integer

' Cria o objeto Connection.


Set conn = New ADODB.Connection

' Define a seqüência de caracteres do caminho do banco de dados


PathToDatabase = Application.Path & "\" & _
Application.LanguageSettings.LanguageID(msoLanguageIDInstall)

With conn
'Atribui a seqüência de conexão ao objeto de conexão.
.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & _
"DBQ=" & PathToDatabase & ";" & _
"DefaultDir=" & PathToDatabase & "\"
' Abre a conexão.
.Open strConn
End With

' Cria um novo objeto Recordset.


Set rst = New ADODB.Recordset

With rst
' Conecta este conjunto de registros à conexão aberta anteriormente.
.ActiveConnection = conn
' Recupera todos os registros da tabela Clientes.
.Open "SELECT * FROM customers"
End With

' Adiciona uma nova planilha a esta pasta de trabalho


Set NewBook = Workbooks.Add
' Efetua loop em todos os campos, retornando os nomes de campos
'à planilha.
For i = 0 To rst.Fields.Count - 1
NewBook.Sheets(1).Range("a1").Offset(0, i).Value = rst.Fields(i).Name
Next i
' Copia o conjunto de registros para a nova planilha.
NewBook.Sheets(1).Range("a2").CopyFromRecordset rst

' Fecha o conjunto de registros.


Set rst = Nothing
' Fecha a conexão.
conn.Close
End Sub

Recuperando dados do Microsoft Access

Este exemplo usa ADO para criar uma consulta com base em duas tabelas no
banco de dados Northwind.mdb. Esse exemplo requer que o arquivo
Northwind.mdb esteja instalado no computador.

Sub RetrieveAccessData()
'' OBSERVAÇÃO: Esta sub-rotina requer que você faça referência à
''' última versão da seguinte biblioteca:
'''
'' Biblioteca do Microsoft ActiveX Data Objects

Dim conn As ADODB.Connection


Dim rst As ADODB.Recordset
Dim Nsql As String, Njoin As String, Ncriteria As String
Dim NewBook As Workbook
Dim i As Integer
Ir
Ir para
para código
código exemplo
exemplo
' Cria o objeto Connection. Recuperar
Recuperar dados
dados de
de
Set conn = New ADODB.Connection Access
Access
With conn
' Define o provedor OleDB para a conexão.
.Provider = "Microsoft.JET.OLEDB.4.0"
' Abre uma conexão com o Northwind.mdb.
.Open Application.Path & "\samples\northwind.mdb"
End With

Nsql = "SELECT DISTINCTROW Categorias.NomeDaCategoria, " _


& "Produtos.NomeDoProduto, Produtos.QuantidadePorUnidade, " _
& "Produtos.PreçoUnitário "
Njoin = "FROM Categorias INNER JOIN Produtos ON " _
& "Categorias.CódigoDaCategoria = Produtos.CódigoDaCategoria "
Ncriteria = "WHERE ((([Produtos].Descontinuado)=No) AND " _
& "(([Produtos].UnidadesEmEstoque)>20));"

' Cria um novo objeto Recordset.


Set rst = New ADODB.Recordset
With rst
' Conecta este conjunto de resultados à conexão aberta anteriormente.
.ActiveConnection = conn
' Recupera todos os registros da tabela Cliente.
.Open Nsql & Njoin & Ncriteria, conn, adOpenDynamic, _
adLockBatchOptimistic
End With

' Adiciona uma nova planilha a esta pasta de trabalho


Set NewBook = Workbooks.Add
' Efetua loop em todos os campos, retornando os nomes de campos
' à planilha.
For i = 0 To rst.Fields.Count - 1
NewBook.Sheets(1).Range("a1").Offset(0, i).Value = rst.Fields(i).Name
Next i
' Copia o conjunto de resultados para a nova planilha.
NewBook.Sheets(1).Range("a2").CopyFromRecordset rst

' Fecha o conjunto de resultados.


Set rst = Nothing
' Fecha a conexão.
conn.Close
End Sub

Listar tabelas em um banco de dados

Este exemplo lista as tabelas no banco de dados Northwind.mdb do Microsoft


Access. Esse exemplo requer que o arquivo Northwind.mdb esteja instalado em
seu computador.

Sub ListTables()
'' OBSERVAÇÃO: Esta sub-rotina requer que você faça referência à
''' última versão da seguinte biblioteca:
'''
'' Biblioteca do Microsoft ActiveX Data Objects

Dim conn As ADODB.Connection


Ir
Ir para
para código
código exemplo
exemplo Listar
Listar
Dim rst As ADODB.Recordset tabelas
tabelas
' Cria o objeto Connection.
Set conn = New ADODB.Connection
With conn
' Define o provedor OleDB para a conexão.
.Provider = "Microsoft.JET.OLEDB.4.0"
' Abre uma conexão com o Northwind.mdb.
.Open Application.Path & "\samples\northwind.mdb"
End With

Set rst = conn.OpenSchema(adSchemaTables)

While Not rst.EOF


If rst.Fields("TABLE_TYPE") <> "VIEW" Then
MsgBox rst.Fields("TABLE_NAME")
End If
rst.MoveNext
Wend

Set rst = Nothing


conn.Close
End Sub

Listar campos em uma tabela

Este exemplo lista as tabelas no banco de dados Northwind.mdb do Microsoft


Access. Esse exemplo requer que o arquivo Northwind.mdb esteja instalado em
seu computador.

Sub ListFields()
'' OBSERVAÇÃO: Esta sub-rotina requer que você faça referência à
''' última versão da seguinte biblioteca:
'''
'' Biblioteca do Microsoft ActiveX Data Objects

Dim conn As ADODB.Connection


Dim rst As ADODB.Recordset Ir
Ir para
para código
código exemplo Listar
Dim fld As ADODB.Field campos
campos

' Cria o ojbeto Connection.


Set conn = New ADODB.Connection
With conn
' Define o provedor OleDB para a conexão.
.Provider = "Microsoft.JET.OLEDB.4.0"
' Abre uma conexão com o Northwind.mdb.
.Open Application.Path & "\samples\northwind.mdb"
End With

Set rst = New ADODB.Recordset


With rst
.ActiveConnection = conn
.Open "SELECT * FROM Customers"
End With

For Each fld In rst.Fields


MsgBox fld.Name
Next fld

Set rst = Nothing


conn.Close
End Sub

Adicionar dados a uma nova tabela em um banco de dados do Access

Este exemplo adiciona uma nova tabela ao banco de dados Northwind.mdb. Em


seguida, a sub-rotina preenche a tabela com dados localizados nas células
S1:V30 desta planilha. Esse exemplo requer que o arquivo Northwind.mdb
esteja instalado em seu computador.

Sub CreateTable()
'' OBSERVAÇÃO: Esta sub-rotina requer que você faça referência às
''' última versão das seguintes bibliotecas:
'''
'' Biblioteca do Microsoft ActiveX Data Objects
'' Microsoft ADO Ext. 2.5 para DDL e segurança

' As quatro primeiras linhas Dim estão declarando e criando


' simultaneamente novos objetos. Você pode usar esta sintaxe ou
' a instrução Set para criar os objetos.
Dim cat As New ADOX.Catalog
Dim tbl As New ADOX.Table Ir
Ir para
para código
código exemplo
exemplo
Dim conn As New ADODB.Connection Criar
Criar tabela
tabela
Dim rst As New ADODB.Recordset

Dim looprange As Range


Dim currcell As Range

With conn
' Define o provedor OleDB para a conexão.
.Provider = "Microsoft.JET.OLEDB.4.0"
' Abre uma conexão com o Northwind.mdb.
.Open Application.Path & "\samples\northwind.mdb"
End With

' Define a conexão ativa para o objeto Catalog.


cat.ActiveConnection = conn
With tbl
' Atribui nome à nova tabela.
.Name = "TabelaDeVendas"
' Atribui nome às colunas da nova tabela.
With .Columns
.Append "Nome"
.Append "Região"
.Append "Produto"
' A coluna Vendas deve ser o tipo de dados Moeda.
.Append "Vendas", adCurrency
End With
End With

' Adiciona a tabela ao banco de dados.


cat.Tables.Append tbl

With rst
.ActiveConnection = conn
' Abre a nova tabela. O argumento LockType do método
' Open deve ser definido para adLockOptimistic de modo que
' sejam adicionados registros à tabela.
.Open "TabelaDeVendas", LockType:=adLockOptimistic
End With

' Define o intervalo na planilha ativa que contém os registros


' a serem adicionados ao banco de dados.
Set looprange = Range("s2", Range("s2").End(xlDown))

' Efetua loop nas informações contidas na planilha.


For Each currcell In looprange
With rst
' Adiciona um novo registro.
.AddNew
' Adiciona informações aos campos corretos.
.Fields("Nome").Value = currcell.Value
.Fields("Região").Value = currcell.Offset(0, 1).Value
.Fields("Produto").Value = currcell.Offset(0, 2).Value
.Fields("Vendas").Value = currcell.Offset(0, 3).Value
' Escreve o novo registro no banco de dados.
.Update
End With
Next currcell

rst.Close
Set tbl = Nothing
Set cat = Nothing
conn.Close
End Sub
Interceptando erros ADO

Este exemplo ilustra como interceptar e retornar informações relevantes sobre


um erro que você pode receber ao executar o código ADO.

Sub Trap_ADO_Errors()
'' OBSERVAÇÃO: Esta sub-rotina requer que você faça referência à
''' última versão da seguinte biblioteca:
'''
'' Biblioteca do Microsoft ActiveX Data Objects

Dim conn As ADODB.Connection


Dim tbar As String, msg As String

' Vai para a seção chamada "ErrorHandler:" quando


' ocorrer um erro.
On Error GoTo ErrorHandler Ir
Ir para código exemplo
Interceptar
Interceptar erros
erros ADO
ADO
' Cria o objeto Connection.
Set conn = New ADODB.Connection
With conn
' Define o provedor OleDB para a conexão.
.Provider = "Microsoft.JET.OLEDB.4.0"
' Abre uma conexão com o abc.mdb.
.Open "C:\abc.mdb"
End With
' Sai da sub-rotina se nenhum erro for encontrado.
Exit Sub
ErrorHandler:
' Faz referência à coleção Errors do objeto
' Connection.
With conn.Errors(0)
' A barra de título conterá a origem do
' erro.
tbar = .Source
' A mensagem conterá o número do erro e o
' texto da mensagem de erro.
msg = "Número do erro: " & .Number & _
WorksheetFunction.Rept(Chr(13), 2) & _
.Description
' Exibe informações sobre o erro.
MsgBox prompt:=msg, Title:=tbar
End With
End Sub
Não modifique
esta tabela. Ela
é necessária para
exemplos contidos
nesta pasta de trabalho.
Nome Região Produto Vendas
Não modifique Luis Leste Maçãs $759
esta tabela. Ela Luis Leste Bananas $707
é necessária para Luis Leste Peras $188
exemplos contidos Luis Leste Laranjas $121
nesta pasta de trabalho. Paulo Sul Bananas $689
Paulo Sul Laranjas $345
Paulo Sul Maçãs $244
Paulo Sul Peras $962
Jorge Sul Maçãs $732
Jorge Sul Peras $908
Jorge Sul Laranjas $755
Jorge Sul Bananas $30
Pedro Leste Bananas $979
Pedro Leste Laranjas $123
Pedro Leste Peras $21
Pedro Leste Laranjas $799
José Sul Laranjas $244
José Sul Bananas $516
José Sul Maçãs $562
José Sul Peras $190
Carlos Norte Peras $300

Carlos Norte Laranjas $704


Carlos Norte Bananas $785
Carlos Norte Maçãs $527
Edison Norte Peras $513

Edison Norte Laranjas $800

Edison Norte Bananas $138


Edison Norte Maçãs $430

Das könnte Ihnen auch gefallen