Notifications
Clear all

"Unselect" não funciona na ListBox

12 Posts
4 Usuários
0 Reactions
2,536 Visualizações
(@jokaman)
Posts: 0
New Member
Topic starter
 

Boa tarde

Mais uma vez pedindo ajuda com um código em VBA.

Tenho uma planilha que para um determinado empreendimento tenho que fazer a afetação de meios.
Para tal tenho uma UserForm "FTEForm" aonde classifico cada empreendimento e no final fruto dessa classificação tenho uma afetação de DF e FO.

A FTEform é esta:

Assim depois de escolher o empreendimento e escolher a "Tipificação" vou escolher uma "Afetações Primárias" e depois os respetivos "Fatores de Correções - Ki's", e aqui é que começa o meu problema, que passo a explicar:
1) Eu só posso escolher os Ki's depois de ter escolhido em primeiro lugar as "Afetações Primárias";
2) Quando eu escolho em primeiro lugar os Ki's aparece-me uma mensagem a dizer "É necessário definir primeiro as afetações primárias" e faço o unselect (Select(i)= False) na respetiva Listbox;
3) O problema é que ele faz o unselect mas o item na listBox continua "selecionado" ou seja continua azul; Como faço para que o item deixe de ficar azul?
4) Não sei porque razão a mensagem que refiro em cima aparece sempre duas vezes, ou seja a subrotina é chamada duas vezes. Como resolvo este problema?

Obrigado
Jorge Cabral

NOTA: Eu sei que poderia resolver este problema de outra maneira nomeadamente colocando todas as ListBox como "Enable=False" e só as ir libertando depois de preencher as anteriores, mas de momento não pretendo implementar essa solução até porque precisava de resolver este problema para outra situação que tenho.

Também aqui: http://www.tomasvasquez.com.br/forum/vi ... =20&t=5361

 
Postado : 26/04/2017 6:50 am
(@basole)
Posts: 487
Reputable Member
 

Amigo, minha sugestão seria limpar todos os dados do listbox, após chamar a rotina "Calc_Afetacoes", em seguida carregar novamente;

Tomando como exemplo o seu listbox "lstDeslocacao", segue o codigo:

Sub lstDeslocacao_Click()
     
    Call Calc_Afetacoes
     
    With lstDeslocacao 'K1 - Deslocação
        .clear
        .AddItem "D<100km"
        .AddItem "100km<D<200km"
        .AddItem "D>200km"
    End With
     
End Sub

Veja se lhe atende.

 
Postado : 26/04/2017 7:51 am
(@jokaman)
Posts: 0
New Member
Topic starter
 

Boa tarde Basole

Muito obrigado pela sua resposta.

A sua solução funciona com algumas adaptações que tive que fazer para a planilha original.

Contudo continuo sem perceber porque razão o código da Sub Unselect_lstDesloc() não funciona, sendo que acho que é um código mais "Clean" que o seu, será alguma limitação do VBA?

O seu código ao contrário do meu, funciona, mas acho que é apenas uma maneira boa de contornar o problema gostava de saber porque razão o meu código não funciona.
Vou ver se aparece mais alguma ideia, mas para já vou implementar a sua solução.

Obrigado
Jorge Cabral

 
Postado : 26/04/2017 9:33 am
(@basole)
Posts: 487
Reputable Member
 

Boa tarde Jokaman,

Sim é uma soluçao paliativa, mas resolve o seu problema, como disse.
Eu ja tive este problema e tentei varias formas de sugestoes encontradas na net, mas nenhuma resolveu.
Esta funcao unselect que voce esta usando, ate funciona, torna a seleção como falsa, mas o listbox ainda continua com o item azul (como voce mesmo disse)
Diferentemente do combobox que sao controles similares, com a propriedade .ListIndex =-1 voce consegue deixa-lo sem seleçao de item. Mas Com o ListBox nao. Ate mesmo se voce usar o SetFocus em outro controle, isso ainda continua.
Mas enfim talvez alguem tenha uma resposta para isso.

 
Postado : 26/04/2017 10:13 am
(@jokaman)
Posts: 0
New Member
Topic starter
 

Basole

Você explicou tudo direitinho, o meu problema é mesmo esse.
E como você diz vamos ver se alguém tem outra solução, porque já testei todas as que encontrei na net e nenhuma "apaga" a seleção azul.

Muito obrigado mais uma vez

Jorge Cabral

 
Postado : 26/04/2017 10:38 am
(@syrax)
Posts: 0
New Member
 

Jokaman

Veja se isso te ajuda

ListBox1.ListIndex = -1 'onde listbox1 é o nome da sua listbox

se listindex indica qual linha deve ser seleciona da listbox, se você indicar um valor que não existe, então ele não seleciona nenhum valor

 
Postado : 26/04/2017 12:02 pm
(@jokaman)
Posts: 0
New Member
Topic starter
 

Obrigado Syrax pela sua dica, mas infelizmente não funciona, o item continua selecionado a azul

 
Postado : 26/04/2017 3:31 pm
(@syrax)
Posts: 0
New Member
 

Jokaman

Fiz o teste aqui e funcionou, ele tirou a seleção em azul do item selecionado

 
Postado : 26/04/2017 6:26 pm
(@jokaman)
Posts: 0
New Member
Topic starter
 

Syrax, dá para implementar essa sua solução na planilha que disponibilizei e colocar aqui?

Eu tentei mas não consegui, mas percebo muito, muito, muito, ...., pouco de VBA.

Obrigado
Jorge Cabral

 
Postado : 27/04/2017 7:53 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Jokaman, a dica do Basole é boa e a instrução que o Syrax passou funciona, só que tem um porem, você tem vários Llistbox dispostos dentro de Frames e com isto cada controle é independente, ou seja após a msg para selecionar um valor no outro Listbox você não está saindo dele, para funcionar o SetFocus tem de referenciar os controles por completo Form.Frame.Listbox.

Mas uma sugestão, que costumo utilizar para evitar desconfortos tipo este é deixando os Listbox com a Propriedade - Enabled=False, e nos Eventos Click definir o Enabled para True, desta forma não tem como selecionar o próximo listbox, que só será habilitado após a seleção do anterior.

Por exemplo, faça o teste trocando a rotina do Listbox "lstAFTPDF" pela a abaixo e vá em propriedades do "lstDeslocacao" e altere Enabled para False, veja que só acrescentei a instrução para habilitar a seleção do lstDeslocacao :

Sub lstAFTPDF_Click()
    Call Calc_Afetacoes
    lstDeslocacao.Enabled = True
End Sub

[]s

 
Postado : 27/04/2017 7:10 pm
(@jokaman)
Posts: 0
New Member
Topic starter
 

Boa tarde Mauro

Tentei a sua primeira sugestão e não funcionou, posso estar a fazer algo de errado, dá para implementar diretamente na planilha que disponibilizei e colocar aqui.

Sub Unselect_lstDesloc()
       For i = 0 To FTEform.MultiPage1.Page2.Frame1.Frame3.lstDeslocacao.ListCount - 1
            FTEform.MultiPage1.Page2.Frame1.Frame3.lstDeslocacao.Selected(i) = False
        Next i
End Sub

A segunda sugestão é como falei, não queria implementar, gostaria de resolver este problema primeiro.

Obrigado
Jorge Cabral

 
Postado : 28/04/2017 11:11 am
(@jokaman)
Posts: 0
New Member
Topic starter
 

Alguma sugestão?

Jorge Cabral

 
Postado : 10/05/2017 7:38 am