[Résolu] [Calc] Copie de cellules d'une feuille à une autre

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 !
boogie
Fraîchement OOthentifié
Messages : 5
Inscription : 15 sept. 2007 22:55

[Résolu] [Calc] Copie de cellules d'une feuille à une autre

Message par boogie »

Bonjour,
J'ai bien envie de me mettre à la programmation... en me posant un petit "défi", mais depuis plusieurs jours, j'essaie... et je ne comprends pas grand chose !
Je souhaiterai copier 4 cellules séparer sur une même ligne (sélectionnée) sur une autre feuille à la suite des lignes déjà écrites.
J'ai trouvé "GoDownToEndOfData" et "CellAddress"
mais je n'arrive pas à l'exploiter !
Merci
2.2.0 sous Windows Vista
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

Bonjour et bienvenue sur ce forum

Effectivement le forum comprend déjà les éléments pour réaliser ce que tu veux faire.

Pour comprendre le mieux est de partir de ce que nous faisons "manuellement" : nous commençons par sélectionner la plage (une ou plusieurs cellules) que nous voulons copier, nous copions, puis nous sélectionnons l'endroit où nous voulons coller et nous collons.

Cet endroit de "destination" est en fait une cellule, même si la plage copiée comprend plusieurs cellules. Cette cellule dispose d'une "adresse" : n° de la feuille dans laquelle elle se trouve, numéro de colonne, numéro de ligne.

Nous avons donc des "objets" inclus dans les autres : un classeur, une feuille, une cellule, une adresse de cellule, elle-même décomposée.

Par ailleurs, toujours "manuellement", comment faisons-nous pour trouver la dernière cellule saisie ? Nous utilisons une sorte "d'outil" qui se "déplace" comme un curseur dans la feuille en appuyant par exemple sur Ctrl+Fin.

Nous retouvons toutes ces notions dans l'exemple de code ci-dessous.

Code : Tout sélectionner

sub ExoCopierSelectionFinFeuille
dim ExoClasseur as Object, ExoFeuilleDep as Object, ExoFeuilleArr as object
dim ExoCellCursor as object, ExoCellRangeAddress as object
dim ExoPlageACopier as object, ExoCellArr as object
dim ExoDebCol as integer, ExoDebLig as integer, ExoFinCol as integer, ExoFinLig as integer
dim ExoNumFeuilleDep as integer

'Le document courant
ExoClasseur = thisComponent			

'Ce document comprend une "collection" de feuilles"
'Dans cette collection accéder par son nom à une feuille en particulier 
'(la feuille où on veut coller)
ExoFeuilleArr = ExoClasseur.Sheets.getByName("factures")

'Accéder à la sélection courante (ce que l'on copie)
ExoPlageACopier = ExoClasseur.CurrentSelection

'La sélection a une "adresse" (feuille, n° de col. et de ligne)
'Obtenir le numéro de feuille 
ExoNumFeuilleDep = ExoPlageACopier.RangeAddress.Sheet

'On "remonte" de la sélection à la feuille grâce au numéro de feuille
ExoFeuilleDep = ExoClasseur.sheets.getByIndex(ExoNumFeuilleDep)

'Création d'un "outil" permettant de se déplacer dans la feuille d'arrivée
'Pour trouver la dernière cellule utilisée
ExoCellCursor = ExoFeuilleArr.createCursor()

'Déplacement de cet "outil" au début de la feuille sans sélectionner (false)
ExoCellCursor.gotoStartOfUsedArea(False)
'Déplacement à la fin de la feuille en sélectionnant (True)
ExoCellCursor.gotoEndOfUsedArea(true)

'Obtenir l'adresse de la plage obtenue
ExoCellRangeAddress = ExoCellCursor.getRangeAddress()

'Obtenir les infos. numéro de colonne de début et de fin
ExoDebCol=ExoCellRangeAddress.StartColumn
ExoFinLig =ExoCellRangeAddress.EndRow
'Les informations suivantes seraient aussi disponibles (mais inutiles ici)
'ExoDebLig =ExoCellRangeAddress.StartRow
'ExoFinCol=ExoCellRangeAddress.EndColumn

'La cellule où on colle est dans la première colonne de la plage une ligne après
ExoCellArr = ExoFeuilleArr.getCellByPosition(ExoDebCol, ExoFinLig + 1)

'Copie de la sélection au bon endroit
ExoFeuilleDep.copyrange(ExoCellArr.cellAddress, ExoPlageACopier.rangeAddress)

end sub
Nota :
  • Ce code part de ce que tu décris (une ligne sélectionnée)
  • Il fonctionne également si tu sélectionnes une plage de cellules contiguës
  • Il produirait une erreur sur une sélection de celllules non contiguës
  • Il produirait une erreur sur une sélection d'autres objets (graphiques, etc.)
Ces erreurs pourraient bien sûr être gérées mais si tu te lances dans la programmation... il vaut mieux aller pas à pas :)
boogie
Fraîchement OOthentifié
Messages : 5
Inscription : 15 sept. 2007 22:55

Message par boogie »

Merci, j'ai compris le code et j'ai réussi à copier des cellules non contiguës sur une autre feuille.
Voici mon code (sans la déclaration des variables que tu as déjà donné) :

Code : Tout sélectionner

'Le document courant
Classeur = thisComponent         

'Ce document comprend une "collection" de feuilles"
'Dans cette collection accéder par son nom à une feuille en particulier
'(la feuille où on veut coller)
FeuilleArr = Classeur.Sheets.getByName("Feuille d'arrivée")

'La cellule active
CellDep=Classeur.CurrentSelection
	
'Vérifie si la sélection est bien une cellule
if not CellDep.SupportsService("com.sun.star.sheet.SheetCell") then
	msgbox "La sélection ne doit contenir qu'une cellule !"
	exit sub
end if

'Obtenir le numéro de feuille
NumFeuilleDep = CellDep.RangeAddress.Sheet
'Obtenir le numéro de la ligne
NumLigneDep = CellDep.RangeAddress.StartRow
'Obtenir les numéros des colonne à copier
ColonneCellDep = CellChequeDep.RangeAddress.StartColumn
ColonneCellAutreDep = CellDep.RangeAddress.StartColumn + 3

'Adresse de la cellule sélectionnée
   With AdresseCell
       .Sheet = NumFeuilleDep
       .StartColumn = ColonneCellDep
       .StartRow = NumLigneDep
       .EndColumn = ColonneCellDep
       .EndRow = NumLigneDep
   End With
'Adresse de l'autre cellule à copier
   With AdresseAutre
       .Sheet = NumFeuilleDep
       .StartColumn = ColonneCellAutreDep
       .StartRow = NumLigneDep
       .EndColumn = ColonneCellAutreDep
       .EndRow = NumLigneDep
   End With

'On "remonte" de la sélection à la feuille grâce au numéro de feuille
FeuilleDep = Classeur.sheets.getByIndex(NumFeuilleDep)

'Création d'un "outil" permettant de se déplacer dans la feuille d'arrivée
'Pour trouver la dernière cellule utilisée
CellCursor = FeuilleArr.createCursor()

'Déplacement de cet "outil" au début de la feuille sans sélectionner (false)
CellCursor.gotoStartOfUsedArea(False)
'Déplacement à la fin de la feuille en sélectionnant (True)
CellCursor.gotoEndOfUsedArea(true)

'Obtenir l'adresse de la plage obtenue
CellRangeAddress = CellCursor.getRangeAddress()

'Obtenir les infos. numéro de colonne de début et de fin
DebCol=CellRangeAddress.StartColumn
FinLig =CellRangeAddress.EndRow
'Les informations suivantes seraient aussi disponibles (mais inutiles ici)
'DebLig =CellRangeAddress.StartRow
'FinCol=CellRangeAddress.EndColumn

'Adresse des cellules d'arrivée
'colonne 1 et 2 de la dernière ligne
CellArr = FeuilleArr.getCellByPosition(0, FinLig + 1)
CellAutreArr = FeuilleArr.getCellByPosition(1, FinLig + 1)

'Copie de la sélection au bon endroit
FeuilleDep.copyrange(CellArr.cellAddress, AdresseCell)
FeuilleDep.copyrange(CellAutreArr.cellAddress, AdresseAutre)

'Colorier la cellule copiée trouvé avec l'enregistreur de macro
dim document   as object
dim dispatcher as object

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

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "BackgroundColor"
args1(0).Value = 16777164

dispatcher.executeDispatch(document, ".uno:BackgroundColor", "", 0, args1())
Voilà, je ne sais pas si c'est la méthode la plus efficace... mais ça marche :)
D'où la suite dans mon apprentissage :
Pour l'instant, il faut sélectionner la cellule, puis exécuter la macro. Ca se fait bien avec un bouton ou un raccourci, mais est-ce qu'il ne serait pas possible de faire l'inverse :
Activer la macro, cliquer sur toute les cellules à copier puis désactiver la macro ?

Encore merci, le basic commence à s'ouvrir à moi !
2.2.0 sous Windows Vista