Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Procura Combobox

Esclarecimentos e dúvidas sob o Modelo de Aplicativo de Cadastro em VBA no Microsoft Excel publicado no site e blog http://www.tomasvasquez.com.br
NERI INACIO
Colaborador
Colaborador
Mensagens: 62
Registrado em: Sáb Fev 27, 2016 7:31 pm

Procura Combobox

Mensagem por NERI INACIO »

Tenho uma Combobox que está vinculado a planilha "Compras" - Esta combo traz o código do fornecedor. Porém na hora de carregar a combo, este código deve ser substituído pelo nomeque está na planilha "Fornecedores".

Acontece que ele mostra o codigo do fornecedor que está na planilha Compras. Porém preciso que na combobox mostre o nome, ou seja, busca o código na planilha Compras, relaciona com a planilha Fornecedores e me mostra o nome certo.

Coloquei um exemplo em anexo... No paint um desenho da necessidade e no outro o arquivo para ver o código.

Agradeço a ajuda.
Anexos
Paint.rar
(141.05 KiB) Baixado 289 vezes
Controle Obras Postar.rar
(100.42 KiB) Baixado 302 vezes


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


NERI INACIO
Colaborador
Colaborador
Mensagens: 62
Registrado em: Sáb Fev 27, 2016 7:31 pm

Re: Procura Combobox

Mensagem por NERI INACIO »

Estou com o código quase pronto, mas falta ajustar um detalhe... vamos ver se alguem consegue me ajudar.
Acrescentei as linhas destacadas, fazendo referencia a planilha "Fornecedores".

Sub Preenchercbofornecedores()
Dim n As Long, texto As Variant
Dim i As Integer
Me.cboFornecedores.Clear

For n = 1 To ListView1.ListItems.Count
If Me.ListView1.ListItems(n).ListSubItems(2) = "" Then Exit For
If InStr(texto, Me.ListView1.ListItems(n).ListSubItems(2)) = 0 Then
texto = texto & "|" & Me.ListView1.ListItems(n).ListSubItems(2) '& "|"
wsfornecedores = Me.ListView1.ListItems(n).ListSubItems(2)
Set wsfornecedores = ThisWorkbook.Worksheets("fornecedores") ' aqui
With wsfornecedores.Range("a1:a65000") 'aqui
Set c = .Find(wsCadastro.Cells(indiceRegistro, colfornecedor).Value, LookIn:=xlValues) ' aqui
If Not c Is Nothing Then 'aqui
DesFornecedores = wsfornecedores.Cells(c.Row, 2).Value 'aqui
End If 'aqui
End With 'aqui

Me.cboFornecedores.Text = DesFornecedores
End If
Next
texto = Split(texto, "|")

For i = 1 To UBound(texto)
cboFornecedores.AddItem texto(i)
Next
Call Ordenarcbofornecedores

End Sub


NERI INACIO
Colaborador
Colaborador
Mensagens: 62
Registrado em: Sáb Fev 27, 2016 7:31 pm

Re: Procura Combobox

Mensagem por NERI INACIO »

Pessoal, ninguém tem uma sugestão? O que preciso é simples e acredito que outros utilizam também: Ao invés de salvar o nome do fornecedor preciso salvar o código correspondente, e na hora de fazer a pesquisa para alterar, precisa mostrar o nome do mesmo na combo e na listview.

Porque isto? Porque se salvar o nome do Fornecedor, ele pode ser alterado no cadastro do mesmo, e nos outros lugares não será alterado.
Ou existe outra forma?


Avatar do usuário
Mikel Silveira Fraga
Jedi
Jedi
Mensagens: 1173
Registrado em: Sex Mai 27, 2011 3:27 pm
Localização: Governador Valadares - MG
Contato:

Re: Procura Combobox

Mensagem por Mikel Silveira Fraga »

Neri, bom dia.

Cara, estou vendo sua planilha e fiz alguns ajuste, para manter o nome do fornecedor na ComboBox. Vou explicar por etapas:

1ª ETAPA - FORMATAR A COMBOBOX
======================================================================

Código: Selecionar todos

        With Me.cboFornecedores
            .Clear
            .ColumnCount = 2	'Formata o ComboBox em 2 colunas.
            .BoundColumn = 1	'Quando utilizar a propriedade Value do ComboBox, vai buscar a informação da coluna 1.
            .ColumnWidths = 0	'Define a largura da primeira coluna como 0, ocultando-a.
        End With
Na rotina Preenchercbofornecedores, logo após a declaração da variáveis, adicione o código acima, para formatar a ComboBox com os Fornecedores
======================================================================

2ª ETAPA - BUSCAR NOME FORNECEDOR VIA CÓDIGO
======================================================================

Código: Selecionar todos

Public Function retRazaoSocial(ByVal strPlan As String, _
                                ByVal intCod As Integer) As String
                    
    Dim objWsh As Object
    Set objWsh = Worksheets(strPlan)
    
    With Application.WorksheetFunction
        retRazaoSocial = .VLookup(intCod, objWsh.Range("A:G"), 2, False)
    End With
    
End Function
Em um Módulo do Excel, adicione o código acima. Esse código recebe como parâmetro o nome da planilha a ser procurara (neste caso Fornecedor) e o código do fornecedor a ser procurado. Essa função vai na planilha informada e, com base nos códigos estarem na coluna A e o nome na coluna B, ele realiza um Procv (VLookUp em inglês), para retornar o nome do fornecedor com base no código informado.
======================================================================

3ª ETAPA - PREENCHER AS COLUNAS DA COMBOBOX
======================================================================

Voltando para a rotina Preenchercbofornecedores, na parte do preenchimento do ComboBox, substitua o código "cboFornecedor.Additem texto(i)", pelo código abaixo:

Código: Selecionar todos

        For i = 1 To UBound(texto)
            With Me.cboFornecedores
                .AddItem texto(i)
                .List(i - 1, 1) = retRazaoSocial("Fornecedores", texto(i))
            End With
        Next
Com o método AddItem, ele preenche a primeira coluna do ComboBox. Com o método List(i-1,1), vai ser preenchida a segunda coluna do ComboBox, mas o valor preenchido será o retorno da função retRazaoSocial, a partir dos parâmetros informados na busca (aba Fornecedor e código do fornecedor).
======================================================================

Faça as alterações e veja se vai funcionar.

Dúvidas, estamos a disposição. Forte abraço e excelente final de semana.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


NERI INACIO
Colaborador
Colaborador
Mensagens: 62
Registrado em: Sáb Fev 27, 2016 7:31 pm

Re: Procura Combobox

Mensagem por NERI INACIO »

Meu amigo
Como é bom ajudar os outros, mas como é bom receber ajuda....

Olha só....vou abusar mais um pouco da sua bondade:
O que vc sugeriu está ótimo, muito show.

Coloquei em anexo o arquivo novamente. Olha só: quando carrego os dados ele substitui no listview os códigos pelos nomes, certinho.
Quando aciono o filtro, ele volta a mostrar no listview o código do fornecedor. Pq ele não fica com a descrição? Sei que ele lê o código do filtro.
Qual comando teria que colocar para que permanecesse no listview a descrição (depois de filtrada)?

Olha o anexo. Acredito que seja a dúvida de outros usuários.

Abraço e ótimo final de semana.
Anexos
Controle Obras Postar.rar
(104.93 KiB) Baixado 302 vezes


Avatar do usuário
Mikel Silveira Fraga
Jedi
Jedi
Mensagens: 1173
Registrado em: Sex Mai 27, 2011 3:27 pm
Localização: Governador Valadares - MG
Contato:

Re: Procura Combobox

Mensagem por Mikel Silveira Fraga »

Neri, bom dia.

Cara, o problema é o mesmo da grande maioria dos desenvolvedores que estão iniciando na área de programação, inclusive também passei por isso no início. Esse problema é a geração de rotinas duplicadas, ou melhor, várias rotinas que fazem a mesma coisa dentro do mesmo código.

Vamos lá, você esta utilizando praticamente duas rotinas diferentes para preencher o ListView. Uma esta inserida dentro da rotina PreencherCabeçalhoLinhas, e a outra é a qte2, que é chamada no botão Filtrar.

O que você precisa aprender é organizar suas rotinas, da melhor forma possível, para conseguir economizar tempo na manutenção de seus códigos. Esses são os princípios de se trabalhar com o conceito de OOP (Programação Orientada a Objetos). Veja abaixo:

- Você precisa preencher o cabeçalho e preencher as linhas do ListView. Então, crie uma rotina que irá somente preencher o Cabeçalho. Depois, crie uma rotina separada, que irá somente preencher as Linhas, já considerando também a situação da existência de filtros ou não. Dessa forma, sempre que você for preencher o ListView, será chamada esta rotina que já irá considerar a existência ou não do filtro.

- Outro ponto, é o preenchimento do ComboBox. Esta sendo utilizado com base para preencher o ComboBox, os fornecedores exibidos no ListView. Esse seria um método que não recomendo. Acho que seria mais interessante que o preenchimento do ComboBox, fosse realizado das informações existentes na aba Fornecedores. Caso você queria preencher apenas com os fornecedores que possuem OC, sugiro criar um teste para verificar se esse fornecedor possui alguma OC relacionada. Para isso, você pode pegar o código do fornecedor e fazer um CountIf (Cont.Se) para realizar essa operação.

Seguindo essa linha de raciocínio, vou deixar o link de uma rotina que adaptei e postei aqui no fórum no ano passado. Neste modelo, é preenchido um ListBox, mas a lógica de estruturação e a consideração do filtro, são as mesmas que devem ser utilizadas no ListView.
- Modelo Cadastro v1 (sem SQL)

Com essas sugestões acima, você estará seguindo um caminho muito mais organizado e aprenderá a estruturar seus códigos da melhor forma possível.

Estou a disposição para qualquer dúvida.


NERI INACIO
Colaborador
Colaborador
Mensagens: 62
Registrado em: Sáb Fev 27, 2016 7:31 pm

Re: Procura Combobox

Mensagem por NERI INACIO »

Meu amigo Mikel
Poxa o tempo passou voando. Dei uma olhada nos arquivo SQL e acho que é o caminho mais fácil. Alterei os meus arquivos.
Obrigado pela sugestão e opinião.
Abraço e ótima semana.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder