Notifications
Clear all

Rodar Macro ao Alterar Calculo

12 Posts
4 Usuários
0 Reactions
2,193 Visualizações
(@jpherarth)
Posts: 0
New Member
Topic starter
 

Prezados, é sabido que a função Private Sub Worksheet_Change(ByVal Target As Range) é ativada ao alterar os valores de algum range específico, porém ela não funciona se os valores forem alterados pelos simples recalculo da célula. Para isso, existe a função Private Sub Worksheet_Calculate(), mas essa função faz isso pra planilha inteira, e não para um range específico. é possível atualizar ela para um range específico? Por exemplo, só ativar a macro se as células A1:A50 forem recalculadas?

 
Postado : 29/01/2015 7:59 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Já tentou especificar o intervalo?

Worksheets("Plan1").Range("A1:A50").Calculate 

Att

 
Postado : 29/01/2015 8:35 am
(@jpherarth)
Posts: 0
New Member
Topic starter
 

Nçao deu certo, pode me passar uma orientação mais específica?

 
Postado : 29/01/2015 10:02 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Se poder postar seu arquivo modelo para tentarmos adaptar.....

Att

 
Postado : 29/01/2015 10:04 am
(@jpherarth)
Posts: 0
New Member
Topic starter
 

Segue exemplo

 
Postado : 29/01/2015 10:23 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!

No seu modelo tem somente a coluna A com formulas.

Visto isso qual o problema de usar

Private Sub Worksheet_Calculate()

??

Att

 
Postado : 29/01/2015 10:52 am
(@jpherarth)
Posts: 0
New Member
Topic starter
 

Esse modelo é um exemplo, no arquivo mesmo, são várias linhas e colunas. Usar a worksheet_calculate de forma que sempre ative a macro com qualquer mudança de cálculo pra todas as linahs não atende o que eu preciso. preciso apenas do range a1:a50

 
Postado : 29/01/2015 11:49 am
(@bilokas)
Posts: 168
Reputable Member
 

Já tentou com Application.Evaluate ?

 
Postado : 29/01/2015 12:46 pm
(@jpherarth)
Posts: 0
New Member
Topic starter
 

não, como fica?

 
Postado : 29/01/2015 1:18 pm
(@bilokas)
Posts: 168
Reputable Member
 

Coloca o seguinte código em "EstaPasta_de_Trabalho"

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.Evaluate (Sheets("plan1").Range("A1", "A50"))
End Sub

Ou seja, você muda o range pra onde vão estar suas fórmulas... E se tiver em mais de um range por exemplo, é só dividir...

Dessa forma...

Application.Evaluate (Sheets("plan1").Range("A1", "A10"))
Application.Evaluate (Sheets("plan1").Range("B1", "B10"))

E assim por diante...

 
Postado : 29/01/2015 2:00 pm
(@jpherarth)
Posts: 0
New Member
Topic starter
 

não deu. não fez nada.

 
Postado : 29/01/2015 2:55 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Cara, posso estar falando besteira, mas...

O evento Change tem o parâmetro Target:
Private Sub Worksheet_Change(ByVal Target As Range)

Enquanto o evento Calculate não tem parâmetros:
Worksheet_Calculate()

Não achei uma explicação para esta variação, mas arrisco dizer que o evento Calculate, por não ter parâmetros, sempre sem aplica à planilha toda (se estivr errado, alguém vai dizer - eu acho).

Como não sei bem o que vc quer, eu fiz um teste com uma função UDF:

Function EVENTO(formula As Variant) As Variant
Call sua_macro
Evento = formula
End Function

Como pode ver, a intenção é jogar a fórmula que vc já utiliza dentro da função EVENTO, e ela vai chamar a tua macro. Com isso, somente as células que tenham essa função vão chamar a macro.

Eu fiz um teste básico, chamando esta macro:

Sub sua_macro()
MsgBox "oi"
End Sub

E deu certo.

Dependendo do que a tua macro vai fazer, pode funcionar.

Ah, sim, para usar a função, basta jogar a tua fómula dentro dela, ou seja, se vc tinha, por exemplo:

=ÍNDICE(A1:A10;CORRESP(D1;B1:B10;0))

Passará a ser:

=EVENTO(ÍNDICE(A1:A10;CORRESP(D1;B1:B10;0)))

 
Postado : 29/01/2015 4:35 pm