Como executar uma macro quando o valor de uma celula mudar em 2 planilhas diferentes? Exemplo:planilha X e a planilha Y.. Quando o valor de C1 mudar na planilha X eu preciso dar call na macro 1, " de A1 mudar na planilha Y, call macro 2... Eu tentei colocar em uma: Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$1" Then
Call CommandButton2_Click
End If
End Sub
Funciona tudo certo, quando a celula C1 muda ele da call na macro, porém se eu por este mesmo codigo com outros valores, em outra planilha da erro, de sub não definida Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Call CommandButton1_Click
End If
End Sub Spoiler
Mensagens Recomendadas
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. 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. Ligação para comentárioPartilhar noutros sites
boas Não percebi muito bem o que pretendes
A informática chegou para resolver problemas que antes não existiam Quem ri por último é porque está conectado a 52 Kbs. Ligação para comentárioPartilhar noutros sites
Basta alterares o teu código assim: 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 Ligação para comentárioPartilhar noutros sites
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 Ligação para comentárioPartilhar noutros sites
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: 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 O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles Ligação para comentárioPartilhar noutros sites
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 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? Ligação para comentárioPartilhar noutros sites
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: 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: O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles Ligação para comentárioPartilhar noutros sites
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? Ligação para comentárioPartilhar noutros sites
Permitam-me...
Seguindo a mesma lógica seria só acrescentar mais Case, tipo: Case 2 MsgBox "Macro2" Ligação para comentárioPartilhar noutros sites
Para utilizar outra lógica, associe essa macro ao seu Drop Down 1. 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... Ligação para comentárioPartilhar noutros sites
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
O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles Ligação para comentárioPartilhar noutros sites
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 Ligação para comentárioPartilhar noutros sites
Segue a melhor opção de código que encontrei. Public VerificaUpDown ' variável publica Private Sub Textbox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) VerificaUpDown = Textbox1 End Sub Private Sub Textbox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = vbKeyReturn Or KeyAscii = vbKeyBack Then Exit Sub If KeyAscii < vbKey0 Or KeyAscii > vbKey9 Then KeyAscii = 0 End If End Sub Private Sub Textbox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If Textbox1 = VerificaUpDown Then Exit Sub Dim Numero Numero = Textbox1 Numero = Replace(Numero, "R$", "") 'usado para real brasileiro Numero = Replace(Numero, ".", "") Numero = Replace(Numero, ",", "") If Numero = "" Then Numero = "0" Textbox1.Value = Format(Numero / 100, "R$ #,0.#0") End Sub Ligação para comentárioPartilhar noutros sitesCrie uma conta ou ligue-se para comentarSó membros podem comentar |