quinta-feira, 16 de maio de 2013

EXCEL VBA, CARREGAR DADOS POR NOME OU POR CÓDIGO NO MESMO OBJETO.

CARREGAR PRODUTO ATRAVÉS DA DESCRIÇÃO OU O CÓDIGO

Visitem meu novo blog:

https://programacaopassoapasso.wordpress.com/



Olá, galera dessa vez vou ensinar um código que eu uso muito em meus projetos que funciona da seguinte maneira, em um determinado banco de dados eu tenho os códigos dos produtos e a descrição. Então essa macro vai fazer o seguinte: Se você digitar o nome do produto vai aceitar numa boa e se você resolver digitar o código do produto ela vai retornar o nome que corresponde ao código, e o mais interessante é que retorna dentro do mesmo objeto que você digitou o código.... então para ilustrar isso eu criei a seguinte tabela na Plan1.



Em seguida criei um formulário simples contendo apenas um combobox e um botão de comando vejam:

A primeira coisa a se fazer é criar uma rotina de códigos para preencher o combobox1 com os dados contido na coluna B da plan1.

então vamos lá:
O código deve ser feito no evento INITIALIZE do userform assim no ato de sua abertura o combobox será carregado automaticamente.

Dentro da rotina devemos criar uma variável que servirá para fazer uma passagem em toda a tabela, e geralmente eu a chamo de linha...
na segunda linha do código em vermelho informamos qual será o valor inicial da variável,  que deve ser o numero da primeira linha que tem os dados que serão copiados para o combobox.

Private Sub UserForm_Initialize()

Dim linha As Integer
linha = 2

End Sub


Em seguida devemos criar o laço de repetição que é feito com o código Do Until.... Loop. Sendo que para esse exemplo vamos percorrer toda a plan1, na coluna A linha por linha até encontrar a primeira range(célula) vazia.... vejam:


Private Sub UserForm_Initialize()

Dim linha As Integer
linha = 2

Do Until Plan1.Range("A" & linha).Value = ""



linha = linha + 1
Loop
End Sub

Do Until..... manda o código  passar na pan1 na range(célula) da coluna A e na linha que tiver o mesmo numero da variável que na primeira passagem = 2.

linha = linha + 1 manda o código somar 1 ao valor atual da variável  isso faz com que na próxima vez que o Do Until se iniciar a linha será = 3 e assim por diante.

Loop manda o código voltar ao Do Until.... dessa forma esse código vai ficar rodando na tabela até passar por todas as linhas que não forem vazias afinal o critério para o código para é a primeira célula vazia que encontrar então sairá do laço de repetição, já deu para sacar que todas as linhas que tiverem informações tem que estar uma embaixo da outra, não podendo haver células vazias no meio de células preenchidas..

Continuando, vamos colocar o código que adiciona ao objeto combobox os valores da plan1, na range (célula) da coluna B junto com a linha "X".


Private Sub UserForm_initialize()

Dim linha As Integer
linha = 2

Do Until Plan1.Range("A" & linha).Value = ""

Me.ComboBox1.AddItem Plan1.Range("B" & linha).Value

linha = linha + 1
Loop
End Sub

Pronto a linha inserida no código manda que em cada passagem do laço, ele pegar o valor contido na célula da coluna B & numero representado pela variavel linha e em seguida adicionar ao objeto combobox1. Vamos executar o userform e vejamos o resultado.

Pois bem, agora vamos criar o código para puxar o produto pelo código do mesmo, esse código de programação será inserido no evento afterupdate do objeto combobox, ou seja assim que voce digitar o código do produto e dar um enter, ele vai puxar a descrição do produto para o corpo do objeto combobox1.
Como teremos que percorrer toda a tabela em busca do código digitado, vamos usar um laço de repetição novamente, então a primeira coisa a se fazer é criar a variavel e atribuir o valor inicial da mesma.

Private Sub ComboBox1_afterupdate()
Dim linha As Integer
linha = 2

End Sub


Em seguida vamos criar o laço de repetição que pode ser o mesmo usado no código anterior.


Private Sub ComboBox1_afterupdate()
Dim linha As Integer
linha = 2

Do Until Plan1.Range("A" & linha).Value = ""


linha = linha + 1
Loop

End Sub

Em seguida vamos colocar um bloco IF antes do laço de repetição, para verificar se o valor digitado pelo usuário é um  numero, por que se for um texto então não irá executar a busca pelo código e vai encerrar a rotina através do código Exit Sub.

Private Sub ComboBox1_afterupdate()

Dim linha As Integer
linha = 2

If IsNumeric(Me.ComboBox1.Text) = False Then
Exit Sub
Else
End If

Do Until Plan1.Range("A" & linha).Value = ""




linha = linha + 1
Loop

End Sub

Agora vamos colocar código If dentro do laço de repetição para verificar se o valor da célula (A+linha) é igual ao digitado no objeto combobox, se for vai pegar o valor ao lado no caso, coluna (B+linha) e vai colocar na propriedade Text do objeto combobox. Em seguida devemos colocar o código para encerrar a rotina que é o Exit Sub.

Private Sub ComboBox1_afterupdate()
Dim linha As Integer
linha = 2

If IsNumeric(Me.ComboBox1.Text) = False Then
Exit Sub
Else
End If

Do Until Plan1.Range("A" & linha).Value = ""

If Plan1.Range("A" & linha).Value = Me.ComboBox1.Text Then
Me.ComboBox1.Text = Plan1.Range("B" & linha).Value
Exit Sub
Else
End If

linha = linha + 1
Loop

End Sub


Agora para encerrarmos o nosso código, vamos inserir após o código Loop, um código que exibirá uma mensagem avisando ao usuário que o código não foi encontrado, afinal se ele for encontrado então o laço de repetição vai ser encerrado junto com a rotina por meio do código Exit Sub, assim sendo essa mensagem só será exibida caso o laço chegue ao fim, e se isso acontecer é por o código digitado não foi encontrado.


Private Sub ComboBox1_afterupdate()
Dim linha As Integer
linha = 2

If IsNumeric(Me.ComboBox1.Text) = False Then
Exit Sub
Else
End If

Do Until Plan1.Range("A" & linha).Value = ""

If Plan1.Range("A" & linha).Value = Me.ComboBox1.Text Then
Me.ComboBox1.Text = Plan1.Range("B" & linha).Value
Exit Sub
Else
End If

linha = linha + 1
Loop

MsgBox "CÓDIGO NÃO ENCONTRADO", vbCritical

End Sub


Agora basta executar o userform, digitar um código e dar um enter, e ver o resultado...

Nenhum comentário:

Postar um comentário