Olá comunidade.
Tenho um modelo de planilha de uso frequente. Este modelo NÃO deve ser alterado pelo usuário comum.
Preenchidos os dados, o usuário deverá gerar um arquivo (cópia) SECUNDÁRIO. Ou até, mais que um arquivo secundário na mesma leva de operações.
Depois de concluída a tarefa, deve fechar o ARQUIVO BASE, SEM SALVAR as alterações:
Para isso usei o seguinte código (que já fica aqui para quem precisar):
' Obtém a Pasta e Arquivo atuais
AbaDados = Doc.Sheets.getByName("Dados")
Pasta = AbaDados.getCellRangeByName("B7").String
If Pasta = "" then
Dim Atributo
GlobalScope.BasicLibraries.LoadLibrary("Tools")
Atributo() = Doc.getArgs()
Past0 = DirectoryNameoutofPath( Atributo(0).Value , "/")
Pasta = ConvertFromUrl (Past0) & "\"
End If
Pasta = InputBox ( "Informe a Pasta para salvamento" , "Algoritmos JEDI" , Pasta)
If Pasta = "" then : Exit Sub : End If
If Mid(Pasta, Len(Pasta)) <> "\" then
Pasta = Pasta & "\"
End If
' Obtém o nome do arquivo
Arq = AbaDados.getCellRangeByName("B8").String
If Arq = "" then
Fram = Doc.CurrentController.Frame.Title()
Arq = Left(Fram , InStr(Fram, ".ods") + 3 )
End If
Arq = InputBox ( "Informe o nome do Arquivo" , "Algoritmos JEDI" , Arq)
If Arq = "" then : Exit Sub
ElseIf InStr(Arq, ".ods") = False Then
Arq = Arq & ".ods"
End If
' Grava em DADOS a identificação do arquivo
AbaDados.getCellRangeByName("B7").String = Pasta
AbaDados.getCellRangeByName("B8").String = Arq
' Grava um arquivo com o nome indicado
NArq = ConvertToUrl( Pasta & Arq)
Dim Args As New com.sun.star.beans.PropertyValue
Args.Name = "FilterName"
Args.Value = "Calc8"
Doc.StoreToUrl(NArq , Array(Args()) )
Fechar = MsgBox ("O novo arquivo " & uCase(Arq) & CHR(10) & _
"foi gravado na pasta " & CHR(10) & _
Pasta & CHR(10) & _
"Deseja fechar o presente arquivo-base? " & CHR(10) _
, 48 , "Algoritmos JEDI")
E aqui começam os problemas. Sei que é um problema já conhecido. Porém, pode ser que alguém tenha encontrado uma solução.
Para fechar o arquivo usei inicialmente esse código:
Primeira tentativa:
If Fechar = 6 then : ThisComponent.close(true) : End If
Quando uso isso em um Módulo diferente do restante do código, funciona bem.
Mas obviamente esta solução seria um “remendo” grosseiro que gostaria de evitar.
Quando ele está incorporado no módulo do conjunto, com as outras MACROS usadas no sistema, dá ERRO GRAVE (Fecha o LO com aviso de recuperação. Ao abrir de novo o LO, entra em um LOOP, sendo necessário CTRL+ALT+DEL para “finalizar” artificialmente a execução).
Tentei fazer isso (Segunda tentativa):
If Fechar = 6 then'
If HasUnoInterfaces(Doc, "com.sun.star.util.XCloseable") Then
ThisComponent.close(true)
Else
ThisComponent.dispose()
End If
End If
E também isso (Terceira tentativa):
If Fechar = 6 then'
If HasUnoInterfaces(Doc, "com.sun.star.util.XCloseable") Then
ThisComponent.close(true)
Else
ThisComponent.dispose()
End If
stardesktop.terminate
End If
E, por fim, recorri às chamadas UNO (que queria evitar) - Quarta tentativa:
If Fechar = 6 then
Ctrl = ThisComponent.CurrentController.Frame
Servico = createUnoService("com.sun.star.frame.DispatchHelper")
Servico.executeDispatch(Ctrl, ".uno:CloseDoc", "", 0, Array())
End If
Isso até (meio que) funcionou. Com o inconveniente de perguntar para o usuário se deseja FECHAR SEM SALVAR, o que gera alguma confusão, pois alguém inexperiente poderá supor que perderá os arquivos SECUNDÁRIOS que criou. Além disso, corre-se o risco de, por erro, o usuário salvar as alterações NO ARQUIVO BASE, comprometendo futuras operações.
Porém, se houver alguma outra planilha aberta no momento (o que é bem comum no nosso caso), ocorrerá aquele ERRO GRAVE também.
Alguém sabe a solução?