Página 1 de 1

Procurar dado na mesma Sheet com critério e preencher célula

Enviado: 06 Mar 2020 às 21:32
por xmiguelx
Olá pessoal,

Preciso de uma ajuda, pois realizo uma operação que em sheets diferente funciona, porém na mesma eu não estou conseguindo.
Basicamente é a fórmula Se e Prov, porém em comando vba.

Para facilitar, gerei uma planilha de exemplo onde deixei na coluna V e W as fórmula que estou tentando aplicar em vba na coluna R.


A nível de aprendizado, deixei dois botões, na planilha.

Referencia: onde ele preenche conforme a ficha informada na R1 e
Geral: onde ele preenche em toda coluna R seguindo os critérios.

Agradeço quem possa ajudar.

Re: Procurar dado na mesma Sheet com critério e preencher cé

Enviado: 06 Mar 2020 às 22:36
por osvaldomp
xmiguelx escreveu:Basicamente é a fórmula Se e Prov, porém em comando vba.
Você quer que o código coloque na coluna R a fórmula ou o resultado da fórmula ?

Para facilitar, gerei uma planilha de exemplo onde deixei na coluna V e W as fórmula que estou tentando aplicar em vba na coluna R.
Como você pretende colocar duas fórmulas na mesma célula ? Colunas V e W na coluna R, não entendi :?

Geral: onde ele preenche em toda coluna R seguindo os critérios.
Não há macro vinculada ao botão GERAL ;) .

Re: Procurar dado na mesma Sheet com critério e preencher cé

Enviado: 06 Mar 2020 às 23:43
por xmiguelx
Olá Osvaldo, segue abaixo retorno para suas perguntas:
osvaldomp escreveu:
xmiguelx escreveu:Basicamente é a fórmula Se e Prov, porém em comando vba.
Você quer que o código coloque na coluna R a fórmula ou o resultado da fórmula ?
@xmiguelx: Somente o Resultado.

Para facilitar, gerei uma planilha de exemplo onde deixei na coluna V e W as fórmula que estou tentando aplicar em vba na coluna R.
Como você pretende colocar duas fórmulas na mesma célula ? Colunas V e W na coluna R, não entendi :?
@xmiguelx: Somente o Resultado que será conforme o botão que for apertado.

Geral: onde ele preenche em toda coluna R seguindo os critérios.
Não há macro vinculada ao botão GERAL ;) .
@xmiguelx: Não, porque estava tentando fazer primeiro a Macro do Botão Referencia. Inclusive a Macro do botão de Referencia não está funcionando conforme eu esperava.

Re: Procurar dado na mesma Sheet com critério e preencher cé

Enviado: 07 Mar 2020 às 14:47
por osvaldomp
Olá, Miguel.
Veja se o código abaixo atende. Vincule os dois botões à macro formada por esse código.
Código: Selecionar todos
Sub InsereResultados()
 Dim LR As Long
  LR = Cells(Rows.Count, 2).End(3).Row
  If ActiveSheet.Buttons(Application.Caller).Caption = "REFERENCIA" Then
   Range("R4:R" & LR).Formula = "=IF(AND(tbl_lançtos[@[TIPO DE LANÇTO]]=""ESTORNO DE PROVISÃO"",tbl_lançtos[@[Nº DA FICHA]]=$R$1),VLOOKUP(S4,D:F,3,0),""N/AA"")"
  Else: Range("R4:R" & LR).Formula = "=IF(tbl_lançtos[@[TIPO DE LANÇTO]]=""ESTORNO DE PROVISÃO"",VLOOKUP(S4,D:F,3,0),""N/AA"")"
  End If
  Range("R4:R" & LR).Value = Range("R4:R" & LR).Value
End Sub
obs. é recomendável instalar o código acima em um módulo comum (no editor de VBA menu Inserir / Módulo) e não no módulo da planilha, onde está o código atual

Procurar dado na mesma Sheet com critério e preencher célula

Enviado: 08 Mar 2020 às 08:56
por xmiguelx
Olá Osvaldo,

Aplicando á fórmula igual você passou funcionou sim, e obrigado pela dica.

Porém a nível de aprendizado estive fazendo várias pesquisas e consegui fazer dois comandos, o de referencia que é apenas para ficha informada está funcionando rápido, porem o comando Geral onde ele repassa sobre todas as fichas está muito lento.


REFERENCIA
Código: Selecionar todos
Sub referencia()
   Dim Cont As Long
   Dim Res As Variant
   
   With Sheets("02 - DESENVOLVIMENTO")
      For Cont = 4 To .Range("B30000").End(xlUp).Row
         If .Range("R1") = .Range("B" & Cont).Value And _
            .Range("M" & Cont).Value = "ESTORNO DE PROVISÃO" Then
            Res = Application.Match(.Range("S" & Cont).Value, .Range("d1:d30000"), 0)
               If Not IsError(Res) Then
                  .Range("R" & Cont).Value = .Range("F" & Res).Value
               Else
                  .Range("R" & Cont).Value = "N/AA"
               End If
         End If
      Next Cont
   End With
End Sub

GERAL
Código: Selecionar todos
Sub GERAL()
   Dim Cont As Long
   Dim Res As Variant
   
   Application.ScreenUpdating = False
   Application.DisplayStatusBar = False
   Application.Calculation = xlCalculationManual
   
   With Sheets("02 - DESENVOLVIMENTO")
      For Cont = 4 To .Range("B30000").End(xlUp).Row
         If .Range("M" & Cont).Value = "ESTORNO DE PROVISÃO" Then
            Res = Application.Match(.Range("S" & Cont).Value, .Range("d1:d30000"), 0)
               If Not IsError(Res) Then
                  .Range("R" & Cont).Value = .Range("F" & Res).Value
               Else
                  .Range("R" & Cont).Value = "N/AA"
               End If
               Else
                        .Range("R" & Cont).Value = "N/AA"
         
         End If
      Next Cont
   End With
   
   Application.Calculation = xlCalculationAutomatic
   Application.DisplayStatusBar = True
   Application.ScreenUpdating = True
   
End Sub

Re: Procurar dado na mesma Sheet com critério e preencher cé

Enviado: 08 Mar 2020 às 12:10
por osvaldomp
Olá, Miguel.

1. tomando por base a nomenclatura utilizada pela MS para o Office, o que eu sugeri é um código escrito em linguagem VBA, não é uma fórmula
2. o seu código referencia está rodando rápido porque ele não executa tudo o que deveria. Limpe a coluna R e rode aquele código. Note que somente foi preenchido o intervalo R3077:R3085, isso porque está faltando um comando Else no If externo para inserir "N/AA". Inclua também Application.ScreenUpdating
3. para diminuir o tamanho do código você poderia juntar os dois Ifs em um apenas, utilizando o conectivo And, não sei se alteraria o tempo de execução
4. uma forma de diminuir o tempo de execução dos dois códigos é restringir o intervalo de busca da função Match ao intervalo que contém dados, pois a tabela contém dados até a linha 3093 e no entanto a função busca até a linha 30.000; para restringir você pode utilizar uma variável que represente a última linha com dados, por exemplo veja a variável LR no código que eu sugeri, e aí coloque:
For Cont = 4 To LR
e também
.Range("D4:D" & LR)