Pergunte aqui
1

Macro em botões OK e Cancelar

perguntadas 2020-03-17 00:54:31 +0200

imagem do gravatar de lucasalves

updated 2020-03-21 12:27:27 +0200

imagem do gravatar de Schiavinatto

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

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

1

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

imagem do gravatar de ConradoConrado ( 2020-03-17 12:17:21 +0200 )editar
1

@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.

imagem do gravatar de SchiavinattoSchiavinatto ( 2020-03-17 14:36:06 +0200 )editar

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

imagem do gravatar de lucasalveslucasalves ( 2020-03-18 02:00:26 +0200 )editar
1

@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 ?

imagem do gravatar de SchiavinattoSchiavinatto ( 2020-03-18 02:49:52 +0200 )editar

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 ...(mais)

imagem do gravatar de lucasalveslucasalves ( 2020-03-18 05:34:46 +0200 )editar

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.

imagem do gravatar de SchiavinattoSchiavinatto ( 2020-03-18 12:59:48 +0200 )editar

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.

imagem do gravatar de lucasalveslucasalves ( 2020-03-19 02:53:10 +0200 )editar

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

https://wiki.documentfoundation.org/U...

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

imagem do gravatar de SchiavinattoSchiavinatto ( 2020-03-21 00:08:18 +0200 )editar

2 Respostas

2

respondidas 2020-03-18 12:47:48 +0200

imagem do gravatar de Conrado

updated 2020-03-19 17:21:11 +0200

@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.

editar assinalar como ofensivo Excluir Link mais

Comentários

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?

imagem do gravatar de lucasalveslucasalves ( 2020-03-19 03:22:10 +0200 )editar

Referencias para documentação:

https://ask.libreoffice.org/pt-br/que...

imagem do gravatar de SchiavinattoSchiavinatto ( 2020-03-20 23:11:51 +0200 )editar
0

respondidas 2020-03-20 23:07:04 +0200

imagem do gravatar de lucasalves

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.

3) 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.

editar assinalar como ofensivo Excluir Link mais

Comentários

@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/Ms...

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.

imagem do gravatar de ConradoConrado ( 2020-03-23 11:56:22 +0200 )editar

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.

imagem do gravatar de lucasalveslucasalves ( 2020-03-23 17:15:42 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2020-03-17 00:54:31 +0200

Lidas: 48 vezes

Última atualização: Mar 20