none
Carregar imagem num objeto Image. RRS feed

  • Pergunta

  • Boa tarde.

    Tenho necessidade de fazer o carregamento de imagens num objecto Image num Userform. Porém esse carregamento deverá depender do Listindex de uma combobox, ou pelo texto dessa combobox.

    Os arquivos de imagem a ser carregados têm o formato JPEG e encontram-se numa pasta de nome "IMAGENS", que por sua vez está incluída na mesma pasta da aplicação Excell.

    Todos os arquivos ora se manuseiam numa Pendrive, ora no disco rígido do PC.

    Utilizo uma rotina para me apresentar imagens de gráficos no objeto Image numa outra aplicação e funciona na perfeição mas o código transposto para esta aplicação não funciona. Não dá erros mas também não apresenta imagens.

    Private Sub CommandButton2_Click()


    Dim QUADRADO
    Dim QUAD As String

        On Error Resume Next
        'Define o nome do arquivo de imagem
      QUAD = ThisWorkbook.Path & "\QUADRADO.JPEG"

        
        'Carrega a imagem salva para o Controle Image1 do Userform
      Image1.Picture = LoadPicture(QUAD)

    End Sub

    Este código ainda não está ligado à textbox, mas deveria funcionar ao acionar o botão 2.

    O que falta acrescentar?

    Grato pela ajuda.


    M_A_S_L

    segunda-feira, 25 de maio de 2015 17:13

Respostas

  • MASL,

    é bem difícil o programa reclamar de um caminho inexistente e ele existir... geralmente é uma letra ou um ponto a mais que faz com que achamos que exista (jpg ou jpeg).

    mas para termos certeza, use a função Dir e verifique se o arquivo realmente existe:

      strimagem = ThisWorkbook.Path & "\nomedaImagem.jpg"
      
      If Dir(strimagem) = "" Then
        MsgBox "O Arquivo " & strImagem &  " Não Existe!"
      Else
         Image1.Picture = LoadPicture(strimagem)
      End If



    Natan

    • Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 14:00
    terça-feira, 26 de maio de 2015 11:38
  • Não testei... mas posso te dizer que você terá problemas...

    Private Sub ComboBox1_Change()
    
    ComboBox1.Text = ""  'Isso aqui também ativa o evento Change
    ....
    ....
    End Sub

    Se a sua ideia é carregar a imagem em relação ao que está selecionado no combobox... basta 

    Private Sub ComboBox1_Change() strImagem = ComboBox1.Value

    'ou.

    strImagem = "NomeDaImagem" & ComboBox1.ListIndex 'Dependendo de como está o nome da sua imagem.

    'E pra garantir que somente seja acionado a regra, caso o item selecionado exista:.

    if ComboBox1.MatchFound then

    strImagem = Combobox1.Value

    end if

    .... End Sub


    não precisa recarregar o RowSource nem fazer loop dentro dos dados


    Natan





    • Editado 'Natan Silva terça-feira, 26 de maio de 2015 16:25
    • Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 22:59
    • Não Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 23:00
    • Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 23:00
    terça-feira, 26 de maio de 2015 16:23

Todas as Respostas

  • Não posso testar agora, mas acho que faltou a palavra chave Set, não?:

    Set Image1.Picture = LoadPicture(QUAD)
    


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 26 de maio de 2015 02:43
    Moderador
  • Bom dia Felipe.

    Tudo de bom para si.

    Após introduzir a instrução Set ..., tudo continua igual. Não carrega a imagem.

    No código está assim:

    Private Sub CommandButton1_Click()
    
    ComboBox1.Text = ""
    ComboBox1.RowSource = Sheets("Folha2").Range("A2:A8").Address
    ComboBox1.BackColor = &HFFFF&
    ComboBox1.Visible = True
    
    ComboBox1.SetFocus
    
    Dim QUADRADO
    Dim QUAD As String
    
        On Error Resume Next
        'Define o nome do arquivo de imagem
      QUAD = ThisWorkbook.Path & "\QUADRADO.JPEG"
      
    Set Image1.Picture = LoadPicture(QUAD)
        
        'Carrega a imagem salva para o Controle Image1 do Userform
      Image1.Picture = LoadPicture(QUAD)
    
    
    End Sub
    

    Não vejo o problema, até porque funciona na outra aplicação. Nas várias rotinas que encontrei e tentei implementar, também não me apresentam imagens.

    Cumprimentos


    M_A_S_L

    terça-feira, 26 de maio de 2015 07:34
  • Tira o on error resume next que você identificará se a imagem existe ou não.


    Natan

    terça-feira, 26 de maio de 2015 10:11
  • Bom dia, Natan.

    Obrigado pela dica. Efetivamente o erro aparece e diz que o ficheiro não existe. Mas o ficheiro está lá.

    O que me baralha, é o facto de a rotina a seguir, com os mesmos moldes, funcionar perfeitamente...

    Private Sub CommandButton2_Click()

    Dim GraficoCOLUNA As Excel.ChartObject Dim GrCOLUNA As String On Error Resume Next 'Define o nome do arquivo de imagem GrCOLUNA = ThisWorkbook.Path & "\GraficoCOLUNA.JPEG" 'Carrega o gráfico salvo para o Controle Image1 do Userform Image1.Picture = LoadPicture(GrCOLUNA) End Sub

    Esta rotina apenas faz exibir imagens existentes que são geradas por outra parte da aplicação.

    Há diferença entre as duas rotinas?

    Obrigado pela chamada de atenção à instrução de supressão do erro.

    Cumprimentos


    M_A_S_L


    • Editado M_A_S_L terça-feira, 26 de maio de 2015 11:24
    terça-feira, 26 de maio de 2015 11:22
  • MASL,

    é bem difícil o programa reclamar de um caminho inexistente e ele existir... geralmente é uma letra ou um ponto a mais que faz com que achamos que exista (jpg ou jpeg).

    mas para termos certeza, use a função Dir e verifique se o arquivo realmente existe:

      strimagem = ThisWorkbook.Path & "\nomedaImagem.jpg"
      
      If Dir(strimagem) = "" Then
        MsgBox "O Arquivo " & strImagem &  " Não Existe!"
      Else
         Image1.Picture = LoadPicture(strimagem)
      End If



    Natan

    • Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 14:00
    terça-feira, 26 de maio de 2015 11:38
  • Boa tarde, Natan.

    Obrigado pela resposta e resolução do meu problema.

    Chamou à atenção do formato que pode ser "JPEG ou JPG". Pois bem, o que tenho na pasta é como mostra a imagem seguinte o formato "JPEG".

    Há demasiadas coisas que ultrapassam os meus pequeníssimos conhecimentos de VBA, e, esta é uma delas.

    Porque funciona a sua rotina com a extensão ".jpg" se a extensão é JPEG? Não reconhece o arquivo "JPEG" e reconhece "jpg"?

    Depois de substituídas as linhas de código, ficou assim:

    Private Sub CommandButton1_Click()
    
    ComboBox1.Text = ""
    ComboBox1.RowSource = Sheets("Folha2").Range("A2:A8").Address
    ComboBox1.BackColor = &HFFFF&
    ComboBox1.Visible = True
    
    ComboBox1.SetFocus
    
    Dim QUADRADO
    Dim QUAD As String
    
    'Define o nome do arquivo de imagem
    
     QUAD = ThisWorkbook.Path & "\IMAGENS\QUADRADO.jpg"
      
      If Dir(QUAD) = "" Then
        MsgBox "O Arquivo " & QUAD & " Não Existe!"
      Else
      
    'Carrega a imagem salva para o Controle Image1 do Userform
    
         Image1.Picture = LoadPicture(QUAD)
      End If
    
        'On Error Resume Next
    
    End Sub
    

    Funciona na perfeição e como se pretende.

    Obrigado Natan.


    M_A_S_L

    terça-feira, 26 de maio de 2015 13:59
  • Na verdade jpg e jpeg são basicamente os mesmos tipos de arquivo (assim como o mpg e o mpeg), mas temos que ter o cuidado de ao setarmos um determinado aquivo informar corretamente sua extensão.

    Você pode ver que, se quiser, poderá ter na mesma pasta os arquivo imagem.jpg e imagem.jpeg e o windows não reclamará de duplicidade.

    No seu caso, a extensão está como .jpg que é reconhecida pelo windows como Imagem JPEG.


    Natan

    terça-feira, 26 de maio de 2015 14:12
  • Pois e desta forma o malandro do Windows enganou-me completamente.

    É que ainda por cima, no código igual, mas numa outra aplicação, funciona bem com o JPEG.

    Agora, relativamente à outra parte da minha dúvida, posso utilizar o listindex da Combobox desta forma:

    Private Sub ComboBox1_Change() ComboBox1.Text = "" ComboBox1.RowSource = Sheets("Folha2").Range("A2:A8").Address ComboBox1.BackColor = &HFFFF& ComboBox1.Visible = True ComboBox1.SetFocus Dim QUADRADO Dim QUAD As String

    For X=0 to 6

    if Combobox1.Listindex=X Then

    'Define o nome do arquivo de imagem QUAD = ThisWorkbook.Path & "\IMAGENS" & X & ".jpg" If Dir(QUAD) = "" Then MsgBox "O Arquivo " & QUAD & " Não Existe!" Else 'Carrega a imagem salva para o Controle Image1 do Userform Image1.Picture = LoadPicture(QUAD) End If

    END IF next X End sub

    Será que a sintaxe estará correta partindo do princípio que os arquivos serão renomeados como "0,1,2,...6"?

    Cumprimentos


    M_A_S_L



    • Editado M_A_S_L terça-feira, 26 de maio de 2015 16:03
    terça-feira, 26 de maio de 2015 15:59
  • Não testei... mas posso te dizer que você terá problemas...

    Private Sub ComboBox1_Change()
    
    ComboBox1.Text = ""  'Isso aqui também ativa o evento Change
    ....
    ....
    End Sub

    Se a sua ideia é carregar a imagem em relação ao que está selecionado no combobox... basta 

    Private Sub ComboBox1_Change() strImagem = ComboBox1.Value

    'ou.

    strImagem = "NomeDaImagem" & ComboBox1.ListIndex 'Dependendo de como está o nome da sua imagem.

    'E pra garantir que somente seja acionado a regra, caso o item selecionado exista:.

    if ComboBox1.MatchFound then

    strImagem = Combobox1.Value

    end if

    .... End Sub


    não precisa recarregar o RowSource nem fazer loop dentro dos dados


    Natan





    • Editado 'Natan Silva terça-feira, 26 de maio de 2015 16:25
    • Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 22:59
    • Não Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 23:00
    • Marcado como Resposta M_A_S_L terça-feira, 26 de maio de 2015 23:00
    terça-feira, 26 de maio de 2015 16:23
  • Natan, boa noite.

    Cheguei a casa, testei o código e apurei-o um pouco. O evento já não é Change mas sim Click. Se Combobox1.text="" então o Listindex é -1, certo? De forma que não me ativa qualquer imagem e mantém o foco na Combobox1. Selecionando qualquer item que popula a Combobox1, então ele responde exibindo a imagem correta. Posteriormente exibirá Caixas de Texto e Labels que permitirão efetuar cálculos.

    O Rowsource carrega a Combobox ao clicar o botão respetivo e só é recarregada depois, se alterar o botão que aciona outra Combobox. Cada tipo de imagem terá uma pasta e os arquivos serão nomeados de "0" até "n".

    As imagens carregadas são nada mais, nada menos que formulas e para cada tipo de formula há um botão que ativa a sua combobox específica, bem como as caixas de introdução de dados.

    Está a funcionar como um relógio, mas guardei o seu último código para posteriores situações ou eventuais alterações que venha a fazer.

    Obrigado por todas as suas ajudas.

    Cumprimentos


    M_A_S_L


    • Editado M_A_S_L terça-feira, 26 de maio de 2015 22:59
    terça-feira, 26 de maio de 2015 22:53