Usuário com melhor resposta
Carregar imagem num objeto Image.

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
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
-
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
Todas as Respostas
-
-
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
-
-
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
-
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
-
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
-
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
-
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
-
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
-
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