Notifications
Clear all

Colocar macro existente automatico

8 Posts
2 Usuários
0 Reactions
1,477 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Olá pessoal,

Tenho uma macro que cópia dados da coluna G3:G22 que são diferente de 0 e organiza em ordem decrescente na coluna P3:P22, só que gostaria que quando altera-se os valores da coluna G3:G22, a macro copia e ordem executa-se automaticamente no ato da alteração.

Segue os códigos:

Sub Copiar()
    Dim i As Integer
    Dim k As Integer
   
    'Variável para controlar a linha de destino
    k = 3
   
    'Percorre "Plan1" da linha 3 até a 22
    For i = 3 To 22
   
        'Se o valor da célula da coluna "G" for diferente de 0
        If Sheets("Plan1").Cells(i, "G").Value <> 0 Then
       
            'Copia a linha "i" no intervalo que compreende as colunas A, C a F e V e W
            'para linha de destino a partir da coluna "k"
            Sheets("Plan1").Cells(k, "P").Value = Sheets("Plan1").Cells(i, "G").Value
            'Sheets("TRANSFERÊNCIA").Range("E" & k & ":H" & k).Value = Sheets("PERDA").Range("C" & i & ":F" & i).Value
            'Sheets("TRANSFERÊNCIA").Range("I" & k & ":J" & k).Value = Sheets("PERDA").Range("V" & i & ":W" & i).Value
           
            'Incrementa o valor de "k" para que o intervalo seguinte seja copiado na linha de baixo.
            k = k + 1
        End If
    Next
Call Ord_Decrescente

End Sub
Sub Ord_Decrescente()
'
' Ord_Decrescente Macro
'

'
Application.ScreenUpdating = False
    Range("P2:Q22").Select
    ActiveWorkbook.Worksheets("Plan1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Plan1").Sort.SortFields.Add Key:=Range("P3:P22"), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Plan1").Sort
        .SetRange Range("P2:Q22")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("P3:Q3").Select
Application.ScreenUpdating = True
End Sub

silva_jmp

 
Postado : 13/01/2014 8:38 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

silva_jmp,

Bom Dia!

Coloque, no evento Worksheet_Change, da planilha onde tem os dados que serão copiados, o código abaixo:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Target.Column = 7 Then
        Call Copiar
        Call Ord_Decrescente
    End If
    Application.EnableEvents = True
End Sub
 
Postado : 13/01/2014 8:59 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Wagner boa tarde, obrigado por contribuir, deu certo, porém adaptei mais uma tabela com o mesmo conceito da macro anterior.
Agora ficou assim, a macro cópia dados da coluna G3:G22 se for <> 0 e colocar em ordem decrescente na coluna P3:P22 e cópia dados da coluna J3:J22 se for <> 0 e coloca em ordem decrescente na coluna AB3:AB22.

Código:

Sub Copiar()
    Dim i As Integer
    Dim k As Integer
   
    
    k = 3 'Variável para controlar a linha de destino
    For i = 3 To 22 'Percorre "Plan1" da linha 3 até a 22
   
   Application.ScreenUpdating = False

        'Se o valor da célula da coluna "H" e "J" for diferente de 0
        If Sheets("Plan1").Cells(i, "H").Value <> 0 And Sheets("Plan1").Cells(i, "J").Value <> 0 Then
           Sheets("Plan1").Cells(k, "Q").Value = Sheets("Plan1").Cells(i, "H").Value
           Sheets("Plan1").Cells(k, "AB").Value = Sheets("Plan1").Cells(i, "J").Value
           k = k + 1 'Incrementa o valor de "k" para que o intervalo seguinte seja copiado na linha de baixo.
        End If
        
    Next
  
    Application.ScreenUpdating = True

End Sub

Sub Ord_Decrescente()
Application.ScreenUpdating = False
    Range("Q2:R22").Select
    ActiveWorkbook.Worksheets("Plan1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Plan1").Sort.SortFields.Add Key:=Range("Q3:Q22"), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Plan1").Sort
        .SetRange Range("Q2:R22")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("AB2:AC22").Select
    ActiveWorkbook.Worksheets("Plan1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Plan1").Sort.SortFields.Add Key:=Range("AB3:AB22") _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Plan1").Sort
        .SetRange Range("AB2:AC22")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Application.ScreenUpdating = True
End Sub

Preciso que a macro execute automaticamente no ato da alteração das duas colunas.

silva_jmp

 
Postado : 13/01/2014 11:49 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

Basta substituir a linha:

If Target.Column = 7 Then

Por essa:

If Target.Column = 7 OR Target.Column = 10 Then
 
Postado : 13/01/2014 12:32 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Wagner, alterei conforme sua postagem, mas não deu certo, na tabela de pareto de frequencia não esta cópiando somentes os dados <> 0 eu acho que é alguma coisa no código Sub Copiar_Freq(), mas não achar o problema.

Segue a planilha, pode dar uma olhada.

silva_jmp

 
Postado : 13/01/2014 1:33 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

silva_jmp,

Bom... mas eu não mexi em nada no seu código! Você pediu no post inicial que sua macro Copiar e Ordenar fosse executada automaticamente sempre que houvesse alteração na célula G (depois também na célula J). Lembra?

gostaria que quando altera-se os valores da coluna G3:G22, a macro copia e ordem executa-se automaticamente no ato da alteração.

Entretanto, pelo que observei seu código, você está AND ao invés de OR. No seu caso, o correto é OR. Assim, você deve substituir a linha:

If Sheets("Plan1").Cells(i, "H").Value <> 0 And Sheets("Plan1").Cells(i, "J").Value <> 0 Then

Por:

If Sheets("Plan1").Cells(i, "H").Value <> 0 OR Sheets("Plan1").Cells(i, "J").Value <> 0 Then
 
Postado : 13/01/2014 9:28 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Wagner boa tarde,

Alterei e deu certo, porém tem algumas duvidas referente a minha macro de pareto, acho melhor dar como resolvido a este tópico e abrir outro.

Desde já agradeço.

silvajmp

 
Postado : 14/01/2014 11:22 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Caso seja necessário reabrir o tópico, o autor poderá enviar uma MP para um dos moderadores solicitando o desbloqueio.

 
Postado : 14/01/2014 5:52 pm