[Résolu][Calc] Copie d'une feuille dans un nouveau classeur

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
Mobydick_62
Membre OOrganisé
Membre OOrganisé
Messages : 78
Inscription : 07 avr. 2011 12:04
Localisation : Vendée (France)

[Résolu][Calc] Copie d'une feuille dans un nouveau classeur

Message par Mobydick_62 »

Bonjour à tous.
Malgré une longue recherche je n'ai malheureusement pas trouvé réponse à mon problème.
Mon problème est le suivant:
Depuis un fichier Calc (source), je crée un nouveau fichier Calc en y insérant l'une des feuilles de mon fichier source.
Jusqu'ici pas de problème. Par contre je veux donner un nom à mon nouveau fichier Calc et là, c'est le document source qui est renommé. De toute évidence si mon nouveau fichier est bien le premier visible à l'écran, il n'est pas activé. Malgré mes recherche je n'arrive pas à solutionner mon problème.
Je joins un fichier exemple avec ma macro.
Merci d'avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 08 juil. 2012 21:56, modifié 2 fois.
Raison : Suppression de Calc dans le titre. + Balise [Résolu] et la coche dans le titre du premier message
Libre Office Version: 7.0.4 (x64)
SE Windows 10
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc] Copie d'une feuille dans un nouveau Calc

Message par Churay »

Bonjour,
Mobydick_62 a écrit :Par contre je veux donner un nom à mon nouveau fichier Calc et là, c'est le document source qui est renommé. De toute évidence si mon nouveau fichier est bien le premier visible à l'écran, il n'est pas activé.
Ton soucis vient effectivement de l'activation des fichiers. Via l'API, le code a de grandes chances d'être plus compact qu'avec le dispatcher utilisé par l'enregistreur.

Procédure :
- ouvrir le fichier source et lancer la macro qui
- sélectionne la zone à copier (la totalité de la feuille est efficace, certes... mais radicale ;))
- créer un fichier vide (il est actif)
- sélectionne la feuille de réception dans le nouveau fichier
- y copie la sélection précédente
- donne un nom et sauvegarde via .storeAsURL.

A ce stade c'est le fichier cible qui est activf, pour revenir sur la source, il suffit de sélectionner avec thisComponent.select(oObjet : oObjet étant une feuille, une cellule ou une plage de cellules de la source, pour que cette sélection soit active et donc le document source.

Plusieurs exemples sur le forum sont disponibles pour ce faire.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Copie d'une feuille dans un nouveau Calc

Message par luky-luke »

Bonjour,

Vite fait, en sortant d'une sieste estivale, et entièrement dans la langue de Shakespear (sauf les commentaires) pour ne choquer personne :wink:

Code : Tout sélectionner

Option Explicit
Sub Main
Dim MySheet As Object, NewSheet As Object
Dim SourceArea As Object, TargetArea As Object
Dim NewDoc As String, DisplaySource As Object
Dim MyFileName As String, addressDoc As String 

Mysheet = ThisComponent.Sheets(2) 'Le document Actif feuille 3
ThisComponent.CurrentController.ActiveSheet = MySheet
SourceArea = Mysheet.GetCellRangeByName("A1:F14") 'La zone à copier

NewDoc = "private:factory/scalc" 'Création d'un nouveau document
DisplaySource = StarDesktop.LoadComponentFromURL(NewDoc,"_blank",0,array())

MyFileName = "NewDoc.ods" 'Le Nom du nouveau document
'addressDoc = convertToURL("C:\NouveauDoc.ods" + MyFileName) ' et son adresse 
addressDoc = convertToUrl ("/home/luky-luke/Bureau/" + MyFileName) ' et son adresse 

NewSheet = DisplaySource.Sheets(2) ' Choix de la nouvelle feuille
DisplaySource.CurrentController.ActiveSheet = NewSheet 
TargetArea = NewSheet.GetCellRangeByName("A1:F14") 'La zone ou l'on copie
TargetArea.DataArray = SourceArea.DataArray 'La copie

DisplaySource.storeAsUrl(addressDoc,array()) 'l'enregistrement avec le nom

End Sub
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
Mobydick_62
Membre OOrganisé
Membre OOrganisé
Messages : 78
Inscription : 07 avr. 2011 12:04
Localisation : Vendée (France)

Re: [Calc] Copie d'une feuille dans un nouveau Calc

Message par Mobydick_62 »

Bonjour et merci à vous de m''avoir répondu rapidement.
Comme dit Churay : "copier la totalité de la feuille est efficace, certes... mais radicale". Mais l'avantage est que ma feuille cible est complètement identique à ma feuille source. Elle garde toutes les mises en formes (largeur colonnes, hauteur lignes, police de caractères.....ect...).

J'ai repris le code de luky-luke qui fonctionne très bien puisque j'arrive à nommer mon nouveau fichier calc là où je veux. Par contre le code repose sur la copie d'une zone de cellule. Dans le principe c'est parfait mais le problème est que dans mon nouveau classeur je perd toutes les mises en formes de ma feuille source.(largeur colonnes, hauteur lignes, police de caractères.....ect...).

En lisant le livre : Programmation OpenOffice.org 3 l'auteur dit, je cite "Si votre classeur comporte une feuille parfaitement formatée et remplie, il est avantageux de créer une feuille en faisant une copie de la première." Mais son exemple repose sur la copie d'une feuille et le collage dans un même classeur. C'est ce que je voudrais faire mais dans un nouveau classeur.

En reprenant le code de luki-luke, peut être est t'il possible de copier/collier une plage de cellule en gardant leurs mise en forme ?????? Je vais chercher. :fou:
Libre Office Version: 7.0.4 (x64)
SE Windows 10
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
Messages : 3028
Inscription : 30 avr. 2011 23:08
Localisation : Casablanca (Maroc)

Re: [Calc] Copie d'une feuille dans un nouveau Calc

Message par alhazred »

Bonjour à tous,

Utilisation exceptionnelle du dispatcher... pour copier la totalité de la feuille avec un code sans complications inutiles, pour conserver tous les formatages, ainsi que les dimensions de cellules.

Code : Tout sélectionner

REM  *****  BASIC  *****

Option Explicit

Sub Main
	Dim sourceDoc As Object, sourceSheet As Object
	Dim destDoc As Object, destSheet As Object, destURL As String
	      
	sourceDoc = thisComponent
	sourceSheet = sourceDoc.sheets.GetByName("Feuille2")
	
	destDoc = StarDesktop.LoadComponentFromURL("private:factory/scalc","_blank",0,array())
	destSheet = destDoc.sheets.GetByName("Feuille3")
	
	CopySheet sourceDoc,sourceSheet, destDoc,destSheet
	
	destURL = "J:\nouveau_classeur.ods" 'à modifier bien sûr
	destURL = ConvertToURL(destURL)
	destDoc.StoreAsUrl(destURL,array())
End Sub

Sub CopySheet(sourceDoc,sourceSheet, destDoc,destSheet)
	Dim dispatcher As Object, sourceController As Object, destController As Object
	
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	sourceController = sourceDoc.currentController
	sourceController.Select sourceSheet
	dispatcher.executeDispatch(sourceController.frame, ".uno:Copy", "", 0, Array())
	
	destController = destDoc.currentController
	destController.Select destSheet
	dispatcher.executeDispatch(destController.frame, ".uno:Paste", "", 0, Array())
End Sub
luky-luke a écrit :entièrement dans la langue de Shakespear (sauf les commentaires) pour ne choquer personne :wink:
Je ne comprends pas l'allusion :lol:
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
Avatar de l’utilisateur
Mobydick_62
Membre OOrganisé
Membre OOrganisé
Messages : 78
Inscription : 07 avr. 2011 12:04
Localisation : Vendée (France)

Re: [Calc] Copie d'une feuille dans un nouveau classeur

Message par Mobydick_62 »

Bonsoir à tous,
Merci alhazred pour ton aide. C'est exactement ce que je recherchais. :bravo:
Je passe donc en résolu.
Libre Office Version: 7.0.4 (x64)
SE Windows 10