Notifications
Clear all

Alterar evento Worksheet

8 Posts
4 Usuários
0 Reactions
1,287 Visualizações
(@luizhcosta)
Posts: 420
Honorable 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: 2749
Famed Member
 

Nao entendi

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

É isso???

Explica melhor pq ficou estranho seu objetivo.

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 : 26/04/2016 6:16 pm
(@tsa-xlsx)
Posts: 55
Trusted 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

Abs.
Espero ter ajudado.

Todos que ajudaram ou tentaram ajudar estão com boa vontade fazendo isso de graça.
Por isso, seja educado, ajude-os a te ajudar, e sempre clique na mãozinha para agradecer.

 
Postado : 26/04/2016 6:51 pm
(@luizhcosta)
Posts: 420
Honorable 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
Fernando Fernandes
(@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.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 26/04/2016 9:19 pm
(@luizhcosta)
Posts: 420
Honorable 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: 2749
Famed Member
 

Entao disponibiliza o arquivo.

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 : 27/04/2016 6:03 am
(@luizhcosta)
Posts: 420
Honorable 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