Ir para conteúdo


Revista PROGRAMAR – Edição 46 (Setembro 2014): Download já disponível!

- - - - -

[Resolvido] Executar uma macro quando o valor de uma célula se altera

vba excel ms office

  • Por favor inicie sessão para responder
11 respostas a este tópico

#1 sagostinho

sagostinho

    Boolean User

  • Membro
  • PipPipPip
  • 141 mensagens

Publicado 18 de Abril de 2011 - 23:13

Oi pessoal estou com um problema que não consigo resolver pois os meus conhecimentos de vba ainda são muitos poucos tenho este código que me executa uma macro sempre que uma célula altera mas o problema aqui é que eu tenho de digitar o 1 na célula caso contrário não executa a macro.Código (Visual Basic):
Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Not Intersect(Target, Range("A1")) Is Nothing Then
           Select Case Target
             Case 1
               Call macro1
             
             Case Else
           End Select
        End If
        Application.EnableEvents = True
End Sub

Sub macro1()
    MsgBox "macro1"
End Sub

O que eu queria fazer era o seguinte sempre que aparecesse 1 na célula A1 a macro executasse e não fosse preciso digitar esse 1.

#2 Andrepereira9

Andrepereira9

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 1068 mensagens

Publicado 19 de Abril de 2011 - 08:44

boas

Não percebi muito bem o que pretendes

Citar

O que eu queria fazer era o seguinte sempre que aparecesse 1 na célula A1 a macro executasse e não fosse preciso digitar esse 1.


#3 jppinto

jppinto

    null

  • Membro
  • Pip
  • 25 mensagens

Publicado 19 de Abril de 2011 - 09:59

Basta alterares o teu código assim:

Código (Visual Basic):
Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Not Intersect(Target, Range("A1")) Is Nothing Then
                Call macro1     
        End If
        Application.EnableEvents = True
End Sub

Sub macro1()
    MsgBox "macro1"
End Sub

Atenção que a tua macro corre sempre que uma célula é alterada mas depois só chama a macro1 se a alteração for na célula A1. Se quiseres que ela seja executada em mais células, deverás alterar esta linha:

If Not Intersect(Target, Range("A1")) Is Nothing Then

E aonde tens A1 colocar por exemplo A1:D10 que aí já irá considerar um range maior.

jpgpinto

#4 sagostinho

sagostinho

    Boolean User

  • Membro
  • PipPipPip
  • 141 mensagens

Publicado 19 de Abril de 2011 - 18:48

Ver Mensagemjppinto, em 19 de Abril de 2011 - 09:59, disse:

Basta alterares o teu código assim:

Código (Visual Basic):
Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Not Intersect(Target, Range("A1")) Is Nothing Then
                Call macro1     
        End If
        Application.EnableEvents = True
End Sub




Sub macro1()
    MsgBox "macro1"
End Sub

Atenção que a tua macro corre sempre que uma célula é alterada mas depois só chama a macro1 se a alteração for na célula A1. Se quiseres que ela seja executada em mais células, deverás alterar esta linha:

If Not Intersect(Target, Range("A1")) Is Nothing Then

E aonde tens A1 colocar por exemplo A1:D10 que aí já irá considerar um range maior.

jpgpinto

Ola obrigado pela a ajuda que voçes me estao a dar mas continua a nao dar talvez nao me esteja a explicar bem entao e assim na celula A1 aparece valores entre 1 e 9  vindo de outras celulas e o que eu queria fazer era o seguinte mediante o valor que aparecesse nessa celula A1 me exedcutasse a macro correspondente EX: valor 1 executava a macro 1 - valor 2 executava macro 2 e por ai fora

#5 FreiNando

FreiNando

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 436 mensagens

Publicado 19 de Abril de 2011 - 21:07

Queres executar as tuas macros dependendo do valor calculado de A1.

Usa o evento Calculate da Folha.

Só que este é chamado todas as vezes que a folha é calculada, independente de quais as celulas a serem calculadas.

Neste caso não sei se será correcto executar as tuas macros mesmo que o valor de A1 não mude.

Para isso basta guardar o valor de A1 e compará-lo com o valor depois da folha ser calculada.

Pegando no teu exemplo:

Código (Visual Basic):
Dim Numero As Integer

Private Sub Worksheet_Calculate()
       'Application.EnableEvents = False
       ' esta instrução deixa de ser necessária por a condição seguinte deixar de se verificar

       If Numero <> Range("A1") Then
            Numero = Range("A1")
            Select Case Numero
              Case 1
                Call macro1
             
              Case Else
            End Select
       End If
       'Application.EnableEvents = True
End Sub

Sub macro1()
    MsgBox "macro1"
End Sub


#6 sagostinho

sagostinho

    Boolean User

  • Membro
  • PipPipPip
  • 141 mensagens

Publicado 20 de Abril de 2011 - 22:13

Ola desde já obrigado pela ajuda que me tem em dado FreiNando aquele teu código funciona e tens razão quando dizes que ele e chamado sempre quando a folha e calculada.vou deixar aqui o arquivo para verem se existe outra maneira de o fazer
Código (Visual Basic):
Dim Numero As Integer

Private Sub Worksheet_Calculate()
       'Application.EnableEvents = False
      ' esta instrução deixa de ser necessária por a condição seguinte deixar de se verificar

       If Numero <> Range("A1") Then
            Numero = Range("A1")
            Select Case Numero
              Case 1
                Call Macro1

              Case Else
            End Select
       End If
       'Application.EnableEvents = True
End Sub

Sub Macro1()
    MsgBox "Apagar"


    Range("B5:C14").Select
    Selection.ClearContents
    Range("D5").Select


End Sub

e quanto a msgBox a alguma maneira dentro desta aparecer um botão sim e não em vez do ok?

#7 FreiNando

FreiNando

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 436 mensagens

Publicado 21 de Abril de 2011 - 08:42

Ver Mensagemsagostinho, em 20 de Abril de 2011 - 22:13, disse:

e quanto a msgBox a alguma maneira dentro desta aparecer um botão sim e não em vez do ok?

Se tens o AutoListMembers ligado ao escreveres a msgbox o segundo parametro é a configuração das teclas e do icons.

Por exemplo se queres os botões Sim e Não com o Não por defeito, o icon de Exclamação e a mensagem aparacer por cima de qualquer programa:

Código (Visual Basic):
    If MsgBox("Mensagem", vbYesNo + vbDefaultButton2 + vbExclamation + vbSystemModal) = vbYes Then
        MsgBox "Confirmado"
    Else
        MsgBox "Negado"
    End If


Qaunto ao teu programa, não precisas selecionar as celulas para apagar o conteudo

Faz apenas:  Range("B5:C14").ClearContents

#8 sagostinho

sagostinho

    Boolean User

  • Membro
  • PipPipPip
  • 141 mensagens

Publicado 21 de Abril de 2011 - 22:28

Ola FreiNando obrigada pela ajuda que me tens dado não querendo abusar existe alguma maneira de atribuir uma macro a cada opção da caixa de combinação?

#9 joseA

joseA

    Boolean User

  • Membro
  • PipPipPip
  • 179 mensagens

Publicado 22 de Abril de 2011 - 00:37

Permitam-me...

Ver Mensagemsagostinho, em 21 de Abril de 2011 - 22:28, disse:

...existe alguma maneira de atribuir uma macro a cada opção da caixa de combinação?

Seguindo a mesma lógica seria só acrescentar mais Case, tipo:

Código (Visual Basic):
             Case 2
              MsgBox "Macro2"


#10 joseA

joseA

    Boolean User

  • Membro
  • PipPipPip
  • 179 mensagens

Publicado 22 de Abril de 2011 - 00:55

Para utilizar outra lógica, associe essa macro ao seu Drop Down 1.

Código (Visual Basic):
Sub Dropdown1_Alteração()
Select Case Folha1.Shapes("Drop Down 1").ControlFormat.ListIndex
Case 1
MsgBox "Macro1"
Case 2
MsgBox "Macro2"
Case 3
MsgBox "Macro3"
Case Else
End Select
End Sub

Substitua a MsgBox por Call SuaMacro...

#11 FreiNando

FreiNando

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 436 mensagens

Publicado 22 de Abril de 2011 - 07:46

Eu nem olhei para o teu ficheiro, visto teres mostrado o código,
mas devias ter mencionado que apesar da celula A1 conter uma formula, esse valor está ligado a uma combobox.

Neste caso a resolução é bem mais simples e evita usar o evento change ou calculate.

Basta associares uma macro à combobox, e a partir dessa e conforme o joseA te indicou, fazer chamadas às outras macros.

Obs.:  A resposta à tua dúvida teria chegado 3 dias antes se tivesses indicado onde e como alteravas o valor de A1

Ver Mensagemsagostinho, em 18 de Abril de 2011 - 23:13, disse:

Oi pessoal estou com um problema que não consigo resolver pois os meus conhecimentos de vba ainda são muitos poucos tenho este código que me executa uma macro sempre que uma célula altera mas o problema aqui é que eu tenho de digitar o 1 na célula caso contrário não executa a macro

O que eu queria fazer era o seguinte sempre que aparecesse 1 na célula A1 a macro executasse e não fosse preciso digitar esse 1.


#12 sagostinho

sagostinho

    Boolean User

  • Membro
  • PipPipPip
  • 141 mensagens

Publicado 27 de Abril de 2011 - 22:32

Ver MensagemFreiNando, em 22 de Abril de 2011 - 07:46, disse:

Eu nem olhei para o teu ficheiro, visto teres mostrado o código,
mas devias ter mencionado que apesar da célula A1 conter uma formula, esse valor está ligado a uma combobox.

Neste caso a resolução é bem mais simples e evita usar o evento change ou calculate.

Basta associares uma macro à combobox, e a partir dessa e conforme o joseA te indicou, fazer chamadas às outras macros.

Obs.:  A resposta à tua dúvida teria chegado 3 dias antes se tivesses indicado onde e como alteravas o valor de A1

Tens razão não me expliquei bem devia ter mencionado que o valor estava ligado a uma combobox mas assim já fiquei a saber
como se faz quando um valor se altera.
Obrigada pela a vossa ajuda foram espectaculares obrigado