Macro para Copiar uma planilha de um arquivo e inserir no atual

Consegui chegar ate aqui, mas tem erro.
Alguém poderia corrigir.

Sub InserirPlanilha2()
    Dim oDesktop as Object
    Dim oDoc as Object
    Dim oSheet as Object
    
    'Abrir o arquivo desejado
    oDesktop = createUnoService("com.sun.star.frame.Desktop")
    oDoc = oDesktop.loadComponentFromURL("file:///C:/PASTAS/Arquivo.ods", "_blank", 0, Array())
    
    'Obter a planilha desejada
    oSheet = oDoc.Sheets.getByName("COMBAE")
    
    'Copiar a planilha
    oSheet.Copy '<=================ERRO AQUI
    
    'Fechar o arquivo
    oDoc.Close(True)
    
    'Selecionar a planilha atual no arquivo atual
    ThisComponent.CurrentController.ActiveSheet = ThisComponent.Sheets(0)
    
    'Colar a planilha copiada
    ThisComponent.CurrentController.ActiveSheet.Paste
    
    'Salvar o arquivo atual
    ThisComponent.store()
End Sub

Macro com correções comentada.

Sub InserirPlanilha2()
    Dim oDesktop as Object
    Dim oDoc as Object
    Dim oSheet as Object
    Dim sFile$, sName$
    
	sName$ = "COMBAE"
	sFile$ = ConvertToUrl("file:///C:/PASTAS/Arquivo.ods")
    
    'Abrir o arquivo desejado
    oDesktop = createUnoService("com.sun.star.frame.Desktop")
   	oDoc = oDesktop.loadComponentFromURL(sFile, "_blank", 0, Array())
    
    'Obter a planilha desejada (inutilizado)
    'oSheet = oDoc.Sheets.getByName("COMBAE")
    
    'Copiar a planilha - Método Copy não existe.
    'Correto - copyByName(nome de origem, novo nome, posição) - USANDO PARA MESMA PLANILHA/ARQUIVC
    'Para importar planilha, MAIS ADEQUADO .importSheet(Doc As Object, nome$, posição%)
    'Ajuda: https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1sheet_1_1XSpreadsheets2.html#ade8debfe571f282d6bf0ded0e94fcc34
    
    'oSheet.Copy '<=================ERRO AQUI
    'Sempre bom verificar se existe o nome para não causar erro indesejado
    If oDoc.Sheets.hasByName( sName ) Then
    	ThisComponent.Sheets.importSheet(oDoc, sName, ThisComponent.Sheets.getCount() )
    	
    	'Selecionar a planilha atual no arquivo atual
    	ThisComponent.CurrentController.ActiveSheet = ThisComponent.Sheets(0)
    Else
    	MsgBox("Planilha não existe.", 0, "Oops")
    End If
    
    'Fechar o arquivo
    oDoc.Close(True)
        
    'Colar a planilha copiada (inutilizado)
    'ThisComponent.CurrentController.ActiveSheet.Paste
    
    'Salvar o arquivo atual
    ThisComponent.store()
End Sub

Olá @FelipeAle, respondeu perfeitamente a pergunta. Obrigado.

Mas, necessito que a planilha sobreponha a de mesmo nome, tem formulas e não posso deletar a planilha para reinserir, as formulas geram erro.

Abusando de seu conhecimento, é possível sobrepor a planilha.
Grato.

1 Like

Talvez.
.
O LibO insere automaticamente um índice ao final do nome, caso o nome da aba seja igual a quaisquer nomes das outras abas. Então, o que daria para fazer é remover e inserir nova.
Método suportados:


.
Não há exemplos nas documentações para substituição em planilhas. Mas encontrei o método na página de api do LibO.
## replaceByName
.
Preciso de tempo para testar. Não sei se será possível.

@FelipeAle ,
Supondo que não de, pensei no seguinte: Não posso Remover para reinserir, as formulas dependentes perdem a referencia e geram erros.
Mas sabendo que foi gerada uma nova planlha_2, posso copia-la e colar na planilha e deletar a planilha_2. Desta maneira não perderia as formulas.
Creio que já é uma saída alternativa.
Volto a agradecer, Obrigado.


algum tempo depois


OK, deu certo como descrevi acima.

1 Like