Notifications
Clear all

Macro para formula matricial={MAIOR(($B$2:$B$40000=B20940)}

17 Posts
3 Usuários
0 Reactions
2,199 Visualizações
(@tutoelizeu)
Posts: 160
Estimable Member
Topic starter
 

Bom dia meu amigos!

Estou trabalhando num Projeto de vendas e gostaria de pedir uma grande ajuda de vocês.
Se por gentileza vocês puderem me ajudar, com certeza vou fazer o possível para retribuir com o pouco que sei.
Eu tenho uma planilha que mostra na aba "Colar_ZSDQ" as minhas vendas (Nessa aba vou exportar do SAP novos dados diariamente) e na aba "BD_Dt_Fatura" o meu banco de dados com as datas de faturamento e codigo dos clientes (EmissorOrd)
Preciso de uma macro que copie todas as datas da coluna C "data do faturamento" e da coluna L "EmissorOrd" e cole sempre na primeira linha vazia, logo abaixo da ultima linha preenchida nas colunas "A" e "B" da aba "BD_Dt_Fatura"
está macro deve trazer os dados do codigo do cliente que é o EmissorOrd da coluna "L" da aba "Colar_ZSDQ" para a outra aba em numero, pois a macro que eu tenho esta trazendo como texto.
Após a macro deve fazer a leitura da relação dos clientes (EmissorOrd) que estiverem na coluna B da aba "BD_Dt_Fatura e relacionar na coluna ao lado na mesma aba sempre a última data de compras (A maior data do Faturamento), independente de quando este cliente foi faturado.
Fiz uma formula matricial em excel, mas ela é muito pesada e gosaria de saber se é possível fazer esta forma em VBA.
Depois disso eu vou para a aba "Colar_ZSDQ" e faço mais três formulas nas colunas "AI, AJ e AQ" onde há um Procv, uma subtração e uma formula SE.
Tudo isso pra eu saber se o seguinte: =SE(AJ2<=1;"Cliente novo";SE(AJ2>=150;"Cliente reativado";"Cliente ativo"))
Existe alguma possibilidade de vocês me ajudar? ou é muita coisa?

Desde já agradeço pela atenção.

Muito obrigado.

 
Postado : 29/12/2015 9:59 am
(@mprudencio)
Posts: 2749
Famed Member
 

A minha pergunta é vc tem 40000 linhas preenchidas na planilha onde vc usa a formula em questao???

Acho que o maior problema esta nisso veja um exemplo vc tem uma 5000 linhas (o que é bastante, ja que entende que essa tabela onde retorna a maior data e uma tabela com registros exclusivos, ou seja nao se repete. Se vc ocupar 5000 linhas sao 5000 clientes, logo 40000 linhas deixa a entender que vc tem 40000 clientes.

Essa informação realmente procede?

Se isso for fato nem o VBA vai ser capaz de te ajudar, pois vai ficar lento para a execução da macro.

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 : 29/12/2015 10:28 am
(@tutoelizeu)
Posts: 160
Estimable Member
Topic starter
 

Obrigado pelo retorno MPrudencio!

Você está certo, terei aproximadamente 5000 linhas, acredito que bem menos pois os clientes não precisam se repetir em uma nova compra, apenas a ultima data de compra por cliente.

Você consegue me ajudar?

Obrigado.

 
Postado : 29/12/2015 11:30 am
(@mprudencio)
Posts: 2749
Famed Member
 

So de diminuir {MAIOR(($B$2:$B$40000=B2)} para {MAIOR(($B$2:$B$5000=B2)}, ja vai melhorar em muito o desempenho.

Faça o teste.

....

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 : 29/12/2015 11:57 am
(@tutoelizeu)
Posts: 160
Estimable Member
Topic starter
 

Valeu amigo!

Eu fiz três macros em VBA:

A 1ª Eu copio os dados da Aba "ColarZSDQ" Colunas "C e L" e colo na primeira celula vazia, após a ultima linha preenchida na aba "BD_Dt_Fatura.
A 2ª Eu Formato o codigo do cliente, pois quando eu copio e colo com a macro anterior ela traz em formato texto (A macro copia uma coluna na aba "BD_Dt_farura e multiplica por *1 para ficar como numero
A 3ª Faz o calculo da ultima compra (Data do faturamento da coluna "C" da aba "Colar_ZSDQ") por cliente.

Veja abaixo:]

Sub Copiar2()
Dim LR As Integer 'retorna o número da última linha com conteúdo na coluna
LR = Sheets("BD_Dt_Fatura").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Colar_ZSDQ").Range("C2:C500").Copy Sheets("BD_Dt_Fatura").Range("A" & LR + 1)
Sheets("Colar_ZSDQ").Range("L2:L500").Copy Sheets("BD_Dt_Fatura").Range("B" & LR + 1)
End Sub

-------------------------------------------------------------------------------------------------

Sub Format_Client()
'
' Format_Client Macro
Range("C2").Select
ActiveCell.FormulaR1C1 = "=RC[-1]*1"
Range("C2").Select
Selection.Copy
Range("C3").Select
Selection.End(xlDown).Select
Range("B1048576").Select
Selection.End(xlUp).Select
Range("C20997").Select
Range(Selection, Selection.End(xlUp)).Select
Range("C3:C20997").Select
Range("C20997").Activate
ActiveSheet.Paste
Application.CutCopyMode = False
Range("D1").Select
End Sub

-------------------------------------------------------------------------------------------------
Sub Ultima_compra()
'
' Ultima_compra Macro

Range("D2").Select
Selection.FormulaArray = "=LARGE((R2C3:R40000C3=RC[-1])*(R2C1:R40000C1),1)"
Selection.Copy
Range("D3").Select
Selection.End(xlDown).Select
Range("C1048576").Select
Selection.End(xlUp).Select
Range("D20997").Select
Range(Selection, Selection.End(xlUp)).Select
Range("D3:D20997").Select
Range("D20997").Activate
ActiveSheet.Paste
Application.CutCopyMode = False
Range("E1").Select
End Sub

Você consegue me ajudar a unir essas macros e deixar uma só.

Obrigado.

 
Postado : 29/12/2015 12:56 pm
(@mprudencio)
Posts: 2749
Famed Member
 

EXperimente assim

Sub Copiar2()
Dim LR As Integer 'retorna o número da última linha com conteúdo na coluna
LR = Sheets("BD_Dt_Fatura").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Colar_ZSDQ").Range("C2:C500").Copy Sheets("BD_Dt_Fatura").Range("A" & LR + 1)
Sheets("Colar_ZSDQ").Range("L2:L500").Copy Sheets("BD_Dt_Fatura").Range("B" & LR + 1)
Range("C2").Select
ActiveCell.FormulaR1C1 = "=RC[-1]*1"
Range("C2").Select
Selection.Copy
Range("C3").Select
Selection.End(xlDown).Select
Range("B1048576").Select
Selection.End(xlUp).Select
Range("C20997").Select
Range(Selection, Selection.End(xlUp)).Select
Range("C3:C20997").Select
Range("C20997").Activate
ActiveSheet.Paste
Application.CutCopyMode = False
Range("D2").Select
Selection.FormulaArray = "=LARGE((R2C3:R40000C3=RC[-1])*(R2C1:R40000C1),1)"
Selection.Copy
Range("D3").Select
Selection.End(xlDown).Select
Range("C1048576").Select
Selection.End(xlUp).Select
Range("D20997").Select
Range(Selection, Selection.End(xlUp)).Select
Range("D3:D20997").Select
Range("D20997").Activate
ActiveSheet.Paste
Application.CutCopyMode = False
Range("E1").Select
End Sub

PS Não Testei

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 : 29/12/2015 12:59 pm
(@edcronos2)
Posts: 346
Reputable Member
 

olha
eu posso até fazer essa macro para vc,
mas vc vai ter que explicar em "poucas palavras" exatamente oq vc quer
ando com a cabeça muito ruim para entender até meus proprios pensamentos
a macro vai deixar com valores, mas somente vai atualizar manualmente oq deixaria a planilha mais leve

para aclarar me diz se eu estou certo
é para procurar na coluna "A" a ultima data que tenha o mesmo emissor na coluna "B"?
mas não iria apresentar sempre a mesma data para o emissor na coluna "C" ? fiquei confuso nisso

vc vai ter que explicar o proposito disso para ficar mais fácil arrumar um modo mais eficiente

 
Postado : 29/12/2015 1:10 pm
(@tutoelizeu)
Posts: 160
Estimable Member
Topic starter
 

Desculpa jovem ocupar tanto o seu tempo, mas só mais um pouquinho...

Eu preciso dizer se as vendas são de clientes:
Novos
Ativos
Reativados

- Se o intervalo entre a ultima data da fatura por Emissor (Cliente), que é sempre quando eu gerar o relatorio e a penultima data de fatura do mesmo cliente for >150 dias é um cliente: "Reativado"
- Se não houver penultima data de fatura, então é um "Cliente novo"
-Se não se enquadrar em nenhuma condição acima é um "Cliente Ativo"

Para isso a cada dia que eu gerar um relatorio vou aumentar o meu banco de dados para sempre comparar ultima data de faturamento x penultima data de faturamento.
Consegui explicar?

Obrigado.

 
Postado : 29/12/2015 2:44 pm
(@edcronos2)
Posts: 346
Reputable Member
 

olha, como falei estou com a mente um tanto quanto ocupada
então, uma coisa de cada vez
eu quero saber sobre a aba onde é para substituir a formula ={MAIOR(($B$2:$B$40000=B2)*($A$2:$A$40000);1)}

nem tinha reparado que tinha mais dados na outra aba,
então basicaemnte vc quer que liste a ultima data
da coluna "A" de BD_Dt_Fatura
na coluna "AH" da aba Colar_ZSDQ
então nem precisa dos dados na coluna "C" do BD é só fazer uma macro que liste direto

 
Postado : 29/12/2015 2:55 pm
(@tutoelizeu)
Posts: 160
Estimable Member
Topic starter
 

Bom dia!

A aba "BD_Dt_Fatura" é um banco de dados que vou montando a partir dos relatorios que eu gero diariamente e colo na aba "Colar_ZSDQ",

Para a aba "BD..." eu levo apenas as informações de Data de faturamento que está na
coluna "C" da aba ZSDQ e colo na coluna "A" da aba BD...

Para a aba "BD... eu levo também os dados de "EmissorOrd que está na coluna "L" da aba ZSDQ e colo na coluna "B" da aba BD...

A partir dai eu faço uma formula na aba "BD..." na coluna "C"
exemplo:
={MAIOR(($B$2:$B$40000=B2)*($A$2:$A$40000);2)}, que é para identificar qual é a penúltima data de fatura por cliente (Desculpe, percebi que tem que ser a penúltima data de fatura e não a ultima)

É essa ultima formula que está muito pesada e gostaria de faze-la em VBA

Consegui explicar?

Obrigado.

 
Postado : 30/12/2015 6:02 am
(@edcronos2)
Posts: 346
Reputable Member
 

cara vc está detalhando muito e explicando pouco oq vc quer
e é a ultima ou penúltima é facil ajustar
e como falei, não sei para que ter dados na coluna "C" em BD se oq vc quer é a data em ZSDQ para comparação
em "C" seria um monte de datas repetidas para zsdq pegar apenas
pq não apenas uma formula em zsdq ?

mas tudo bem, depois do meu expediente eu faço algo para vc ajustar, era para ter resolvido isso ontem, mas vc apenas retornou hoje

 
Postado : 30/12/2015 6:58 am
(@tutoelizeu)
Posts: 160
Estimable Member
Topic starter
 

Obrigado jovem!

 
Postado : 30/12/2015 11:58 am
(@edcronos2)
Posts: 346
Reputable Member
 

olha
peguei aqui agora para fazer e na confecção da macro apareceu algumas questões
1ª se é para pegar a segunda data mais recente oq fazer se somente tiver uma de algum cliente que só comprou uma vez ?
2ª se vc sempre está atualizando o bd pelas novas compras,
de qualquer forma oq importa é a ultima data de compra na aba ZSDQ na coluna "AH" sendo que vc eliminaria 2 colunas de formulas

3ª se esse bd está sempre sendo atualizado e já tem mais de 40000 linhas vai chegar num patamar que vai ficar insustentável fazer essa operação

 
Postado : 30/12/2015 4:58 pm
(@edcronos2)
Posts: 346
Reputable Member
 

estou aqui tentando definir como fazer enquanto me arrependo de ter me metido nisso

possibilidades
primeiro ordenar os dados por dada e assim poder fazer busca pelo emisor
filtrar os emisores e então se pegar a data que se quer
tem outras possibilidades mas são mais complexas

vou pelo ordenar pela data e procurar o emissor
mas vou colocar para listar as datas em zsdq mesmo,

 
Postado : 30/12/2015 5:37 pm
(@edcronos2)
Posts: 346
Reputable Member
 

vai ter que ter mais dados para testes


Sub ultoma()
    ocj = 2
    Dim ddd()
    With Sheets("BD_Dt_Fatura")
        ddi = .Range("A2:B" & .Cells(Rows.Count, 1).End(xlUp).Row).Value2
    End With
    testdd ddd, 1

    With Sheets("Colar_ZSDQ")
        ddo = .Range("L2:L" & .Cells(Rows.Count, "L").End(xlUp).Row).Value2
        l2 = UBound(ddo, 1)
        ReDim ddd(1 To l2, 1 To 1)

        For l3 = 1 To l2
            oco = 0
            For l4 = UBound(ddi, 1) To 1 Step -1
                If ddo(l3, 1) = ddi(l4, 2) Then
                    oco = ocj + 1
                    If oco = oco Then
                        ddd(l3, 1) = ddi(l4, 1)
                        GoTo pil:
                    End If
                End If
            Next
pil:
        Next
        .Range("ah2:ah" & l2 + 1).Value2 = ddd
    End With

End Sub

'ordena
Sub testdd(ByRef array1, ByVal cx As Long)
    array1 = Range("A2:b" & Cells(Rows.Count, "A").End(xlUp).Row).Value2
    lf = UBound(array1, 1)
    If cx = 1 Then cx2 = 2 Else cx2 = 2

    ci1 = 1
    inC = ci1:
    i = inC + 1
    Do
        a = array1(inC, cx)
        b = array1(inC + 1, cx)
        Aa = array1(inC, cx2)
        ba = array1(inC + 1, cx2)
        If a > b Then

            array1(inC, cx) = b: c = a
            array1(inC + 1, cx) = c
            array1(inC, cx2) = ba: ca = Aa
            array1(inC + 1, cx2) = ca
            If inC > ci1 Then inC = inC - 1
        Else
            inC = i: i = i + 1
        End If
    Loop Until inC = lf

End Sub
 
Postado : 30/12/2015 6:16 pm
Página 1 / 2