Notifications
Clear all

Alterar evento Worksheet

8 Posts
4 Usuários
0 Reactions
1,281 Visualizações
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá, boa noite.

No código a seguir, uma ação é disparada pela célula específica. O evento é o Change. O usuário faz a alteração. O que pretendo é executar o mesmo código mas a partir da alteração, na mesma cálula, em função de uma fórmula. Digamos que na célula há uma fórmula do tipo "=soma(D7:d11)". Quando o usuário alterar qualquer valor do intervalo, vai consequentemente alterar o resultado, é nesse momento que o código deve ser disparado.

O esquema do codigo:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range, arrayrang()



...código



    If Target.Address = "$E$14" Then

...código




End Sub

Desde já agradeço.

 
Postado : 26/04/2016 5:28 pm
(@mprudencio)
Posts: 0
New Member
 

Nao entendi

VC quer alterar a formula para que a macro seja disparada???

É isso???

Explica melhor pq ficou estranho seu objetivo.

 
Postado : 26/04/2016 6:16 pm
(@tsa-xlsx)
Posts: 0
New Member
 

Segue uma sugestão.

Em vez de usar o evento change, sugiro usar o evento calculate, pois ele é mais específico para fórmulas.

Private Sub Worksheet_Calculate()

Dim anterior    As Double
Dim novo        As Double
Dim rng         As Range

Set rng = Range("B2")

With Application
    .EnableEvents = False
    novo = rng.Value2
    .Undo
    anterior = rng.Value2
    .Undo
    .EnableEvents = True
End With 'application

If novo <> anterior Then

    'Seu código que deve ser disparado somente se o cálculo for alterado

End If

End Sub
 
Postado : 26/04/2016 6:51 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Bom, melhor postar o código.

No código, a cada alteração na célula "E14" o código é disparado e algumas linhas são ocultadas. Ocorre que preciso que o código seja disparado por uma ação diferente. No lugar da alateração na célula, que seja disparado pela alteração em uma fórmula que está na mesma célula, ou seja, quando houver alteração no resultado da fórmula "=soma(D7:D11".

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range, arrayrang()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    ActiveSheet.Unprotect Password:="senha"
    ActiveSheet.Protect Password:="senha", UserInterfaceOnly:=True
    Cells.Locked = False
    On Error Resume Next
    Set rng = Cells.SpecialCells(xlCellTypeFormulas)
    'Set rng = Cells.SpecialCells(XlCellTypeText) 'Text se quiser travar texto
    If Err.Number > 0 Then
        Set rng = Cells.SpecialCells(xlCellTypeConstants)
    Else
        Set rng = Union(rng, Cells.SpecialCells(xlCellTypeFormulas))
        Set rng = Cells.SpecialCells(XlCellTypeText)
    End If
    On Error GoTo 0
    If Not rng Is Nothing Then rng.Locked = True

    If Target.Address = "$E$14" Then

        arrayrang = Range("$I$1:$I$568")
        For l = 1 To UBound(arrayrang, 1)
            If arrayrang(l, 1) = 0 Then
                Rows(l + 1).EntireRow.Hidden = True
            Else
                Rows(l + 1).EntireRow.Hidden = False
            End If
        Next

                For Each cell In Range("$I$1:$I$568")
                    If cell.Value = 0 Then
                        cell.EntireRow.Hidden = True
                    Else
                        cell.EntireRow.Hidden = False
                    End If
                Next
    End If
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

    'Range("C13").Select

End Sub

É isso.

 
Postado : 26/04/2016 7:32 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se entendi, na sugestão do tsa o Evento Calculate irá executar apos efetuar algum calculo na aba, então você teria de ajustar a linha :
Set rng = Range("B2")
trocar B2 pelo range em que se encontra a formula "=soma(D7:D11", assim será verificado se o valor alterou nesta celula e percorrerá a rotina.

 
Postado : 26/04/2016 9:19 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá bom dia

Tentei, mas ocorre um erro logo na parte do código ".Undo"...
Realmente não conseguirei fazer a adaptação sozinho.

 
Postado : 27/04/2016 5:00 am
(@mprudencio)
Posts: 0
New Member
 

Entao disponibiliza o arquivo.

 
Postado : 27/04/2016 6:03 am
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

MPrudêncio,

Tudo beleza?.

Seguinte, nenhum problema em disponibilizar o arquivo, mas como postei anteriormente, o código age sobre um determinado intervalo, no caso "R1:R568". Cada célula desse intervalo possui uma fórmula que tem somente dois resultados possíveis, que são 10 ou Zero. Já na célula "E14" eu tenho uma validação do tipo "lista" com 2 opções, "sim" e "não".

O código age no intervalo "R1:R568" para ocultar todas as células que estiverem com zero, e faz isso sempre que uma das duas opções é selecionada, "sim" ou "não".

A intenção é que ao invés de "sim" ou "não", também tenha uma fórmula, e que o código seja acionado quando houver alguma alteração no resultado. A fórmula é "=soma(D7:D11". Cada célula desse intervalo possui apenas os valores 1 ou 2. Então o resultado da fórmula é no máximo 8.

Explicando dessa forma creio que seja mais fácil compreender a intenção. O código que postei está correto, a idéia é alterar o evento que o dispara. As caracterísiticas precisam ser mantidas, acredito que não haja problema quanto a isso.

Obrigado.

 
Postado : 27/04/2016 7:35 am