Notifications
Clear all

PROCV - INDICE - CORRESP - SUBSTITUIR POR VBA

17 Posts
6 Usuários
0 Reactions
3,372 Visualizações
(@denilsonsl)
Posts: 84
Trusted Member
Topic starter
 

Bom dia Galera.

Eu tenho uma planilha gigante que utilizo muito o procv, indice e corresp.

Mas, como posso substituir o procv, indice e correps via VBA?

Exemplo:

Na célula A1 planilha industrialização digito um numero de Ordem de produção, na celula A2 busca o nome, A3 descrição produto, A4 medida - essas informações com procv ou indice e corresp, as informações todas vem da aba dados clientes.

Mas como posso substituir essas formulas por VBA, somente digitando o numero da Ordem de Produção na planilha industrialização? ao mesmo tempo sendo automático o processo de execução da macro.

Todos os tópicos que vi na net não mostra algo fácil para entendimento, não posso estar disponibilizando a planilha no tópico por questões internas da empresa.

 
Postado : 24/12/2015 6:54 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Diria que é possível utilizando o método Find ou application.match; contudo pela sua descrição, entendo que sua afinidade com macros/códigos/rotinas e muito pouca.
Assim sem ter o layout de sua planilha; creio que não irá evoluir este tópico. Poste sua planilha, acredito que as "questões da empresa" referem-se a sigilosidade de informações não quanto a estrutura da planilha. Não há necessidade de sua planilha real, mas uma que seja representativa da estrutura de dados/posicionamento de campos etc..
Utilize dados fictícios, assim não afetará a sigilosidade dos dados

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/12/2015 7:52 am
(@mprudencio)
Posts: 2749
Famed Member
 

Qto a planilha nao precisamos dos dados so do formato.

Os dados podem ser diferentes dos reais.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 24/12/2015 10:03 am
(@denilsonsl)
Posts: 84
Trusted Member
Topic starter
 

Perfeito MPrudencio,

Peço desculpas por não anexar algum modelo, obviamente que não há forma de explicar sem ter algum modelo, concordo.

Mas vamos lá, em anexo segue um modelo mais antigo que tenho com menas informações, mas é próximo ao que uso.

Na realidade, a original tem mais de 3,000 linhas na aba pedidos e mais de 2500 na aba industrialização, o que busco na realidade, uma forma de código que fique mais profi possível, ou seja, que não fique a mostra as formulas, somente digitado o numero Ordem de produção e o restante da busca o código execute o restante da busca, e na nova linha abaixo da que foi preenchida, possa estar digitando e a busca seja executada.

Algumas informações são digitadas a mão, outras com busca em outra aba.

 
Postado : 24/12/2015 2:05 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Vc disse no primerio post que que os dados vem da aba clientes no seu exemplo nao tem essa aba.

Qdo ao vba vc pode usar o procv diretamente no VBA .. pesquise sobre woksheet.funcition e vkloop.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 24/12/2015 2:18 pm
(@denilsonsl)
Posts: 84
Trusted Member
Topic starter
 

Ok MPrudencio ,

Como você mesmo disse para eu mesmo buscar sobre woksheet.funcition e vkloop, perfeito.

Mas se recorri ao fórum é para tirar duvidas sobre o tema em questão com alguém que tenha mais habilidade sobre o que me gerou duvida, e não buscar por conta própria.

Mas fico grato pela resposta.

 
Postado : 25/12/2015 5:44 pm
(@denilsonsl)
Posts: 84
Trusted Member
Topic starter
 

Galera,

Pesquisando e tentando montar o código que faz a busca substituindo o procv pelo vlookup, montei esse código, mas simplesmente não esta dando certo:

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

Dim UltimaCelula As Range
Dim Range As Worksheet

Set Range = Sheets("Industrialização")

ultimalinha = Plan1.Cells(Rows.Count, "a").End(xlUp).Row

If Plan1.Cells(Rows.Count, "a").End(xlUp).Row > 0 Then 'digitar o numero da Ordem de produção na coluna A

Range("f" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 11, False)
Range("g" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 13, False)
Range("c" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 6, False)
Range("h" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 5, False)
Range("i" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 4, False)
Range("j" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 16, False)
Range("o" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 17, False)

End If

Application.ScreenUpdating = True

End Sub

Alguém consegue me dar uma luz sobre esse código, preciso que ele seja totalmente automático, ao momento que for digitado o numero da Ordem de produção na coluna A, da planilha que segue em anexo, preciso que faça a busca dos dados descritos em outra planilha.

 
Postado : 25/12/2015 7:37 pm
(@edcronos2)
Posts: 346
Reputable Member
 

Ok MPrudencio ,

Como você mesmo disse para eu mesmo buscar sobre woksheet.funcition e vkloop, perfeito.

Mas se recorri ao fórum é para tirar duvidas sobre o tema em questão com alguém que tenha mais habilidade sobre o que me gerou duvida, e não buscar por conta própria.

Mas fico grato pela resposta.

Olha,
eu vou defender o cara pq tenho visto ele responder duvidas que eu não tenho capacidade e muito menos paciência para responder
a unica coisa que ele quis dizer com buscar é pq vc não pode disponibilizar o seu arquivo
se o arquivo que vc postou não tem as coisas que vc indicou , não tem como ficar adivinhado oq é oq e oq substitui oq

e alem do mais
um forum não é para fazer o seu trabalho pelo qual vc recebe um salario, e sim para ajudar e tirar duvidas e nem sempre vai ser de maneira acertada ou direta
sobre woksheet.funcition e vkloop poderia ser sim uma resposta e uma ajuda para vc que não pode disponibilizar o arquivo real ir pesquisando e aprendendo

 
Postado : 25/12/2015 10:48 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Denilson, sou obrigado a concordar com a colocação do Ed, a função dos Foruns, como você mesmo especificou, é para "tirar duvidas", e isto quer dizer que alguem tem alguma duvida em relação a alguma rotina que criou ou está adaptando e esta dando erro, e a intensão é sempre procurar mostrar um caminho por onde começar, e sempre a primeira opção é orientar que se pesquise no forum, pois geralmente existem duvidas semelhantes ou que chegam bem próximo ao solicitado, e nem sempre da para enviar uma solução devido a falta de detalhes, e a segunda opção, se enviar um modelo com a rotina que estiver utilizando procurar ajusta-la e por último criar do "zero", as vezes fazemos isto por uma duvida simples, mas como as ajudas são voluntárias, e depende de tempo disponivel, nem sempre é possível, e lembre-se que estamos em festividades, então deveria ter agradecido por ter tido respostas.
Antecipo minhas desculpas se fui grosseiro, não é esta a intensão, mas fico chateado, qdo cobram ou reclamam por ajudas voluntárias.

Voltando a sua questão, e uma vez que colocou um modelo com a rotina que não está funcionando corretamente, troque pela a abaixo e faça os testes se é isto mesmo :
Analise, e veja que deixei uma linha comentada, só para ficar mais fácil o entendimento da instrução :
'Range("c" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 6, False)

'Range("c") é representado pelo 3, que é a coluna a ser inserida o retorno e o "6" no final é a coluna que estamos pesquisando
Cells(lin, 3) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 6, 0)

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.ScreenUpdating = False

    Dim Range As Worksheet

    ultimalinha = Plan1.Cells(Rows.Count, "a").End(xlUp).Row
    
    item = Target.Value 'Valor Digitado
    lin = Target.Row 'LINHA DIGITADA
    
    If Plan1.Cells(Rows.Count, "a").End(xlUp).Row > 0 Then    'digitar o numero da Ordem de produção na coluna A

        Application.EnableEvents = False 'desabilita temporariamente o evento até retornar para "TRUE"

        'Range("c" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, Plan2.Range("A1:AS650000"), 6, False)
        Cells(lin, 3) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 6, 0)
        Cells(lin, 6) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 11, 0)
        Cells(lin, 7) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 13, 0)
        Cells(lin, 8) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 5, 0)
        Cells(lin, 9) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 4, 0)
        Cells(lin, 10) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 16, 0)
        Cells(lin, 15) = Application.VLookup(item, Sheets("PEDIDOS").Range("A2:" & "AM" & ultimalinha), 17, 0)

    End If
    
    Application.EnableEvents = True

    Application.ScreenUpdating = True

End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 25/12/2015 11:21 pm
(@fazerbem)
Posts: 697
Honorable Member
 

Concordo plenamente também , pois aqui no forum foram tiradas todas as minhas duvidas, e em muitas das vezes tive que lancar uma planilha modelo com o conteudo daquilo que pedia. É certo que em muitas das vezes eu mesmo resolvi meus problemas, porem usando rotinas ja feitas em outras duvidas e usando um pouco de logica e conhecimentos por parte de muitas dicas que peguei aqui. Entendi que sem a planilha com a aba especifica não tinha como ajudar. Mas de certo aqui é o lugar certo para resolver esta e outras duvidas, porem tera mesmo que das informacoes.

 
Postado : 26/12/2015 3:56 am
(@denilsonsl)
Posts: 84
Trusted Member
Topic starter
 

Bom dia mestres.

Peço desculpas pelo o ocorrido até agora, de fato vi algumas falhas na comunicação para resolver a dificuldade apresentada.

De forma peço desculpas por isso, e sim agradeço o fato de ter resposta em época de festividades, e que não haja nova evidencia de má colocação das dificuldades e interpretação também.

Desde já agradeço a ajuda de todos.

 
Postado : 26/12/2015 8:40 am
(@coiote_25)
Posts: 42
Trusted Member
 

Boa tarde amigo,

segue em anexo um exemplo do que pretende. Só tem que adaptar à sua folha de cálculo. Caso não o consiga fazer, diga que nós desenrascamos...

Boas festas e continuemos neste espirito de entreajuda criando sinergias em diferentes problemas com diferentes soluções...

Cumprimentos,

Noel

 
Postado : 26/12/2015 9:58 am
(@denilsonsl)
Posts: 84
Trusted Member
Topic starter
 

Levando em consideração a todas s dicas até o momento, consegui chegar a um codigo final, mas porem :lol: :lol: :lol: esta havendo algumas divergências.

Segue o codigo:

Private Sub procv()

Application.ScreenUpdating = False

Dim ultimalinha As Range
Dim ind As Worksheet
Dim plan2 As Worksheet

Set ind = Sheets("INDUSTRIALIZACAO")
Set plan2 = Sheets("PEDIDOS")

Set ultimalinha = ind.Range("d650000").End(xlUp)

If Plan1.cells(Rows.Count, "a").End(xlUp).Row > 0 Then 'digitar o numero da Ordem de produção na coluna A

Range("c" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 6, False)
Range("f" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 11, False)
Range("g" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 13, False)
Range("h" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 5, False)
Range("i" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 4, False)
Range("j" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 16, False)
Range("o" & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Plan1.Range("A" & ActiveCell.Row).Value, plan2.Range("A1:AS650000"), 17, False)

ActiveCell.Offset(1, 0).Select

End If

Application.ScreenUpdating = True

End Sub

-----Umas das divergências é que quando coloco vba dentro dessa instrução Private Sub Worksheet_Change(ByVal Target As Range) a planilha trava.

Gostaria que quando fosse digitado a Ordem de Produção, fosse automático, mas no meu PC esta travando legal a planilha, estava analisando, não sei onde estou errando nesse codigo....

 
Postado : 26/12/2015 3:41 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se a intensão é utilizar o evento Worksheet_Change, a rotina que passei funcionou conforme solicitou, mas se está pretendendo utilizar a rotina que acabou de postar, com certeza o que está acontecendo é porque o evento change é disparado automaticamente cada vez que se altera alguma celula, e como na rotina temos 7 alterações de celula ele ira disparar em cada uma e sempre do inicio, tipo vamos ter um loop infinito, e para evitar isto deve-se utilizar a propriedade : Application.EnableEvents = False e no final torná-la True, como eu fiz na rotina que indiquei.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 26/12/2015 5:14 pm
(@coiote_25)
Posts: 42
Trusted Member
 

Boa noite,

Só alterei a rotina que coloquei como exemplo da folha de cálculo PROCV, postada e adaptei-a para as 38 colunas a devolver o "valor" encontrado. Está a funcionar direitinho...!

Experimente e depois diga qualquer coisa.

Cumps,

Noel

 
Postado : 26/12/2015 8:29 pm
Página 1 / 2