Executar macro automaticamente quando muda valor de célula

Olá
Pretendia que a macro abaixo fosse executa automaticamente, sempre que o valor de J11, da folha “registo” seja alterado. O valor de J11 é igual a : =J9&J10. Pelo que entendi uma possibilidade seria nos Eventos, Conteúdo alterado. Mas não estou a ser capaz de executar esse passo. Alguém me poderia indicar os passos ou uma outra solução? ( como a macro tem 300 e tal linhas, indico só as partes principais, eliminando parte do conteúdo central da mesma que é sempre igual, alterando apenas os valores. )
Obrigado
Sub CopiarColarSe
Dim oDoc As Object
Dim oRegisto As Object
Dim oTabelas As Object
Dim i As Integer
Dim oRange As Object

oDoc = ThisComponent
oRegisto = oDoc.Sheets.getByName("registo")
oTabelas = oDoc.Sheets.getByName("tabelas")

' Verificar se o valor de "J11" corresponde a um dos casos especificados
Select Case oRegisto.getCellRangeByName("J11").String
    Case "110", "111", "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220", "221", "222", "310", "311", "312", "314", "315", "316", "317", "321", "322", "410", "411", "412", "414", "415", "416", "417", "421", "422", "514", "515", "522"
        ' Continuar com a execução da macro
    Case Else
        MsgBox "COMBINAÇÃO INEXISTENTE", vbExclamation
        Exit Sub ' Interromper a execução da macro
End Select

' Limpar o conteúdo das células A14 a F100 na folha "registo"
oRange = oRegisto.getCellRangeByName("A14:F100")
oRange.clearContents(1023)

Select Case oRegisto.getCellRangeByName("J11").String
    Case "110"
        For i = 0 To 28
            oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(0, 2 + i).String
            oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(1, 2 + i).String
        Next i
    Case "111"
        For i = 0 To 30
            oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(2, 2 + i).String
            oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(3, 2 + i).String ' Copiar D3:D33 da folha "tabelas" e colar na folha "registo" a partir de A14
        Next i
    Case "112"
        For i = 0 To 27
            oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(4, 2 + i).String
            oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(5, 2 + i).String ' Copiar F3:F30 da folha "tabelas" e colar na folha "registo" a partir de A14

etc…etc…etc…

       Next i
End Select

' Centralizar o conteúdo das células A14 a A100 na folha "registo"
oRegisto.getCellRangeByName("A14:A100").HoriJustify = com.sun.star.table.CellHoriJustify.CENTER

' Alinhar à esquerda o conteúdo das células B14 a B50 e C14 a C50 na folha "registo"
oRegisto.getCellRangeByName("B14:B50").HoriJustify = com.sun.star.table.CellHoriJustify.LEFT
oRegisto.getCellRangeByName("C14:C50").HoriJustify = com.sun.star.table.CellHoriJustify.LEFT

End Sub

Ola @NFonseca , tenho esta duas macros para ligar a Eventos de planilha…

Verificare é possível usar em seu procedimento.

'' Conteúdo Alterado Área = Sub AlteredContentArea
Sub AlteredContentArea ( oCelula )
'------------------------------------------------------------------------------
'Associe a abaixo ao evento Seleção Alterada dos Eventos de Planilha:
'Menu Planilha > Eventos de Planilha... ou
'Aba da Planilha (botão direito do mouse) > Eventos de Planilha...
'Obs.: Note que estes são eventos específicos de cada planilha e
'não estão listados em Ferramentas > Personalizar > Eventos.
'Por Grafeno: https://ask.libreoffice.org/t/como-executar-uma-macro-no-calc-ao-selecionar-uma-celula-de-uma-area/38209
' Testar se o objeto selecionado é uma célula individual '
If oCelula.ImplementationName <> "ScCellObj" Then Exit Sub
' Endereço da Célula '
oEnd = oCelula.CellAddress
' Celula no intervalo B7:B27 '
' Coluna 1 e linha entre 6 e 26 '
If oEnd.Column = 1 Then
If oEnd.Row >= 6 And oEnd.Row <= 26 Then
' Chamar a macro desejada '
      Call SuaMacro'<===== Macro1 = Macro a executar
End If
End If
End Sub

.

'' Conteúdo Alterado Célula = Sub AlteredContentCell ( oCelula )
Sub AlteredContentCell ( oCelula )
'-----------------------------------------------------------------------------------
'Associe a abaixo ao evento Seleção Alterada dos Eventos de Planilha:
'Menu Planilha > Eventos de Planilha... ou
'Aba da Planilha (botão direito do mouse) > Eventos de Planilha...
'Obs.: Note que estes são eventos específicos de cada planilha e
'não estão listados em Ferramentas > Personalizar > Eventos.
'Por Grafeno: https://ask.libreoffice.org/t/como-executar-uma-macro-no-calc-ao-selecionar-uma-celula-de-uma-area/38209
' Testar se o objeto selecionado é uma célula individual
'If oCelula.ImplementationName <> "ScCellObj" Then Exit Sub
If Right(oCelula.AbsoluteName,4) = "$E$5" Then
'Chamar a macro desejada
      Call SuaMacro '<===== Macro1 = Macro a executar
End If
End Sub

Obrigado pela resposta. Mas não estou a conseguir que resulte. Também os meus conhecimentos são limitados neste aspecto. Optei pela segunda opção. A macro não está a executar automaticamente, e só funciona se a executar manualmente. Penso que se calhar não funciona automaticamente porque tenho a macro gravada no local errado, Os passos que dei foram estes:

  • tecla direita na folha “registo”→ eventos da folha→ selecionei Conteúdo alterado e escolhi a macro AlteredContentCell ( alterei para a célula que muda o conteúdo, J11 ) :

Sub AlteredContentCell ( oCelula )
'-----------------------------------------------------------------------------------
'Associe a abaixo ao evento Seleção Alterada dos Eventos de Planilha:
'Menu Planilha > Eventos de Planilha… ou
'Aba da Planilha (botão direito do mouse) > Eventos de Planilha…
'Obs.: Note que estes são eventos específicos de cada planilha e
'não estão listados em Ferramentas > Personalizar > Eventos.
'Por Grafeno: Como executar uma macro no Calc ao selecionar uma célula de uma área?
’ Testar se o objeto selecionado é uma célula individual
'If oCelula.ImplementationName <> “ScCellObj” Then Exit Sub
If Len(oCelula.AbsoluteName) >= 4 And Right(oCelula.AbsoluteName, 4) = “$j$11” Then
'Chamar a macro desejada
Call ThisComponent.getScriptProvider().getScript(“vnd.sun.star.script:Standard.CopiarColarSe?language=Basic&location=application”).invoke(Array(), Array(), Array())
End If
End Sub

Gravei a macro CopiarColarSe que altera o texto conforme o valor de J11 ( é muito extensa, por isso só indico o princípio e o final, porque a parte central é repetitiva ) :

Sub CopiarColarSe
Dim oDoc As Object
Dim oRegisto As Object
Dim oTabelas As Object
Dim i As Integer
Dim oRange As Object

oDoc = ThisComponent
oRegisto = oDoc.Sheets.getByName(“registo”)
oTabelas = oDoc.Sheets.getByName(“tabelas”)

’ Verificar se o valor de “J11” corresponde a um dos casos especificados
Select Case oRegisto.getCellRangeByName(“J11”).String
Case “110”, “111”, “112”, “113”, “114”, “115”, “116”, “117”, “118”, “119”, “120”, “121”, “122”, “210”, “211”, “212”, “213”, “214”, “215”, “216”, “217”, “218”, “219”, “220”, “221”, “222”, “310”, “311”, “312”, “314”, “315”, “316”, “317”, “321”, “322”, “410”, “411”, “412”, “414”, “415”, “416”, “417”, “421”, “422”, “514”, “515”, “522”
’ Continuar com a execução da macro
Case Else
MsgBox “COMBINAÇÃO INEXISTENTE”, vbExclamation
Exit Sub ’ Interromper a execução da macro
End Select

’ Limpar o conteúdo das células A14 a F100 na folha “registo”
oRange = oRegisto.getCellRangeByName(“A14:F100”)
oRange.clearContents(1023)

Select Case oRegisto.getCellRangeByName(“J11”).String
Case “110”
For i = 0 To 28
oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(0, 2 + i).String
oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(1, 2 + i).String
Next i
Case “111”
For i = 0 To 30
oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(2, 2 + i).String
oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(3, 2 + i).String ’ Copiar D3:D33 da folha “tabelas” e colar na folha “registo” a partir de A14
Next i
Case “112”
For i = 0 To 27
oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(4, 2 + i).String
oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(5, 2 + i).String ’ Copiar F3:F30 da folha “tabelas” e colar na folha “registo” a partir de A14
Next i
Case “113”
For i = 0 To 45
oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(6, 2 + i).String
oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(7, 2 + i).String ’ Copiar H3:H48 da folha “tabelas” e colar na folha “registo” a partir de A14
Next i
Case “114”
For i = 0 To 32
oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(8, 2 + i).String
oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(9, 2 + i).String ’ Copiar J3:J35 da folha “tabelas” e colar na folha “registo” a partir de A14
Next i

etc…etc…etc…

Next i
Case “522”
oRange.clearContents(1023)
For i = 0 To 22
oRegisto.getCellByPosition(1, 13 + i).String = oTabelas.getCellByPosition(92, 2 + i).String
oRegisto.getCellByPosition(0, 13 + i).String = oTabelas.getCellByPosition(93, 2 + i).String ’ Copiar CP3:CP25 da folha “tabelas” e colar na folha “registo” a partir de A14
Next i
End Select

' Centralizar o conteúdo das células A14 a A100 na folha "registo"
oRegisto.getCellRangeByName("A14:A100").HoriJustify = com.sun.star.table.CellHoriJustify.CENTER

' Alinhar à esquerda o conteúdo das células B14 a B50 e C14 a C50 na folha "registo"
oRegisto.getCellRangeByName("B14:B50").HoriJustify = com.sun.star.table.CellHoriJustify.LEFT
oRegisto.getCellRangeByName("C14:C50").HoriJustify = com.sun.star.table.CellHoriJustify.LEFT

End Sub

As minhas macros estão assim organizadas no meu Catálogo de objectos:

  • As minhas macros e caixas de diálogo: Standard→ Module1→ AlteredContentCell ( macro ):

  • Macros e diálogos da aplicação ( onde estão as macros base do sistema );

  • Base de dados.ods : gravarnotas ( macro ); limparcelulas ( macro ); Standard → CopiarColarSe
    ( macro ):

  • Sem titulo 1→ Standard ( vazio )

Quando executo a macro AlteredContentCell manualmente recebo este erro : Erro de execução do BASIC. O argumento não é opcional.
A linha do erro é esta : If Len(oCelula.AbsoluteName) >= 4 And Right(oCelula.AbsoluteName, 4) = “$j$11” Then. Já confirmei que é mesmo a célula J11, a qual tem este conteúdo: =J9&J10.
A dúvida é: registei a macro AlteredContentCell no local errado? Estará a linha de erro mal construida? Registei o evento mal? Terei que fazer outra macro?
A explicação é longa mas tentei detalhar para ajudar a identificar o problema.
Agradecia mais uma vez a vossa ajuda.
Obrigado

"$j$11” tem 5 caracteres, então acerte a linha para:

Right(oCelula.AbsoluteName, 5) = “$j$11” Then


Sugestão se a macro é exclusiva para este arquivo, salve a macro no arquivo, evita transferir o arquivo para outra maquina e não ter as macros.
.
Não sei dizer se sua macro esta correta, não sou programador, meu conhecimento é de juntar partes de macros, encontradas na internet.