Macro em botões OK e Cancelar

Criei uma macro que insere novas aba e abre uma janela para renomeá-las, porém, quando clico em Cancelar, a aba é inserida do mesmo jeito. Queria que ao clicar em Cancelar, fosse excluída automaticamente ou perguntasse se desejo ou não excluir a aba. Já tentei algumas coisas, mas, sem sucesso. Alguém poderia me dar uma luz?

Segue o código:

sub Duplicar_e_Renomear
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
dim adicionar as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "DocName"
args1(0).Value = "Memória de Cálculo - Líquor Contagem e Dosagens(Não preenchida)"
args1(1).Name = "Index"
args1(1).Value = 32767
args1(2).Name = "Copy"
args1(2).Value = true

dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
adicionar = dispatcher.executeDispatch(document, ".uno:RenameTable", "", 0, args1())

end sub

C:\fakepath\Memória de Cálculo - Líquor Contagem e Dosagens(Não preenchida).ods

@lucasalves seja bem vindo. Como você inicia essa macro? Através de um acionamento de botão individual? ou através de um MsgBox?

@lucasalves, se puder postar um modelo deste arquivo, fica mais fácil a analise.

Se SIM, use Editar sua pergunta e com o ícone Clipe anexe o arquivo.

É através de um botão individual. Anexei o arquivos pra vocês olharem, por gentileza.

@lucasalves, esta Macro só esta Renomeando, e se clico em Cancelar não Renomeia, Cancela.

Só para entender: A finalidade e arquivar os Formulários preenchidos ?

Não, a finalidade é que ao clicar no botão Nova Adição, seja criado uma cópia da primeira aba (que no caso é a aba chamada 1ª Adição) logo após ela. Simultaneamente ao clicar no botão Nova Adição, que além de realizar essa cópia, automaticamente abriria também o campo para renomear aba de cópia, pois, o usuário dará sequência as adições posteriores, ou seja, (2ª Adição e depois 3ª Adição e assim sucessivamente), porém, se o usuário desistir de criar uma nova adição e clicar em cancelar, quero que seja excluído a aba que supostamente seria criada posteriormente. Então, resumindo, o botão Nova Adição fará duas ações: Criar uma cópia da aba anterior e abrir a janela para renomear a aba, mas, se o usuário não quiser clicar em OK para finalizar (supondo que o usuário tenha desistido da adição) e clicasse em cancelar, não seria criado uma cópia, somente cancelaria a ação ou excluiria a aba cópia, caso, ela tenha sido criada (como é o caso que está me acontecendo). Confundi ainda mais vcs? Rs

Esta parte de Criar e Renomear esta Ok.

Mas depois que Renomeou é Preenchido e impresso, e fica gravado no arquivo é isso ?

Se SIM não é necessário manter o Formulário arquivado, só os Dados, e uma tela de Consulta.

Exatamente, seria excelente uma tela de consulta, porém, sempre que é feito uma adição, o formulário é impresso e enviado ao setor de produção para dar sequencia, ai após os exames, voltam a verificar se precisa de nova adição. E assim vai até o final da produção.

Ola @lucasalves, posso ajuda-lo a melhorar o controle, entre em contato direto, veja aqui:

https://wiki.documentfoundation.org/User:Schiavinatto

Vou precisar de mais detalhes de como é usado o formulário.

@lucasalves

Segue procedimento alterado conforme pediu. Marque como Reposta correta para ajudar outros que procurarem o mesmo tipo de conteúdo.

Atualizado em 19/03/2020

    Sub CopySheet

    Dim oCurrentController As Object
    Dim oActiveSheet As Object
    Dim oSheets As Object
    Dim sText as String
    oCurrentController = ThisComponent.getCurrentController()
    oActiveSheet = oCurrentController.getActiveSheet()
    oSheets = ThisComponent.getSheets()
    sText = InputBox("Please enter a phrase:", "Dear User")
   
    If sText = "" Then
    	Exit Sub
    End if
    
    If MsgBox("A planilha," & Chr(10)  & Chr(10) & "'" & sText & "'" & Chr(10) & Chr(10) & "será criada. Continuar?", 1 + 32, "Confirmar Nome!") = 2 then
    	Exit Sub
    End If
    
    If oSheets.hasByName( sText) Then 'oActiveSheet.Name
        MsgBox ("Nome de Planilha," & Chr(10) & Chr(10) & "'" & oActiveSheet.Name & "'" & Chr(10)  & Chr(10)& "já existente." & Chr(10) & Chr(10) & "Escolha outro nome.", 45, "Cópia não realizada!")
    Else
        oSheets.copyByName(oActiveSheet.Name, sText, oSheets.Count + 1)
    End If

	dim document   as object
	dim dispatcher as object

	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())
    
End Sub

Copie e cole este procedimento como uma nova macro, e associe ela ao seu botão de comando.

Criado em 18/03/2020

Sub CopySheet

    Dim oCurrentController As Object
    Dim oActiveSheet As Object
    Dim oSheets As Object
    Dim sText as String
    oCurrentController = ThisComponent.getCurrentController()
    oActiveSheet = oCurrentController.getActiveSheet()
    oSheets = ThisComponent.getSheets()
    sText = InputBox("Please enter a phrase:", "Dear User")
    If MsgBox("A planilha," & Chr(10)  & Chr(10) & "'" & sText & "'" & Chr(10) & Chr(10) & "será criada. Continuar?", 1 + 32, "Confirmar Nome!") = 2 then
    	Exit Sub
    End If
    
    If oSheets.hasByName( sText) Then
        MsgBox ("Nome de Planilha," & Chr(10) & Chr(10) & "'" & oActiveSheet.Name & "'" & Chr(10)  & Chr(10)& "já existente." & Chr(10) & Chr(10) & "Escolha outro nome.", 45, "Cópia não realizada!")
    Else
        oSheets.copyByName(oActiveSheet.Name, sText, oActiveSheet.RangeAddress.Sheet + 1)
    End If

	dim document   as object
	dim dispatcher as object

	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())
    
End Sub
  1. sText = vai armazenar o nome da aba que deseja colocar mencionado no ImputBox.
  2. MsgBox1 = Vai questionar se deseja seguir com o nome mencionado. Caso “Cancela”, ele finaliza o procedimento sem alteração em sua planilha.
  3. MsgBox2 = Informa se o nome mencionado já é utilizado em seu arquivo. Se sim, ele finaliza o procedimento sem alteração em sua planilha.
  4. Se tudo estiver conforme, ele adiciona uma cópia da planilha ativa, na sequência da mesma, com o nome colocado no ImputBox.
  5. Por fim, salva o arquivo.

Caso precise que a nova aba seja limpa de certas informações, utilize o comando:

ThisComponent.Sheets.getbyName(sText).getCellRangebyName("A1:B2").ClearContents(7)

OBS.: Lembrando que: “A1:B2” será a range que precisa ser limpa. Altere e coloque quantas linhas dessas for necessário para seu uso.

Ficou muito bom!! Porém, queria que criasse sempre após a última aba criada, pois, ele está mantendo sempre a aba “1ª Adição” selecionada, e acaba não criando somente após ela.
Seria possível que assim que criasse e renomeasse, fosse selecionado automaticamente a aba que foi criada?
Outra coisa também é quando cria em branco, ou seja, sem ter renomeado nada, acaba dando erro ao tentar inserir a aba. Teria alguma forma de proteger isso? Que impedisse que o usuário desse OK com a sText em branco?

Referencias para documentação:

Vocês são demais! Não tenho como agradecer tamanha ajuda!
Se puder me dar mais uma ajuda, ia agradecer demais.

  1. Que linguagem é essa usada? Basic ou VBA? Não encontrei muito conteúdo, mas, quero estudar e aprender essa linguagem, pois, irei precisar bastante, visto que lá no meu trabalho só utilizaremos o Libreoffice agora.

2)ThisComponent.Sheets.getbyName(sText).getCellRangebyName("A1:B2").ClearContents(7)

Esse comando não funcionou, mesmo eu trocando as células do range para adaptar a minha planilha, só me retorna erro, e seria muito interessante usá-lo, pois, é de muita utilidade.

  1. Esse comando abaixo tentei adaptá-lo da seguinte forma:

    If sText = “” Then
    Exit Sub
    End if

Tentei adicionar um MsgBox que até funcionou, mas, me retorna a mensagem mesmo eu clicando em cancelar.

If sText = "" Then
        MsgBox ("Não é permitido inserir uma adição em branco", "ERRO")
        Exit Sub
    End if

Se clico em cancelar, a mensagem ainda aparece. Tentei usar algumas lógicas, porém, sem sucesso. Alguma sugestão?

Mais uma vez agradeço a disposição e boa vontade de vcs em ajudar. Quero aprender essa linguagem também e cooperar da mesma forma que vocês.

@lucasalves , vamos lá.

Sem pre que for colocar uma MsgBox como parâmetro de teste, você deve comparar com comando IF, o retorno ao clicar no botão.

O seguinte link trás mais detalhes

https://help.libreoffice.org/Basic/MsgBox_Function_Runtime

A respeito do comando:

ThisComponent.Sheets.getbyName(sText).getCellRangebyName("A1:B2").ClearContents(7)

Você precisa colocar ele após o comando de inserir a nova planilha, ou seja, antes do comando de salvar o arquivo.
Sobre a linguagem, é o Basic do LO que estou utilizando. O link que o @schiavinatto postou no comentário acima, contém mais informações. Independente da linguagem, o principal é entender como deve funcionar a Lógica de Programação. Te sugiro iniciar seus estudo por ai antes de qq linguagem.

Certo, vou estudar melhor a questão do MsgBox como parâmetro, não cheguei nesse ponto ainda.

Tenho estudado a Lógica de Programação, porém, minha atual situação exige que eu tenha isso pronto o quanto antes, é para empresa de saúde que trabalho.

O comando:

ThisComponent.Sheets.getbyName(sText).getCellRangebyName("A1:B2").ClearContents(7)

Sempre me retorna esse erro, não consigo implementar.

Erro de execução do BASIC.
Ocorreu uma exceção
Type: com.sun.star.container.NoSuchElementException
Message: .

Uma outra dúvida é saber se quando a macro adiciona a aba seguinte, ela pode se tornar a ativa?

Obrigado mais uma vez.

Oi Lucas.
Complementando a solução do CONRADO sobre a sua dúvida em

ThisComponent.Sheets.getbyName(sText).getCellRangebyName("A1:B2").ClearContents(7)

Atente que sText é o nome da ABA da PLANILHA onde você quer fazer a limpeza.
Acrescento que no lugar do (7) você pode usar os seguintes números, dependendo do que você quer limpar:

1 = apaga apenas NÚMEROS

2 = apaga apenas DATAS

4 = apaga apenas TEXTOS

8 = apaga apenas ANOTAÇÕES

16 = apaga apenas FÓRMULAS

32 = apaga apenas FORMATOS

64 = apaga apenas ESTILOS

Ou seja, (7 = 1+2+4) apagará apenas os valores (datas, textos e números) digitados, preservando fórmulas, anotações e formatos. Para limpar tudo, use (127)