Notifications
Clear all

VBA - Selecionar, Colar, Copiar e Colar...

9 Posts
2 Usuários
0 Reactions
4,874 Visualizações
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

Olá pessoal!

Mais uma ajudinha aqui, estou a um tempão em uma busca aqui, mas pela falta de conhecimento estou agarrado!

Tenho duas fórmulas de Procv em uma linha que trazem dados de outra planilha, porem a planilha da fonte de dados é muito grande, mais de 15k de linhas e isso deixa a planilha principal muito lenta.

Em uma linha não fica lento, mas quando copio a fórmula para os 2k de linhas abaixo ai o bixo pega.

Não vou usar todas as linhas de uma vez!

Para não deixar o Procv solto nos 2k de linhas queria fazer duas macros no VBA que devem seguir assim:

Obs.: Sempre serão 2 colunas, por exemplo A e B, cada uma com sua fórmula de procv.

1º - Seleciono com o mouse o intervalo que pretendo colar a fórmula de procv que estará inserida no VBA;
2º - Aciono um botão com a macro do procv, ai o VBA irá colar as duas fórmulas procv no intervalo selecionado;
3º - Com os procv's inseridos a planilha buscará os dados.
4º - Após atualização dos dados, com a planilha ainda selecionada aciono o botão da segunda macro, que agora copia todo o range e cola com o formato número, "matando" as fórmulas ProcV.

Isso tirará o peso da planilha.

Já viz várias experiencias aqui no VBA e simplesmente não to conseguindo nada... :oops:

Alguem poderia dar uma luz?

Tentei ser claro, caso seja necessário tentarei montar um exemplo, ou até cópia da planilha original.

Obrigado.

 
Postado : 16/04/2012 6:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

se sua intenção é usar VBA, ao menos poste no fórum correspondente. vou move-lo

Aproposito, use a pesquisa fórum e se não resolver poste um arquivo modelo COMPACTADO!!

 
Postado : 16/04/2012 6:58 pm
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

Por enquanto consegui inserir um código que seleciona o campo, aciono o botão e ele pergunda qual intervalo, mas ainda estou em busca de como colar uma função e substituir o campo.

Segue abaixo o código já encontrado:

Sub Data_Pagamento_FX()
    Dim Selecao As Range
    Set Selecao = Application.InputBox(prompt:="Selecione o intervalo de células que deseja colar a função", Type:=8)
    Selecao.Select
End Sub

Sub Data_Pagamento_123()
    Dim Selecao2 As Range
    Set Selecao2 = Application.InputBox(prompt:="Selecione o intervalo de células que deseja substituir a função", Type:=8)
    Selecao2.Select
End Sub

Sub Valor_Recebido_FX()
    Dim Selecao3 As Range
    Set Selecao3 = Application.InputBox(prompt:="Selecione o intervalo de células que deseja colar a função", Type:=8)
    Selecao3.Select
End Sub

Sub Valor_Recebido_123()
    Dim Selecao4 As Range
    Set Selecao4 = Application.InputBox(prompt:="Selecione o intervalo de células que deseja substituir a função", Type:=8)
    Selecao4.Select
End Sub

O Procv para Data_Pagamento_FX seria =SE(AC5="";"";SEERRO((PROCV($D5;'S:TesourariaDAES_PAGOSDAES_PAGOS_FJP.xls'!Chave_DAE_PAGO;13;0));""))
O Procv para Valor_recebido_FX seria =SE(AC5="";"";SEERRO((PROCV($D5;'S:TesourariaDAES_PAGOSDAES_PAGOS_FJP.xls'!Chave_DAE_PAGO;17;0));""))

Para Data_Pagamento_123 e Valor_Recebido_123 eu pensei em acrescentar algo assim:

Sub Data_Pagamento_123()
    Dim Selecao2 As Range
    Set Selecao2 = Application.InputBox(prompt:="Selecione o intervalo de células que deseja substituir a função", Type:=8)
    Selecao2.Select
    Range("Selecao2").Copy
    ActiveSheet.UsedRange.PasteSpecial Paste:=xlPasteValues

Este código copia, porem na hora de colar ele está colando em A1.

A pesquisa continua!

 
Postado : 17/04/2012 8:19 am
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

Olá mais uma vez!

Para Data_Pagamento_FX se eu coloco esse código:

Sub Data_Pagamento_FX()
    Dim Selecao As Range
    Set Selecao = Application.InputBox(prompt:="Selecione o intervalo de células que deseja colar a função", Type:=8)
    Selecao.Select
    Selecao.Formula = "=1+1"
End Sub

A macro preenche a célula selecionada com =1+1 trazendo o resultado 2.

Porem, quando coloco esse código:

Sub Data_Pagamento_FX()
    Dim Selecao As Range
    Set Selecao = Application.InputBox(prompt:="Selecione o intervalo de células que deseja colar a função", Type:=8)
    Selecao.Select
    Selecao.Formula = "=SE(AC5="";"";SEERRO((PROCV($D5;'S:TesourariaDAES_PAGOSDAES_PAGOS_FJP.xls'!Chave_DAE_PAGO;13;0));""))"
End Sub

Da erro...

Ja tentei Selecao.text, Selecao.value etc...

Onde está o erro?

 
Postado : 17/04/2012 8:59 am
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

Consegui avançar mais!!!

Segue o código que cola a fórmula, porem ele cola somente na primeira linha da seleção.

Sub Data_Pagamento_FX()
    Dim Selecao As Range
    Set Selecao = Application.InputBox(prompt:="Selecione o intervalo de células que deseja colar a função", Type:=8)
    Selecao.Select
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-4]="""","""",IFERROR((VLOOKUP(RC4,'S:TesourariaDAES_PAGOSDAES_PAGOS_FJP.xls'!Chave_DAE_PAGO,13,0)),""""))"
End Sub

Agora preciso descobrir como colar em todas as linhas da seleção.

 
Postado : 17/04/2012 9:19 am
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

Resolvido o primeiro problema:

Sub Data_Pagamento_FX()
    Dim Selecao As Range
    Set Selecao = Application.InputBox(prompt:="Selecione o intervalo de células que deseja colar a função", Type:=8)
    Selecao.Select
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-4]="""","""",IFERROR((VLOOKUP(RC4,'S:TesourariaDAES_PAGOSDAES_PAGOS_FJP.xls'!Chave_DAE_PAGO,13,0)),""""))"
    Selecao.Select
    Selection.FillDown
End Sub

Com esse código, após clicar no botão e selecionar o intervalo a macro coloca o PROCV em todas as linhas do intervalo.

Agora preciso resolver a outra macro, de copiar a seleção e colar por cima para matar o procv. Até o momento está assim:

Sub Data_Pagamento_123()
    Dim Selecao2 As Range
    Set Selecao2 = Application.InputBox(prompt:="Selecione o intervalo de células que deseja substituir a função", Type:=8)
    Selecao2.Select
    Range("Selecao2").Copy
    ActiveSheet.UsedRange.PasteSpecial Paste:=xlPasteValues
End sub

Porem ela cola na A1 e não na seleção.

Tem como eu encaixar nos dois códigos um critério para colar somente se a célula estiver vazia?

 
Postado : 17/04/2012 10:50 am
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

Xeque-Mate!

Problema resolvido, agora copia e substitui a fórmula:

Sub Data_Pagamento_123()
    Dim Selecao2 As Range
    Set Selecao2 = Application.InputBox(prompt:="Selecione o intervalo de células que deseja substituir a função", Type:=8)
    Selecao2.Select
    Selecao2.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

Agora preciso apenas acrescentar um critério de célula vazia, somente executar a macro nas células vazias.

Devolta às pesquisas!

 
Postado : 17/04/2012 11:32 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

DanyahoO
primeiro parabens pela dedicação e pesquisa, :D
Pergunta:
Se está "matando" as formulas e deixando apenas os valores, não entendi :?

Agora preciso apenas acrescentar um critério de célula vazia, somente executar a macro nas células vazias.

Qual o objetivo de celulas Vazias :?:

 
Postado : 18/04/2012 7:27 am
(@danyahoo)
Posts: 49
Trusted Member
Topic starter
 

DanyahoO
primeiro parabens pela dedicação e pesquisa, :D
Pergunta:
Se está "matando" as formulas e deixando apenas os valores, não entendi :?

Agora preciso apenas acrescentar um critério de célula vazia, somente executar a macro nas células vazias.

Qual o objetivo de celulas Vazias :?:

Obrigado reinaldo!

Vamos lá! Vou tentar explicar qual a finalidade de tanta pesquisa.

Esta planilha uma planilha de controle de mensalidades, o responsável que cuida deste setor aqui da empresa não é bom de excel e faz tudo na mão e olhe lá, quando fui verificar a última vez que ele "atualizou" a planilha de controle dele foi em junho/11 :shock: .

Ai estou desenvolvendo uma planilha de controle que da baixa automática na parcela de cada aluno quando ele paga.

Para isso temos uma planilha com todos os DAEs pagos de 2006 para cá, atualizada constantemente, porem temos o 1º problema, não existe um campo no DAE que informa a parcela paga, somente no histórico, ai tive que fazer uma fórmula dentro de uma chave para buscar qual parcela está sendo paga dentro do histórico do DAE.

Esta planilha de DAEs pagos esta em rede, tem 15k de linhas e 12 mb de tamanho.

O segundo problema que encontrei é a lentidão quando colocava um PROCV na planilha de mensalidades para buscar se o DAE foi pago na Plan de DAES. O procv em uma única linha já demorava a atualizar, agora imagina em 1800 linhas. Já verifiquei que isso não é das planilhas e sim da rede e não tem solução imediata. Assim a forma que encontrei para contornar o problema é colocar o ProcV no VBA e somente inserir quando necessário, e quando buscar a informação, tirar o procv e manter somente a informação necessária.

Para exemplificar, vamos supor que a parcela 10 venceu dia 15/04/2012. Selecionaremos a parcela 10 no auto filtro. O campo de Data Pagamento e Valor Pago estará em branco. Usaremos os botões de procv, a planilha informará todas as parcelas pagas, porem poderá haver alunos que não pagaram, ai o campo ficará em branco. Depois eu "mato" a fórmula para manter somente os dados sem pesar a planilha.

O critério para colocar o PROCV somente em células em branco seria para isso, caso já colocasse as informações nas celulas não seria necessário o uso do procv nas mesmas.

Uma forma de fazer isso seria selecionar a parcela 10 no auto filtro e depois selecionar as celulas em branco também no auto filtro, ai sim usar o procv. Mas será que existe alguma forma de fazer isso direto na macro do VBA?

 
Postado : 18/04/2012 7:57 am