Jump to content
milupax

[Ajuda] Vlookup em VBA

Recommended Posts

milupax

Olá pessoal,  ;)

Tenho a seguinte dúvida:

Tenho numa folha dados com a seguinte disposição:

a 1

b 2

c 3

...

noutra

a

b

c

...

necessitava de substituir nesta última os valores a, b, c, ... pelos valores correspondentes

1

2

3

...

São milhares de dados, por isso preferia em VBA (e sem ser por fórmula mas por valor).

Não atino é com a sintaxe pois penso que envolve a WorksheetFunction.VLookup  (ou Index/Match) com dynamic ranges :)

Obrigado desde já pela atenção!  ;)

Share this post


Link to post
Share on other sites
jpaulino

Se queres substituir os valores deves fazer um ciclo em todas as linhas e fazer um find/replace no destino, ou seja, vês o valor numa worksheet(origem) e substituis o texto na outra worksheet (destino)

Share this post


Link to post
Share on other sites
milupax

Obrigado jpaulino!  :)

Não tinha pensado no find/replace ...

Só acho é que é um pouco lento ...  :D

Numa tabela referência com 22180 entradas (colunas onde faz o find), substituir 6 valores demora 20 segs.! Eu precisava substituir 318907 (x3 colunas) !!!  😲

Ainda assim mais uma vez muito obrigado! :D

Share this post


Link to post
Share on other sites
jpaulino

Mostra lá como fizeste ... pode ser que existam soluções melhores e/ou mais eficazes :)

Share this post


Link to post
Share on other sites
milupax

Dim c As Range

    For Each c In Range("P1", Range("P" & Rows.Count).End(xlUp))

        Range("A1", Range("A" & Rows.Count).End(xlUp)).Replace What:=c.Value, Replacement:=c.Offset(, 1).Value, LookAt:=xlWhole

    Next c

Share this post


Link to post
Share on other sites
jpaulino

E que tal:

Dim c As Range

   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual

    For Each c In Range("P1", Range("P" & Rows.Count).End(xlUp))
        Range("A1", Range("A" & Rows.Count).End(xlUp)).Replace What:=c.Value, Replacement:=c.Offset(, 1).Value, LookAt:=xlWhole
    Next c

   Application.ScreenUpdating = True
   Application.Calculation = xlCalculationAutomatic

Pode ser o suficiente para melhorar significativamente a performance :)

Vê este artigo: Excel: Dicas de VBA - Performance

Share this post


Link to post
Share on other sites
milupax

Também é lento ...

Também me passou pela cabeça que com esse código fosse mais rápido, no passado em outras situações fez toda a diferença, mas com find/replace não há melhoria ...

Estive a experimentar apenas com uma coluna e passado uma hora ainda estava a correr...  :down:

Para demorar tanto tempo então é preferível por fórmula e arrastar até ao fundo da folha ...

Outra coisa que não percebo é porque é que em certos códigos o Excel utiliza todos os núcleos do processador (no meu caso i7 870, 8 processadores) com a CPU a 100%, e neste por exemplo, não passa os 15% ...  :)

Obrigado!  :)

Share this post


Link to post
Share on other sites
milupax

Já resolvi o problema com fórmula PROCV e arrastamento ... Por vezes acaba por ser o mais simples ... :)

Mas o código que coloquei em cima funciona bem demorando mais ou menos tempo conforme o número de linhas ...

Com a quantidade de dados que eu preciso de processar é que se torna muito lento ...

Provavelmente para isso o mais indicado seria até trabalhar com o Access mas isso já não tenho conhecimento ...  :)

Obrigado!

Share this post


Link to post
Share on other sites
jpaulino

Mas não arranjas um exemplo para testar? Pode ser com dados fictícios.

É que, por exemplo, o ciclo está errado ... parece-me. Não deve ser:

For Each c In Range("P1", Range("P" & Rows.Count).End(xlUp))

Mas sim:

For Each c In Range("P1", Range("P" & Rows.Count).End(xlUp).Row)

E o mesmo se aplica ao resto. Mas há coisas que só testando mesmo :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.