Procura Vertical (PROCV) com imagens

A função de procura vertical (PROCV ou VLOOKUP em inglês) está entre as mais solicitadas pelos nossos alunos do Curso de Excel (http://www.mprinformatica.com.br/excelintermediario.html), isso se deve ao fato de frequentemente organizarmos informações em tabelas e precisarmos localizar e extrair algum dado específico.
A função PROCV extrai qualquer tipo de dado que esteja em uma célula, mas e se precisarmos extrair uma imagem? Ou seja, se quisermos procurar por um item e depois visualizar a imagem correspondente? Como exemplo, imagine que possuímos uma tabela que possua as informações de nossos clientes e como a tabela é extensa, ficaria muito prático se ao selecionarmos um cliente pudéssemos ver a foto desse cliente.
As células do Excel não armazenam nem exibem imagens, porém como as imagens são arquivos de computador, podemos armazenar o caminho das imagens nas células, ou seja a sua localização em disco, conforme mostrada na figura abaixo.

Colocamos esses dados numa planilha chamada Tabela. Nessa tabela simplificada, temos uma coluna Número, que pode ser o número de cadastro do cliente, o campo Nome – nome completo do cliente, e a coluna Caminho, que é a localização do arquivo de imagem com a foto do cliente. Neste exemplo, haverá uma pasta Imagem no drive C:, com todas as fotos dos clientes, o que torna bastante simples a organização e como os arquivos de imagem não foram incorporados na planilha do Excel, ela ficará muito leve.

Além da planilha com os dados onde serão feitas as pesquisas, criamos uma planilha chamada Principal, onde será efetuada a pesquisa, ou seja, onde usaremos a função PROCV. Ela terá a seguinte aparência.

onde:
> As células A1:A4 são apenas descrições
> A célula B1 é o local onde digitaremos o número do cliente, para que sejam exibidos o nome e a imagem do mesmo.
> A célula B2 possui uma simples busca pelo nome do clinte com a seguinte fórmula: =PROCV(Principal!B1;Tabela!$A$4:$C$9;2;FALSO)
> A célula B3 possui a busca pelo caminho da imagem. A fórmula é: =PROCV(Principal!B1;Tabela!$A$4:$C$9;3;FALSO)

Relembrando, as células do Excel não exibem imagens, então precisaremos de um recurso que faça isso. Escolhemos usar um controle ActiveX, para inseri-lo faça o seguinte:
– Ative a guia do Desenvolvedor (Botão do Office; Opções do Excel; ativar a caixa Mostrar guia Desenvolvedor na Faixa de Opções; OK.
– Na guia desenvolvedor, clique no botão Inserir (ícone de maleta com ferramentas) e clique sobre o controle Imagem (ActiveX);
– Agora desenhe um retângulo, arrastando o cursor do mouse de um vértice até o vértice oposto. O tamanho da imagem pode ser mudado depois através dos círculos em torno desse retângulo.

O local onde será exibida a imagem está pronto, veja o nosso exemplo na figura anterior. Esse controle precisa ser configurado, para isso clique no botão propriedades que está na guia Desenvolvedor. Altere as seguintes propriedades:
(Name) para imgfoto
PictureSizeMode para 1-fmPictureSizaModeStretch

Feche a janela de propriedades e desative o botão Modo de Design na guia Desenvolvedor.

A etapa final é elaborar um pequeno código em VBA para que a imagem seja atualizada sempre que um novo código for digitado. Para isso vá até o editor do VBA através da combinação Alt+F11 e dê um clique duplo na planilha Principal, conforme indicado na figura a seguir:

Do lado direito haverá uma grande área em branco para inserção de código, copie e cole o seguinte trecho:

Private Sub Worksheet_Change(ByVal Target As Range)
‘Lembrando que target é a referência para a célula modificada

‘verifica se a célula que contém o número do cliente foi modificada
‘Nesse caso é a célula B1
If Target.Row = 1 And Target.Column = 2 Then
‘Carrega imagem de acordo com o caminho indicado na procura vertical
‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
‘O seu uso é necessário
imgfoto.Picture = LoadPicture(Range(“B3”).Value)
End If
End Sub

Feche o editor de VBA e salve a planilha habilitando-a para usar macros: Salvar Como e depois escolher a segunda opção “Pasta de Trabalho habilitada para Macro do Excel”.

Antes de experimentar o sistema, crie uma pasta com o nome Imagens, no drive C: (se for outro local, mude também o caminho na tabela) e copie os arquivos de imagem listados na tabela, como exemplo, eu disponibilizei para download um arquivo compactado com as imagens usadas no exemplo (imagens.zip)

Agora teste o sistema, digitando valores na célula B1 da planilha principal.
(Este exemplo pode ser baixado neste link procura vertical com imagens.xlsm)

125 comentários em “Procura Vertical (PROCV) com imagens”

  1. Achei excelente a dica. Já testei e consegui fazer com que a idéia funcionasse.

    Estou porém com um problema… Eu quero que a celula alterada (no caso do exemplo acima a B1) esteja em uma planilha diferente da figura.

    Neste caso tanto o comando

    If Target.Row = 1 And Target.Column = 2 Then quanto
    LoadPicture(Range(”B3″).Value)

    devem buscar dados em outra planilha.

    Poderia me auxiliar?

  2. Caramba… não consegui fazer essa planilha.

    Eu copiei e colei o comando no visual basic como vc sugeriu:

    Private Sub Worksheet_Change(ByVal Target As Range)
    ‘Lembrando que target é a referência para a célula modificada

    ‘verifica se a célula que contém o número do cliente foi modificada
    ‘Nesse caso é a célula B1
    If Target.Row = 1 And Target.Column = 2 Then
    ‘Carrega imagem de acordo com o caminho indicado na procura vertical
    ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
    ‘O seu uso é necessário
    imgfoto.Picture = LoadPicture(Range(”B3″).Value)
    End If
    End Sub

    Dae eu habilito a planilha para macro no excel, mas as fotos não aparecem e quando eu altero o numero do codigo do cliente, o excel vai para a tela do visual basic e aparece uma mensagem “Erro de compilação” “Erro de sintaxe” e a frase “Private Sub Worksheet_Change(ByVal Target As Range)
    ‘Lembrando que target é a referência para a célula modificada” aparece grifada.

    O que está errado? Como fazer a planilha funcionar?

    Muito obrigado pela atenção.

    Abs

    1. Bom dia, Kevin
      Uma alternativa para não ter que adaptar fórmula por fórmula seria digitar as entradas assim:

      Disponível: 01/07/2012 23:00:00
      Acionado: 02/07/2012 02:25:00
      Ocupado: acionado-disponível

      Como foi adicionado a data junto com a hora (apenas com um espaço entre eles), o Excel entenderá na fórmula de subtração que houve mudança de dia e fará o cálculo conforme o resultado esperado.
      Para não visualizar a data junto com a hora na célula, formate-a conforme o desejado.

  3. Ola,
    Parabens pelo blog, achei muito util sua explicação para esta materia, já que há tempos tento inserir uma imagem no excel.
    Porem, sou novato no assunto, e estou com problema na hora de criar o codigo em VBA.
    Eu copiei e colei o codigo na area branca, mas ele dá erro de compilação.
    Onde será que estou errando??
    A unica diferença para a minha planilha para a sua se refere as celulas, onde o seu B1=V2 e o seu B3=W1 no meu.
    Preciso alterar mais alguma coisa??
    Se vc puder me ajudar agradeço.
    Abraço

  4. Prezado Fernando,

    Percebi que se você copiar e colar o código, os caracteres apóstrofe (‘) e aspas (“) são alterados, devido ao tipo de fonte usado no blog.
    Para corrigir isso, depois que você colar o código, redigite todos os apóstrofes e aspas.
    Outra opção é fazer o download dos arquivos originais, indicados na dica.

    Abç.

    1. Olá Carlos César Tanaka, tem como fazer a procura direto na pasta ao invés do caminho na célula ?

      tipo assim
      Private Sub Worksheet_Change(ByVal Target As Range)
      If target.Row = 1 And target.Column = 2 Then
      imgfoto.Picture = LoadPicture(“C:\fotos\” & target.Value & “.jpg”)
      End If
      End Sub

      obrigado e uma boa noite cara, abraços e fica com Deus 😉

  5. Olá Carlos Cardoso,

    Veja o comentário anterior que fiz para o Fernando.
    Altere as fórmulas que usam a função PROCV das células B2 e W1 para usarem a célula V2 em vez de B1.
    Se isso não resolver, favor enviar mais detalhes sobre a mensagem de erro.

    Abç.

  6. Olá Raphael,

    Sua resposta foi enviada por email, mas vou deixar registrado no blog também.
    O código VBA deverá estar na planilha que contém a célula a ser alterada (e não na Principal).
    As fórmulas que contém as Procv, também devem ser ajustadas com o endereço da nova planilha.
    Por último o código VBA deve sofrer uma adaptação, em vez de usar simplesmente:

    imgfoto.Picture = LoadPicture(Range(“B3”).Value)

    Se a sua nova planilha de chamar Teste, use

    imgfoto.Picture = LoadPicture(Sheets(“Teste”).Range(“B3”).Value)

    Abç.

  7. Olá,
    Realmente não levo jeito para VBA, já tentei tudo o que foi possivel para fazer funcionar meu arquivo mas não tem jeito.
    Há a possibilidade de eu te enviar o arquivo para vc fazer o codigo para mim?
    Desde já agradeço a paciencia e a boa vontade.
    abraço
    Carlos

  8. Carlos,
    Meus parabéns pela dica!
    Mas vai uma pergunta boba: só funciona no Excel 2007?
    Como uso o Excel 2003, dá pra fazer o mesmo usando outros recursos?
    Desde já grato pela atenção.

      1. Olá Jéssica,

        Pelo que me lembro, os controles estão disponíveis pelo menu Exibir, Barra de ferramentas, Caixa de ferramentas de controle.
        Se precisar de mais detalhes, pode ser interessante entrar em contato com a MPR (www.mprinformatica.com.br) e agendar uma visita.

        César

  9. Caramba Carlos… Excelente dica!!! Funcionou perfeitamente para o que eu queria. Muito obrigado.

    Só tenho um pequeno problema. Quando eu não tenho a foto do produto e digito o código, aparece uma mensagem dizendo:

    “Erro em tempo de execução ’53’:

    O arquivo não foi localizado”

    E daí o excel me dá as seguintes opções “Fim”, “Depurar”, “Ajuda”.

    Como eu faço para que o Excel simplesmente deixe uma foto dizendo “Foto indisponivel”?

    Outra duvida é: Eu consigo usar fotos em jpeg ou invés de bmp?

    se puder me responder para o meu e-mail para que eu não tenha que entrar no site todos os dias, lhe agradeço, no entanto se não puder não tem problema!

    Muito obrigado pela atenção e mais uma vez PARABÉNS!

    Abs

  10. Prezado Fernando,

    O controle de imagem presente no Excel não aceita imagens do tipo JPEG.
    Em relação ao erro se não existir o arquivo, você pode modificar o procedimento em VBA para avisar o usuário caso a imagem não exista, vide exemplo abaixo.
    Note que se você copiar e colar o código abaixo, preste atenção, pois às vezes o caracter de comentário é trocado pelo acento grave e as aspas também podem ser trocadas.

    Boa sorte!

    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Mensagem
    ‘Lembrando que target é a referência para a célula modificada

    ‘verifica se a célula que contém o número do cliente foi modificada
    ‘Nesse caso é a célula B1
    If Target.Row = 1 And Target.Column = 2 Then
    ‘Carrega imagem de acordo com o caminho indicado na procura vertical
    ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
    ‘O seu uso é necessário
    Imgfoto.Picture = LoadPicture(Range(“B3”).Value)
    End If
    Exit Sub

    Mensagem:
    MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

    End Sub

  11. Carlos,
    Obrigado por responder a minha duvida. Entendi o que você fez e funcionou muito bem. No entanto isso não atende muito bem o que eu preciso. Pois essa planilha se transforará em uma apresentação

    Eu preciso que caso o sistema não encontre a foto no banco de dados, o sistema puxe uma foto no banco de dados chamada “Foto Indisponível”. Essa foto conterá nada mais do que uma frase escrito “Foto Indisponível”.

    Como eu faço isso e mais uma vez obrigado por responder esse monte de perguntas!
    Abs

  12. Fernando,

    Crie um arquivo de imagem com o conteúdo que você deseja e deixe-o no mesmo local dos outros arquivos de imagem. Digamos que esse arquivo se chama indisponivel.bmp.

    Depois troque a linha
    MsgBox (”Imagem de ” & Range(”B2″).Value & ” não existente.”)
    por
    Imgfoto.Picture = LoadPicture(“indisponivel.bmp”)

    Isso deve resolver o seu problema.

  13. Putz Carlos… o pior é que resolveu, mas parcialmente apenas. A sua dica está certa, no entanto eu coloquei nessa planilha pelo menos 6 fotos, que são controladas por códigos, da seguinte forma:

    ******* Inicio dos Comandos **********

    Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Row = 4 And Target.Column = 12 Then
    imgfoto.Picture = LoadPicture(Range(“M4”).Value)
    End If

    If Target.Row = 5 And Target.Column = 12 Then
    imgfoto1.Picture = LoadPicture(Range(“M5”).Value)
    End If

    If Target.Row = 6 And Target.Column = 12 Then
    imgfoto2.Picture = LoadPicture(Range(“M6”).Value)
    End If

    If Target.Row = 7 And Target.Column = 12 Then
    imgfoto3.Picture = LoadPicture(Range(“M7”).Value)
    End If

    If Target.Row = 8 And Target.Column = 12 Then
    imgfoto4.Picture = LoadPicture(Range(“M8”).Value)
    End If

    If Target.Row = 9 And Target.Column = 12 Then
    imgfoto5.Picture = LoadPicture(Range(“M9”).Value)
    End If

    End Sub
    ******* Final dos Comandos **********

    Quando eu dou a instrução que você me deu, colocando no inicio:
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Mensagem

    E no final de todos os comandos eu coloco:
    Mensagem:
    Imgfoto.Picture = LoadPicture(“indisponivel.bmp”)
    End Sub

    Ele obviamente só altera a imgfoto.Picture, porém esse comando não funciona com as demais imagens, Imgfoto1.Picture, Imgfoto2.Picture,3, 4, 5, etc.

    Como eu faço para fazer essa função funcionar para todos os casos? Ou seja, como eu faço para que em todos os casos, se eu digitar um código que não tenha a foto na pasta o excel puxe automaticamente a foto “indisponivel”?

    Abs

  14. cara consegui fazer funcionar só que este macro é executado so se eu for la na célula b1 e digitar , mas
    o que altera essa célula, no meu caso é um controle de formulário e infelizmente assim o macro não execultou, valeu pela atenção

  15. Fernando,

    Penso que um Select Case deve atender a sua necessidade. Algo assim:

    Mensagem:

    Select Case Target.Row
    Case 4: Imgfoto.Picture = LoadPicture(”indisponivel.bmp”)
    Case 5: Imgfoto1.Picture = LoadPicture(”indisponivel.bmp”)
    Case 6: Imgfoto2.Picture = LoadPicture(”indisponivel.bmp”)
    Case 7: Imgfoto3.Picture = LoadPicture(”indisponivel.bmp”)
    Case 8: Imgfoto4.Picture = LoadPicture(”indisponivel.bmp”)
    Case 9: Imgfoto5.Picture = LoadPicture(”indisponivel.bmp”)
    End Select

    Boa sorte.

  16. Ruan,

    Você pode tentar duas abordagens.

    1. Dependendo do controle que você usa, há propriedades que vinculam o conteúdo do controle a uma célula, por exemplo ‘ControlSource’ e ‘LinkedCell’. Indique a célula com o código nesses campos que o sistema funcionará.

    2. Em VBA, você pode usar as funções procv e proch (vlookup e hlookup) pelo objeto: worksheetfunction, exemplo, application.WorksheetFunction.VLookup

    Boa sorte.

  17. Carlos bom dia! Parabéns pela dica, excelente. Porém gostaria de uma ajudinha sua. Gostaria que a fórmula buscasse a figura dentro da própria planilha.

    Grato.

  18. Olá Lincoln,

    Sobre a primeira questão, se a sua tabela estiver na mesma planilha onde está a figura, então mude as fórmulas das células B2 e B3. Por exemplo, se a tabela estiver no intervalo H1:J5 as fórmulas ficarão:
    em B2 =PROCV(B1; $H$1:$J$5;2;FALSO)
    em B3 =PROCV(B1; $H$1:$J$5;3;FALSO)

    Sobre o redimensionamento da figura. Primeiro ative a guia Desenvolvedor (botão do Office, Opções do Excel, ativar “Mostrar guia Desenvolvedor na Faixa de Opções”)

    Depois ative o “Modo de Design” pela guia Desenvolvedor. Clique na figura e dimensione conforme a sua necessidade.
    Por último desative o modo de Design.

    Boa sorte.

  19. Carlos boa tarde!

    Acredito que me expressei mal, vou tentar ser um pouco mais claro para que você consiga entender o que necessito. Suponhamos que tenho uma arquivo de Excel na qual temos: Plan1, Plan2 e Plan3.Na Plan1 tenho uma tabela que necessita associar um código a uma figura, porém todas as figuras (aproximadamente 20) estão dispostas em Plan3. Como faço para que o código VBA busque estas figuras na Plan3 e às associe de acordo com o código que eu digitar em uma célula em Plan1?

    Desde já agradeço.

    Obs: com relação em alterar o tamanho da imagem, sem problemas conseguir fazer.

  20. Tudo bem Carlos?

    To precisando de sua ajuda novamente. Necessito de uma macro que Faça o Seguinte:

    Tenho Plan1 e Plan2, e um botão para executar a Macro em Plan2. Preciso copiar dados da Plan1 na coluna A1:A20 e colar estes valores em Plan2 na Coluna A1:A20, porém quando eu executar esta macro novamente preciso que ela copie novamente os dados que estão em Plan1 (A1:A20) e cole agora em B1:B20 em Plan2 e assim sucessivamente? Há esta possibilidade?

    Grato.

  21. Ótima dica. Estou procurando isso faz tempo! Comigo funcionou mas não serviu para o que eu queria, já que no meu caso preciso de imagens com boa resolução e de tamanho grande porque é para um controle de mapas que eu tenho. E sinceramente as imagens ficaram horríveis e distorcidas… Recapitulando… O mecanismo funciona bem… mas é limitado quando se quer qualidade de imagem. E tb inviável em alguns casos por não suportar .JPG. A pergunta que não quer calar seria: Será que não existe um outro jeito?

  22. Olá Hélio,

    Estamos sempre procurando novas maneiras para resolver esses problemas. Quanto ao suporte a outros formatos, como o JPG, vamos agauradar pelo lançamento da versão Office 2010 e esperar que ele já suporte uma gama mais ampla de formatos gráficos.
    O lançamento oficial ocorrerá nas próximas semanas!

  23. boa Tarde,

    Muita boa a dica, mas estou com um problema,
    quano digito o codigo do cliente aparece a segunte erro: ” erro em tempo de execução ’76’:
    Caminho não localizado”

    O que faço??

    Obrigado

  24. Muito boa a dica,

    Mas estou com um erro que não consigo resolver.
    Quando digito o codigo do cliente aparece a seguinte mensagem:
    Erro em tempo de Execução ’76’:
    Caminho não localizado.

    só que fiz tudo conforme exemplificado o codigo vba usado foi:

    Private Sub Worksheet_Change(ByVal Target As Range)
    ‘Lembrando que target é a referência para a célula modificada

    ‘verifica se a célula que contém o número do cliente foi modificada
    ‘Nesse caso é a célula B1
    If Target.Row = 1 And Target.Column = 2 Then
    ‘Carrega imagem de acordo com o caminho indicado na procura vertical
    ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
    ‘O seu uso é necessário
    imgfoto.Picture = LoadPicture(Range(“B3”).Value)
    End If
    End Sub

    O que posso fazer para corrigir o erro?

    Obrigado

  25. Olá Paulo Oliveira,

    Os navegadores costumam trocar as aspas duplas e simples quando colocamos um trecho de código e publicamos em um site.
    Acho que esse pode ser o seu caso. Note que no comando:
    imgfoto.Picture = LoadPicture(Range(”B3″).Value)
    As aspas que antecedem B3 são diferentes das que terminam.

    Tente o seguinte, vá até o código VBA, apague as aspas que cercam B3 e digite novamente. Isso pode também acontecer com os apóstrofes (aspas simples).

    Boa sorte.

  26. Boa noite Carlos!

    No meu caso a célula que se modifica fica na terceira planilha, chamei de Base 1, na posição F9 (fiz o procv direitinho para o F9).

    Sendo assim alterei no código, onde está escrito B3, coloquei
    “Plan3!F9”, ficando da seguinte forma: imgfoto.Picture = LoadPicture(Range(“Plan3F9”).Value, também tentei colocar (“Base1F9”), e também não deu certo.
    Você pode me ajudar a resolver esse problema?Obrigado

  27. Carlos,
    Tentei agora com a célula que se modifica na mesma planilha (B78), alterando o código para imgfoto.Picture = LoadPicture(Range(“B75”).Value, porém não deu certo também.

  28. Carlos, meu caso talvez se enquadre no mesmo do Ruan, pois o meu caso trata-se de um formulário com vínculo de células, ou seja a célula modificada não é digitada diretamente nela, não sei se tem algum sentido isso. Obrigado !

  29. Carlos,

    Não consegui fazer, não sei se o problema ocorre porque
    não digito o valor diretamente na célula (modificável), ele se altera automaticamente através de um formulário. Quanto ao caminho, este está em outra planilha ( planilha 3) Obrigado

  30. Olá Fernando,

    O fato de você usar um formulário para alterar a célula na planilha não influi em nada o funcionamento da procura.

    Notei diversos errinhos que podem estar afetando o funcionamento do seu arquivo.

    No seu primeiro comentário, se o nome da planilha é “Base 1”, o certo é imgfoto.Picture = LoadPicture(Range(“Base 1!F9”).Value)

    No segundo comentário você digitou 75 em uma parte e 78 em outra.

    Verifique se o problema é esse.

    Boa sorte.

  31. Carlos, obrigado pelo retorno.
    Nâo deu certo, eu fiz certinho como o seu exemplo em outra planilha. Somente digitei errado no meu recado, mas fiz certo. Agora a célula que aponta o caminho, com procv, está no B 78, então coloquei imgfoto.Picture = LoadPicture(Range(”B78″).Value, e não resolveu. A célula que se modifica é a B 79, tentei alterar para If Target.Row = 79 And Target.Column = 2 Then e também não deu.

  32. Fernando,

    O ponto central para fazer a sua planilha funcionar é a compreensão de eventos. Quando os eventos ocorrem.
    No Excel, os eventos de uma planilha ocorrem somente se a planilha estiver ativa. Se você quiser que um evento da planilha A gere uma mudança na planilha B, então coloque o código VBA na planilha A.

    Espero ter esclarecido.

  33. Ola ja fiz uma pergunta aqui e foi resondido, mas agora pintou uma nova duvida.Na macro procv com imagens, ela so roda ao alterar uma celula na linha especifica, mas na minha planilha sobre copa do mundo quero que a macro rode ao alterar qualquer celula da Plan1.
    Obrigado pela atenção! e a ajuda que ja me deram antigamente.

  34. César. Obrigado por nos ajudar! mas, cara, não to conseguindo fazer

    Primeiro.
    If Target.Row = 1 And Target.Column = 2 Then quanto
    os numeros 1 e 2 referem-se ao que linhas e colunas…?

    Segundo.
    No exemplo que você disponibilizou para baixar esta funcionando mas quando eu mudo o quadro da figura de localização a sua planilha para de funcionar.

    Valeu Pela Ajuda.

  35. Prezado Ruan,

    Para alterar a imagem alterando qualeur célula, basta retirar a estrutura If … Endif

    Então em vez de:
    If Target.Row = 1 And Target.Column = 2 Then
    imgfoto.Picture = LoadPicture(Range(”B3″).Value)
    End If

    O código fica:
    imgfoto.Picture = LoadPicture(Range(”B3″).Value)

    De qualquer modo, o caminho da imagem deve continuar na célula B3.

    Boa sorte

  36. Olá Rafael,

    Sobre a primeira dúvida, Row significa linha, Column significa coluna, então row=1 e column=2 é a célula B1.

    Em relação à sua segunda dúvida, se você mudar a imagem para outra planilha, deverá alterar o código. Por exemplo se somente a imagem foi para a Plan3, então em vez de:

    imgfoto.Picture = LoadPicture(Range(”B3″).Value)

    o código ficará:
    Sheets(“Plan3”).imgfoto.Picture = LoadPicture(Range(“B3″).Value)

    Boa sorte.

  37. Ola, não quero ser chato, mas la vou.
    Ja fui achudado duas vezes por voceis, so que agora pesso ajuda devido a macros em geral.Procurei, procurei mas não achei e resolvi recorrer a voceis.
    Como seria para fazer rodar uma macro em relação ao valor da celula. Por exemplo se na celula c7 tivesse o valor 7 rodasse a macro (rodada_7). Muito abrigado!

  38. Amigo, boa tarde!
    Meus parabens, vc tem muita boa vontade. Bacana!
    Me tira uma duvida, uso o office xp, daria para eu realizar esses passos por essa versão? Se possivel, teria como explicar? Obrigado pela atenção.

  39. Prezado André,
    Boa noite.

    Dá sim para usar o Excel XP, 2003, 2000. Inclusive quase tudo é igual à versão 2007.
    A única parte que muda é a criação do controle imagem, que começa no parágrafo:
    “- Ative a Guia Desenvolvedor …”
    até o o parágrafo:
    “Feche a janela de propriedades e desative o botão Modo de Design na guia Desenvolvedor.”

    Vou postar as modificações a partir desse trecho:

    ==================================================
    – Acioneo menu Exibir, Barras de ferramentas, opção Caixa de ferram. de controle;
    – Na caixa de ferramentas que foi aberta, clique sobre o controle Imagem (ActiveX);
    – Agora desenhe um retângulo, arrastando o cursor do mouse de um vértice até o vértice oposto. O tamanho da imagem pode ser mudado depois através dos círculos em torno desse retângulo.

    O local onde será exibida a imagem está pronto, veja o nosso exemplo na figura anterior. Esse controle precisa ser configurado, para isso clique no botão propriedades que está na Caixa de feramentas. Altere as seguintes propriedades:
    (Name) para imgfoto
    PictureSizeMode para 1-fmPictureSizaModeStretch

    Feche a caixa de ferramentas.

    ==================================================

    Boa sorte.

    1. De1 para fazer uma De1 para fazer uma macro para receber os dados de 15 ouatrs planilhas com as mesmas informae7oes da planilha principal, como se fosse um upload, sem ter a necessidade de copiar e colar? Pois por mes sao mais de 150 dados da fazer isso com macro e como fazer?? fico grata

  40. Boa tarde,

    como faço para ao invél de digitar eu utilizar o formulário caixa de combinação, ou seja, toda vez que o vicnculo da celula mudar a foto também muda? Sem precisar de digitar. pode ser com procv também..na celula b1

  41. Viva
    Será que me podem dizer como fazer um procv com imagens que estão alojadas no C:?

    Tipo:
    A B
    1 cod1 – imagem1
    2 cod2 – imagem2
    3 cod3 – imagem3
    4 cod4 – imagem4

    Sendo que o caminho da imagens seria C:fotonome do codigo (ex:cod1)

    Não sei se me estou a fazer entender?
    Agradecia imenso a v/ ajuda

  42. Tenho interesse de montar um banco de dados com fotos de meus alunos….estou utilizando a funcao procv…mas nao estou tendo sucesso…agradeço se puderem me ajudar…valeu..

  43. Olá Carlos!

    Como não tenho grandes abilidades com o VBA estou meio perdido com essa função. PictureSizeMode para 1-fmPictureSizaModeStretch.

    A princípio não encontrei no 2007 o local para esta configuração. Acredito que esteja faltando esta configuração para funcionar, pois fiz até aqui conforme as suas instruções, mas está dando este erro:
    ( erro de tempo de execução ‘9’:
    Subscrito fora do intervalo

    Desde já agradeço a sua atenção.

  44. Olá Rone Cleidson Pereira,

    Crie uma caixa de combinação no formulário, através da guia Desenvolvedor (se ela não estiver aparecendo vá até o botão do Office, clique em Opções do Excel e marque a caixa “Mostrar guia Desenvolvedor …”)
    Acione o botão Inserir e escolha a caixa de combinação dos controles ActiveX.
    Acione as propriedades desse controle e defina o valor da propriedade “LinkedCell” para B2 e ListFillRange para o intervalo que contêm os nomes dos itens que você quer listar (no exemplo, vaca, tigre, coelho etc.)

    Boa sorte.

  45. Prezado Nuno,

    Esta solução em Excel não irá lhe atender porque deve haver uma quantidade de controle de imagens igual ao número de arquivo de imagens do seu HD. E isso além de ser variável, pode ser bem grande.

    Eu sugiro que você utilize o Access. Lá você cria uma tabela com o cadastro do aluno, inclusive com um campo para armazenar as fotos.

    Boa sorte

  46. Prezado Fabiano,
    Bom dia,

    Em relação à propriedade PictureSizeMode, você precisa deixar o controle da imagem selecionado (antes você deve ativar o modo de design – esquadro com régua na guia Desenvolvedor) e depois ativar a janela de Propriedades (ao lado do botão que ativa o modo Design)

    Sobre o erro que está ocorrendo, informe em qual linha o programa está parando. Em um erro desse tipo, a execução é interrompida com uma linha amarela. na parte central superior da janela você pode identificar a linha que tem o erro.

    Verifique mais uma vez o código, pois um único caractere errado pode prejudicar o funcionamento do programa.

    Boa sorte.

  47. Carlos! boa tarde.
    Funcionou muito bem, é perfeito.
    Verificando os comentários, que não funcionaria em “jpg”, mas para mim funcionou. A unica situação que os arquivos originais de imagem(fotos) é de 15 a 100 kB, mas dentro do arquivo de excel fica em torno de 700 KB ou até mais, mas sem problemas.
    Para este caso há algum modo quando fechar o arquivo que esse ficasse sem imagem, pois acredito que assim não ficaria um arquivo pesado.
    Desde já agradeço a atenção, e PARABENS.

  48. Primeiramente, gostaria de lhe dizer que em parte a sua dica funcionou muito bem. Mesmo assim, estou com uma dificuldade em poder mostrar mais de uma figura na mesma planilha.

    A minha intenção é fazer uma lista onde haja uma coluna com números e na coluna ao lado figuras e conforme estes números sejam alterados as figuram também se alterem.

    Para uma figura eu consegui fazer seguindo a sua dica. Mas quando tento fazer isto para mais de uma figura o Excel informa que não é possível. Acredito que o problema esteja na programação do VBA. No entanto, como não conheço programação, não consigo resolver o problema.

    Gostaria então da sua ajuda para me dizer o que posso fazer.

  49. Boa tarde Carlos.

    Conheço muito pouco de VBA.
    Vamos ao assunto…
    Se puder me ajudar nessa dúvida:

    Tenho uma base formada com 4.800 linhas de dados em uma planilha “BASE_DE_PRODUTOS”.
    Seu funcionamento é bem simples e rápido, abre-se um formulário digito “endereço” que corresponde ao end. do dado e defino o comando (Add ou Exclir). Portanto gostaria de saber posso usar da mesma forma que você usou no exemplo do Tigre, Vaca e etc… figuras em formato *.gif???
    Todas essas figuras seriam atribuidas nas rotinas de forma que fiquem vinculadas aos dados da base (como se fosse uma forma de identificar produto) ao digitar código do endereço e caso não houvesse um produto na linha (em uma determinada coluna das 4.800 linhas) aparecesse uma imagem do tipo “Empty” escrito.

    Obrigado Carlos.

  50. Olá Carlos,

    Tudo bem? Sou o Fernando, que te importunou em Setembro de 2009…

    Depois de muito dar cabeçadas, decidi te encher a paciência de novo! rs

    Estou com um problema!! Consegui fazer essa planilha no meu computador (PC) e notebook e a mesma me atendeu perfeitamente por quase 3 anos!!! Sério… essa dica, sempre me ajudou muito!!!

    Entretanto, recentemente:
    1) Criei uma rede de comunicação entre um PC e meu notebook, onde o meu PC acabou sendo utilizado como o “servidor” da empresa.
    2) Para que houvesse um compartilhamento de arquivos entre o notebook e o computador, salvei a planilha, e a pasta com fotos a serem importadas, dentro de uma pasta localizada no PC, a qual eu tenho acesso pelo meu notebook, em virtude da rede criada entre os computadores.
    3) Mudei de windows vista para windows 7 em ambas as maquinas (PC e Notebook).

    Até aí tudo em ordem, alterei o endereço de busca das imagens, e comecei utilizar a planilha que está salva no PC, em meu notebook e tudo funcionou normalmente! Conseguia importar as fotos que desejava (que também estão salvas no PC) sem nenhum problema.

    PORÉM, quando utilizo a mesma planilha (que está salva em no meu PC) em meu PC, ela não funciona! Ao digitar o código da imagem a ser importada, aparece uma mensagem dizendo:

    “Erro em tempo de execução ‘424’:

    Objeto é obrigatório”

    O que não entendo, é por que consigo importar as fotos dessa planilha quando utilizo o meu notebook, mas não consigo importar as fotos nessa planilha, quando utilizo o PC??

    Já tentei, salvar uma planilha igual a essa, e as fotos a serem importadas, em pastas não compartilhadas com o meu notebook e alterei o endereço de busca das imagens, para ver se funcionava, mas o erro persiste!

    Sinceramente não sei mais o que fazer…. Você teria algum palpite?

    Abs,

    1. Olá Fernando,

      O problema deve ser mesmo o caminho de acesso às imagens.
      Tente mapear uma unidade de rede em ambos os computadores (por exemplo, unidade H:). Depois altere o caminho no VBA para apontar para a unidade H:
      Deverá funcionar.

      Boa sorte

  51. Olá parceiro, obrigado pela dica. Funcionou corretamente. Só estou com um problema. A célula em questáo é alterada automáticamente por um controle de formulário Avança Retrocede, como não digito não funciona. Tem como contornar isso??? Meu VBA é bem básico

    1. Olá Jean,

      Não sei qual controle você usou. Por exemplo, se foram usados botões de comando para voltar e avançar, então você usará o evento Click para acionar o código VBA. Suponha que o seu botão de avançar se chame cmdAvancar e o de voltar se chame cmdVoltar. Então os códigos serão os seguintes:

      Private Sub cmdAvancar_Click()
      On Error GoTo Mensagem
      ‘Lembrando que target é a referência para a célula modificada

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula B1
      If Target.Row = 1 And Target.Column = 2 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto.Picture = LoadPicture(Range(“B3”).Value)
      End If
      Exit Sub

      Mensagem:
      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      End Sub

      ‘ e para o botão de voltar:

      Private Sub cmdVoltar_Click()
      On Error GoTo Mensagem
      ‘Lembrando que target é a referência para a célula modificada

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula B1
      If Target.Row = 1 And Target.Column = 2 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto.Picture = LoadPicture(Range(“B3”).Value)
      End If
      Exit Sub

      Mensagem:
      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      End Sub

  52. Olá amigo,

    Gostaria que saber como eu faço para aparecer a imagem uma imagem qualquer nas quais eu nao tenho cadastra já que tentei fazer todas as formas que foram ensinadas acima. Bem, você poderia me passar o passo-a-passo só dessa parte, já que foi a única que não compreendi.

  53. Bem,

    Eu consegui fazer a planinha normalmente, quando faço a pesquisa a imagem correspondente aparece, mas quando não tem a imagem correspondente, a imagem que deveria aparecer dizendo que não esta cadastrada não aparece. Você poderia me dizer quais os motivos por isso acontecer ?

    1. Diogo,

      No código, em vez da linha:

      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      use o seguinte:

      Imgfoto.Picture = LoadPicture(“c:caminhoarquivo_nao_existente.bmp”)

      onde “c:caminhoarquivo_nao_existente.bmp” deve ser o caminho e o nome do arquivo que apresenta a mensagem “Não existente”.

  54. Carlos César , bom tarde.
    Gostei muito do seu projeto, eu gostaria de fazer com que ele buscasse a linha no valor selecionado e coloquei o comando =CÉL(“lin”) no lugar do valor procurado (B1) e funciona ele busca o caminho da foto só que não altera a foto, vc sabe porque?

  55. Olá, estou impressionado com as tuas dicas, que diga-se de passagem, estão sendo muito úteis pois eu já estava há um bom tempo quebrando a cabeça pra conseguir fazer este projeto funcionar. Obrigado por isso.
    Mas estou com alguns probleminhas e gostaria de ver se você pode me ajudar.

    1) o código só funcionou na planilha que vc forneceu. Não consegui fazer ele rodar mesmo montando uma planilha idêntica ao modelo (precisei montar a minha planilha encima da modelo pra fazer um projeto).

    2) o código está funcionando bem qd eu digito os números na célula de referência, mas existem outras coisas tomando esta célula como referência (tabelas e gráficos), e eu desenvolvi alguns controles para esta célula (um botão de rotação e uma barra de rolagem). Tudo (tabelas e gráficos) responde bem qd digito o valor, aciono o botão de rotação ou uso a barra de rolagem, exceto a figura, que só responde à digitação dos dados. Como faço para a figura mudar qd em vez de digitar o valor em B1, ele for mudado pelo uso da barra de rolagem ou do botão de rotação?

    3) como faço para usar duas figuras diferentes (endereços em “V29” e “V30”) ambas respondendo à alteração de valor de B1 (tanto por digitação qt por rolagem ou rotação do valor dessa célula).

    Obrigado,

    Tiago

    1. Olá Tiago,

      Obrigado por participar do nosso blog.
      Vamos aos comentários:

      1) o código só funcionou na planilha que vc forneceu. Não consegui fazer ele rodar mesmo montando uma planilha idêntica ao modelo (precisei montar a minha planilha encima da modelo pra fazer um projeto).
      R. O sistema funciona em qualquer planilha. É preciso fazer três coisas: 1. As fórmulas nas células, 2. O código VBA nos módulos certos 3. Criar um objeto imagem na planilha com o mesmo nome referenciado no código VBA;

      2) o código está funcionando bem qd eu digito os números na célula de referência, mas existem outras coisas tomando esta célula como referência (tabelas e gráficos), e eu desenvolvi alguns controles para esta célula (um botão de rotação e uma barra de rolagem). Tudo (tabelas e gráficos) responde bem qd digito o valor, aciono o botão de rotação ou uso a barra de rolagem, exceto a figura, que só responde à digitação dos dados. Como faço para a figura mudar qd em vez de digitar o valor em B1, ele for mudado pelo uso da barra de rolagem ou do botão de rotação?
      R. Você precisará criar procedimentos para os eventos desses controles. Por exemplo, se você criar um controle SpinButton chamado SpnBotao, então deverá criar um procedimento para quando for clicado na seta para direita e outro para a seta para a esquerda (SpinUp e SpinDown) O código abaixo mostra para o SpinDown, para SpinUp é a mesma coisa.

      Private Sub spnBotao_SpinDown()
      On Error GoTo Mensagem
      ‘Lembrando que target é a referência para a célula modificada

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula B1
      If Target.Row = 1 And Target.Column = 2 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto.Picture = LoadPicture(Range(“B3”).Value)
      End If
      Exit Sub

      Mensagem:
      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      End Sub

      3) como faço para usar duas figuras diferentes (endereços em “V29″ e “V30″) ambas respondendo à alteração de valor de B1 (tanto por digitação qt por rolagem ou rotação do valor dessa célula).
      R. Crie uma célula com a função PROCV para o caminho da segunda imagem.
      Crie um segundo objeto imagem e dê um nome para ele, por exemplo, imgfoto2
      Altere o código acrescentando mais uma linha LoadPicture e alterando as condições da estrutra IF:

      Private Sub Worksheet_Change(ByVal Target As Range)
      On Error GoTo Mensagem
      ‘Lembrando que target é a referência para a célula modificada

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula B1
      If Target.Column = 22 and (Target.row = 29 or target.row=30) Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto.Picture = LoadPicture(Range(“V29”).Value)
      Imgfoto2.Picture = LoadPicture(Range(“V30”).Value)
      End If
      Exit Sub

      Mensagem:
      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      End Sub

  56. Oi Carlos,

    Muito obrigado pelas respostas. Foram muito úteis.
    Eu sempre me achei um zero à esquerda nesse assunto (descobri que era dois zeros à esquerda, mas tudo bem, demorei pra responder porque fui ler um pouco mais sobre o assunto.)
    1. consegui fazer o código funcionar em uma planilha nova: eu estava errando o formato das aspas;

    3. consegui inserir mais figuras vinculando a imagens diferentes, exatamente o que eu queria fazer. Deu certinho.

    2.Realmente não consegui ‘ainda’.
    – primeiro, acho que eu esqueci de mencionar, mas eu estava usando um controle giratório/barra de rolagem de formulario, e não do ActiveX (isso faz diferença?), porque preciso vincular o valor de uma celula (B1) a esses controles ( para que os gráficos e tabelas vinculadas a ele também mudem (não apenas o ActiveX da imagem que estou tentando vincular agora)).
    -mas não consigo vincular esta célula ao controle do ActiveX, apenas ao controle do Formulário;
    -tentei usar os códigos tanto com o ActiveX quanto com o Formulário mas nenhum deles funcionou.
    o erro é:
    Erro em tempo de execução ‘404’
    O objeto é obrigatório
    e quando mando depurar aparece:
    => If Target.Column = x And Target.Row = y Then

    era isso por enquanto.

    Muito obrigado pela ajuda.

    Tiago

    1. Olá TIago,

      Usar controles nos formulários é o mesmo que usar controles ActiveX nas planilhas. A diferença é o local onde irão os códigos. Pode haver um problema, que tecnicamente chamamos de escopo. Se você criar um código para manipular um controle em uma planilha, então esse código precisará referenciar esse controle através do caminho completo.
      Por exemplo, se o seu objeto imagem está na planilha Plan1 e o seu código está no formulário, então o código do formulário deve indicar o caminho completo do controle imagem:

      Plan1.Imgfoto.Picture = LoadPicture(Range(“B3″).Value)

      César

          1. Oi Carlos, tudo bem?

            consegui muito progesso desde a ultima vez que conversamos, mas novamente parei em alguns pontos cruciais. Talves você possa me ajudar:

            1. A minha tabela tem aproximadamente 2000 itens, que aparecem no combobox. Eu decidi dividi-los, usando 2 combobox (ou uma lista e um combobox). A primeira delas (Classes) varre uma coluna da plan2 (C) e adiciona todos os elementos não nulos uma vez à lista 1. A segunda (itens), deve “ler” o que foi escolhido na lista 1, e adicionar na combobox 2 todos os elementos não nulos da culuna à esquerda (B) correspondentes ao valor escolhido na lista 1.

            ex:

            B C
            pera frutas
            frutas
            uva frutas
            frango carnes
            peixe carnes
            maçã frutas
            carnes
            gado carnes

            lista 1 :
            fruta
            carnes

            se em lista 1, frutas >

            combobox 2 :

            maçã
            pera
            uva

            Sabe como eu poderia fazer para a 2ª combo, ler o item que está em B, toda vez que a palavra escolhida na lista 1 aparecer em C, e adicioná-lo se não for nulo?

            2. Resolvi transformar todo o trabalho em um formulário, mas a resolução/definição das figuras qd exibidas no formulário é muito inferior a quando são exibidas no planilha. Isso é sempre assim ou eu fiz algo errado?

          2. Oi Carlos,

            tudo bem?

            cara, consegui resolver o ponto 1.

            Private Sub UserForm_Initialize()
            ‘declare variables
            Dim UniqueString As String
            ‘activate Sheet2 and select D1
            Worksheets(“Plan2″).Activate
            ActiveSheet.[D4].Select
            ‘scroll down column D until the first empty cell
            ‘if the active cell’s value is not in UniqueString
            ‘then append it to UniqueString and add it to ComboBox1
            Do Until IsEmpty(ActiveCell.Value)
            If InStr(1, UniqueString, ” ” & ActiveCell.Value & ” “) = 0 Then
            UniqueString = ” ” & UniqueString & ActiveCell.Value & ” ”
            cb_Classe.AddItem ActiveCell.Value
            End If
            ActiveCell.Offset(1, 0).Select
            Loop
            cb_Classe.Text = cb_Classe.List(0)

            Private Sub cb_Classe_Change()
            Worksheets(“Plan2”).Activate
            ActiveSheet.[d1].Select
            Dim Cl As Range
            Dim ClAddress As String
            With cb_Nome
            Set rSource = Worksheets(“Plan2”).Range(Worksheets(“Plan2”).Cells(1, 4), Worksheets(“Plan2”).Cells(Worksheets(“Plan2”).Rows.Count, 4).End(xlUp))
            ‘if no selection in combobox1 quit
            If cb_Classe.ListIndex < 0 Then Exit Sub
            cb_Nome.Clear
            Set Cl = rSource.Find(ComboBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not Cl Is Nothing Then
            ClAddress = Cl.Address
            Do
            If Cl.Offset(0, -1) Empty Then
            cb_Nome.AddItem Cl.Offset(0, -1).Value
            End If
            Set Cl = rSource.FindNext(Cl)
            Loop While Not Cl Is Nothing And Cl.Address ClAddress
            End If
            End With
            End Sub

            mas o ponto 2 ainda tá me encomodando 🙁

            Abç

          3. Olá Tiago,

            Bom que o trabalho está evoluindo.
            Quanto à qualidade da imagem, tente aumentar o espaço disponível para exibi-la, pois o controle do VBA não realiza um redimensionamento muito bom, perdendo mesmo a qualidade se a imagem for muito grande e tiver que ser reduzida.

          4. Oi Carlos,
            Tudo bem?

            surgiu uma nova dúvida sobre o assunto dos combobox e imagens.
            Percebi que nunca consigo carregar a 1ª imagem da sublista que está no combo2. O erro acusado é :
            “Erro em tempo de execução ‘1004’”
            “Erro de definição de aplicativo ou de definição de objeto”

            Será que você poderia dar uma olhada nos códigos para mim e verificar qual o problema?
            Estou enviando para o teu e-mail o arquivo com a planilha e as imagens.

            Desde já agradeço!

  57. Bom Dia amigo!

    Eu abri o arquivo exemplo e consegui modificar algumas coisas, porém eu precisaria de 10 imagens em uma única tela, e uma única planilha com os códigos das imagens. Como se fosse um catálogo, quando eu digitar em cada campo um código diferente, terei 10 imagens diferentes. É possível? Poderia me ajudar?

    Obrigado,

    Leandro

  58. Olá,
    Parabens pela dica, consegui criar uma tabela semelhante e esta funcionando perfeitamente.
    Só tenho uma dúvida: é possivel buscar a imagem dentro da propria planilha?
    Por exemplo se eu criar uma “Plan3” com as imagens em em bmp..
    Desde já, agradeço pela ajuda.
    Abraço

    1. Olá Anderson,

      Devem existir diversas formas para fazer isso. A que eu conheço é a seguinte. Na Plan3 crie as imagens usando controles ActiveX (Guia desenvolvedor, Inserir, Controle de imagem ActiveX)

      Pelas propriedades do controle, insira as imagens que você quer e nomeie os controles convenientemente (por exemplo, img1, img2, img3, img 4 etc.)

      No código, use o seguinte comando para mudar de imagem:

      Sheets(“plan1”).imgPrincipal.Picture = Sheets(“plan2”).img2.Picture ‘ Sendo que imgprincipal é o controle onde você quer ver as imagens e img2 é uma das instâncias na Plan3.

      César

  59. Cara pode me explicar direito fiz tudo certinho, mais não da de jeito nenhum, fiquei uns dois dias tentando e não da certo, pode explicar mais detalhadamente para mim?

  60. Gostaria de saber se consegui fazer 2 buscas diferentes na mesma planilha. Porque tenho outros PROCV´s na mesma planilha e quando copio a fórmula e mudo as referências, dá um erro de que já existe aquela fórmula com o mesmo nome. Obrigada.

    1. Olá Ana Paula,

      Sim você pode usar quantos PROCV você precisar. Você terá que criar um outro objeto imagem (outros espaço para a inserção das imagens), nomeá-lo (digamos imgfoto2) e alterar o código em VBA, do seguinte modo (supondo que o outro código esteja na célual D1, e as respectivas fórmulas em D2 e D3):

      If Target.Row = 1 And Target.Column = 2 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto.Picture = LoadPicture(Range(“B3”).Value)
      End If

      If Target.Row = 1 And Target.Column = 4 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto2.Picture = LoadPicture(Range(“D3”).Value)
      End If

  61. Prezado Carlos sua paciência no esclarecimento das dúvidas dos internautas tem sido um exemplo. Parabéns. Como todos os comentários acima também estou com dificuldades no meu projeto.
    Venho procurando uma solução para uma planilha de ficha técnica de pratos de um restaurante e preciso colocar a foto juntamente com os dados do prato. Li toda as suas explicações e não consegui fazer com que a imagem apareça, acredito que foi por causa da célula que estou inserindo o item estar em texto (Carpaccio de Vitelo) e vir por uma validação de dados. É possível que esse seja o problema??

    PS.: Consegui fazer no seu exemplo, porem sem a validação. As imagens vieram do mesmo local nas duas planilhas.

    Desde já agradeço.

      1. As imagens estão na rede (servidor) e com o mapeamento da unidade. Localmente ela funciona, fica muito lenta, mas funciona.

        Tentei também colocar a mensagem de foto indisponível, mas não deu certo.

        Queria te enviar a planilha que fiz com suas orientações e outra que tenho que as imagens são chamadas a partir de um gráfico, porem como nao fui eu quem fiz essa planilha nao sei como o criador conseguiu, será que você poderia dar uma olhada para ver como funciona? Eu insiro a imagem dentro de um ponto que fica em um gráfico e ela fica gravada lá, quando seleciono por uma barra de rolagem ele mostra a imagem e os dados vinculados àquele prato. O meu problema com essa planilha é que ser eu alterar a ordem dos pratos na lista principal a foto desvincula do prato, aparecendo outra foto no local. Poderia dar uma analisada nessa planilha???

        Abraço.

  62. muito legal mesmo essas dicas..consegui fazer certinho, mas eu precisava de duas imagens..como faço?..exemplo: uma celula vai buscar uma fotografia…e a outra vai buscar uma outra fotografia..como faço isso?..tentei repeitr os codigos, mas num deu não..me ajudem

  63. Boa noite,
    Carlos

    Muito profissional sua página.

    Tenho uma tarefa.

    Fazer orçamentos no excel.

    Quero criar uma planilha com uma aba orçamento, uma aba tabela.

    Gerei uma planilha igual a sua para entender.

    Vi que na sua planilha principal eu “não posso” colocar mais um conjunto de informações.

    No meu caso gostaria de uma linha embaixo da outra tentei com o seu próprio exemplo e nada.

    Poderia me explicar como posso fazer isto?

    Desde já agradeço,
    Augusto

    1. Boa tarde Augusto,

      É possível colocar várias informações em uma planilha do Excel. Você poderia postar esse seu arquivo em um site para upload (4shared, por exemplo)
      para darmos uma olhada. Também não entendi o que voc~e quis dizer com “No meu caso gostaria de uma linha embaixo da outra tentei com o seu próprio exemplo e nada.”

      César

      1. Boa noite,
        Carlos.

        Vou tentar me explicar melhor.

        Eu quero a planilhe fique assim.

        Plan1! – Uma lista (“banco de dados”)

        A B C D E
        Código – nome – tamanho – valor $ – C:banco de

        1 100 – carro – 10 x 20 x 30 R$ 3.000,00 C:Monza
        2 350 – moto – 50 x 70 x 10 R$ 2.500,00 C:XTE600
        3 550 – Avião – 100 x 140 x 20 R$ 5.500,00 C:Caça F1000

        Plan2! – Panilha de orçamento para venda

        A B C D E
        Código – nome – tamanho – valor $ – C:banco de

        1 350 – moto – 50 x 70 x 10 R$ 2.500,00 Foto XTE600
        2 550 – Avião – 100 x 140 x 20 R$ 5.500,00 Foto Caça F1000
        3 100 – carro – 10 x 20 x 30 R$ 3.000,00 Foto Monza
        4 350 – moto – 50 x 70 x 10 R$ 2.500,00 Foto XTE600

        Isto é o que eu falo de uma linha com informações uma embaixo da outra, termos 4 fotos diferentes em uma mesma planilha

        Desde já agradeço,
        Augusto

  64. BOM DIA!

    GOSTARIA DE SABER COMO FAZER ALGUMAS ALTERAÇÕES NO CODIGO VBA, PARA Q EU DIGITE O CODIGO NA (PLAN1) E A IMAGEM ALTERE NA (PLAN2).
    POR EXEMPLO
    DIGITEI O CODIGO NA (PLAN1; A1)
    A PROCV PUXOU O ENDEREÇO DA IMAGEM NA (PLAN1; B2)
    MAS MINHA IMAGEM ACTIVEX ESTA NA (PLAN2)
    COMO ALTERA A VBA PARA Q APAREÇA A IMAGEM?

    GRATO!!

    1. Boa tarde Danilo,

      Crie a imagem na Plan2 e forneça o nome correto a ela (por exemplo, imgfoto, como no exemplo do blog)

      No código VBA, você irá fornecer o caminho completo da imagem e da célula que contém o endereço da imagem, através do comando worksheets(“nome da planilha”).
      Veja o exemplo abaixo. Coloquei a imagem na planilha Principal.

      Private Sub Worksheet_Change(ByVal Target As Range)
      On Error GoTo Mensagem
      ‘Lembrando que target é a referência para a célula modificada

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula B1
      If Target.Row = 1 And Target.Column = 2 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Worksheets(“Tabela”).Range(“e1”).Value = Range(“b1”).Value
      Worksheets(“Tabela”).imgfoto.Picture = LoadPicture(Worksheets(“Principal”).Range(“B3”).Value)
      End If
      Exit Sub

      Mensagem:
      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      End Sub

  65. Oi Cesar,
    Estou tentando montar uma planilha de orcamento com o que voce mostrou acima, em cada linha que digito o codigo do produto aparece a descricao e o valor do mesmo, mas quero tambem que apareca a figura, mas nao estou conseguindo, tem como voce me ajudar? qualquer coisa te envio a planilha para voce dar uma olhada.

    Obrigada.

    1. Olá Ana,

      Para usar com diversas imagens, primeiro é preciso que você crie diversos controles de imagens na posição e tamanho que você precisa.
      Em seguida você tem que nomeá=los adequadamente, por exemplo, imgfoto1, imgfoto2, imgfoto3 etc.
      Por último vocês tem estender o código de programação, exemplo para duas imagens:

      Private Sub Worksheet_Change(ByVal Target As Range)
      On Error GoTo Mensagem
      ‘Lembrando que target é a referência para a célula modificada

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula B1
      If Target.Row = 1 And Target.Column = 2 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      Imgfoto.Picture = LoadPicture(Range(“B3”).Value)
      End If

      ‘verifica se a célula que contém o número do cliente foi modificada
      ‘Nesse caso é a célula G1
      If Target.Row = 1 And Target.Column = 7 Then
      ‘Carrega imagem de acordo com o caminho indicado na procura vertical
      ‘A função LoadPicture carrega um caminho de imagem na propriedade Picture
      ‘O seu uso é necessário
      ImgFoto2.Picture = LoadPicture(Range(“G3”).Value)
      End If

      Exit Sub

      Mensagem:
      MsgBox (“Imagem de ” & Range(“B2″).Value & ” não existente.”)

      End Sub

  66. Estou apenas agradecendo, pois as dúvidas que tinha (e não eram poucas) foram esclarecidas nas perguntas acima. muito obrigado e parabéns.

  67. Saudações Carlos,
    estou retornando para informar que consegui resolver minha dúvida anterior seguindo a orientação que você passou para o Ruan no comentário do dia 21/06/2010.
    Mais uma vez gostaria de parabenizá-lo pelo excelente trabalho e sobretudo por compartilhar seus conhecimentos.
    Gratidão.
    Cordial abraço.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.