[Calc] Manipuler une feuille

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
Zelada
InconditiOOnnel
InconditiOOnnel
Messages : 930
Inscription : 27 févr. 2013 14:55

[Calc] Manipuler une feuille

Message par Zelada »

Bonjour

Ayant eu besoin de créer une macro qui reprend différentes procédures que l'on peut voir sur ce forum et dans le livre de programmation, je me permets de vous la présenter.

Si cela peut servir


Le but de la macro :
copier une zone figurant dans une feuille et la coller dans une autre feuille qui doit être vierge de toutes données
à un endroit précis, supprimer une ligne, insérer une colonne, lui donner un format date, copier une colonne dans une autre colonne, définir une largeur optimale pour une colonne, faire un tri sur la première colonne et positionner le curseur dans la cellule A1

***********************
Pour éviter des erreurs, utilisation d’une déclaration optionnelle, obligeant de déclarer toute variable utilisée

Code : Tout sélectionner

Option explicit
DECLARATION DES VARIABLES

Code : Tout sélectionner

Sub Copier

Dim monDocument as object, lesFeuilles as Object, maFeuille as object, maCellule as object
Dim maZone as object
Dim gomme as long
Dim fDepart as object, fArriv as Object
Dim zDepart as object, cArriv as Object
Dim lesLignes as object, uneLigne as object
Dim lesCols as object, uneCol as object
Dim zone_depart as object, zone_arriv as object
Dim NumberFormats As Object
Dim NumberFormatString As String 
***************************
ACCEDER AU DOCUMENT

Code : Tout sélectionner

monDocument = ThisComponent
	lesFeuilles = monDocument.Sheets
*******************
SUPPRIMER LIGNES
Indiquer sur quelle feuille on travaille et sur quelle zone
et supprimer toutes les données

Code : Tout sélectionner

	
      maFeuille = lesFeuilles.getByName("ETAT")
	maZone = maFeuille.getCellRangeByName("A6:Z2008")
    lesLignes = maZone.Rows
    lesLignes.removeByIndex(0,2002) 'suppression des lignes
**************************
COPIER LES CELLULES
Indiquer la feuille et la zone qui devra être copiée
Indiquer la feuille et la zone où sera faite la copie
Faire la copie

Code : Tout sélectionner

 'copier cellules
   fDepart = lesFeuilles.getByName("BASE")
   zDepart = fDepart.getCellRangeByName("A4:Y2006")
   
   fArriv = lesFeuilles.getByName("ETAT")
   cArriv = fArriv.getCellRangeByName("A6")
   
   fArriv.copyRange(cArriv.CellAddress, zDepart.RangeAddress)
 
*********************************

SUPPRIMER UNE LIGNE
Indiquer la zone pour laquelle on désire supprimer une ligne
On obtient une collection de lignes grâce à la propriété Rows de l’objet zone
La méthode remobeByIndex de l’objet collection de lignes supprime 1 ligne dans la deuxième ligne de maZone
Rappel 0 = ligne 1 , 1 = ligne2 etc..

Code : Tout sélectionner

   'supprimer ligne 7
   maZone =  maFeuille.getCellRangeByName("A6:Y2008")
   lesLignes = maZone.Rows
   lesLignes.removeByIndex(1,1) 'suppression de la deuxième ligne 
************************
INSERER UNE COLONNE
Indiquer la zone pour laquelle on désire insérer une colonne
On obtient une collection de colonnes grâce à la propriété Columns de l’objet zone
La méthode insertByIndex de l’objet collection de colonnes insère 1 colonne dans la première colonne de maZone
Rappel 0 = colonne A , 1 = colonne B etc..

Code : Tout sélectionner

  'insérer une colonne en A
   maZone =  maFeuille.getCellRangeByName("A6:Y2008")
   lesCols = maZone.Columns
   lesCols.insertByIndex(0,1) 'insertion colonne en A 
   maZone.Columns.width = 3160
******************

FORMATER LES CELLULES EN DATE
Indiquer la zone pour laquelle on désire donner un format
utiliser la propriété NumberFormat
Astuce : pour connaître le numéro à indiquer (clé) utiliser l’enregistreur de macros
Ici nous aurons un format date sous JJ/MM/AAAA

Code : Tout sélectionner

   'format date pour la colonne A  
   maZone =  maFeuille.getCellRangeByName("A6:A2008")
   NumberFormats = monDocument
   maZone.NumberFormat = 30

**********************

COPIER /COLLER LES VALEURS D’UNE ZONE
Indiquer la zone départ et la zone arrivée
Utiliser la propriété DataArray

Code : Tout sélectionner

 	'copie colonne Y en 1ère colonne   	
    zone_depart = maFeuille.getCellRangeByName("Y6:Y2008")
    zone_arriv = maFeuille.getCellRangeByName("A6:A2008")
    zone_arriv.DataArray = zone_depart.DataArray
**************************

MASQUER DES COLONNES
Indiquer la zone dans laquelle on travaille
On obtient une collection de colonnes grâce à la propriété Columns de l’objet zone
On met false à la propriété isVisible

Code : Tout sélectionner

    'masquer colonnes
      maZone =  maFeuille.getCellRangeByName("W1:Y1048576")
    maZone.Columns.IsVisible = False

*************************

DONNER UNE LARGEUR OPTIMALE A UNE COLONNE
Rappel : columns(1) est égal à la première colonne

Code : Tout sélectionner

   	'largeur colonnes
   	
   thiscomponent.sheets.getByName("ETAT").columns(1).OptimalWidth=true
   
***********************

APPEL D’UNE AUTRE PROCEDURE
Call suivi du nom de la macro
Voir plus bas la procédure du même nom

Code : Tout sélectionner

    Call ExoTrier

********************

POSITIONNER LE CURSEUR EN A1

Code : Tout sélectionner

   MaCellule = MaFeuille.getCellRangeByName("A1")    
    MonDocument.CurrentController.select(MaCellule)


FIN DE LA PROCEDURE

Code : Tout sélectionner

End Sub
'*********************************************
Procédure qui est appelée dans la macro précédente

TRIER UNE ZONE SUR LA PREMIERE COLONNE PAR ORDRE CROISSANT

Code : Tout sélectionner

sub ExoTrier
dim ExoClasseur as Object, ExoFeuille as Object, ExoPlage as Object
Dim ExoConfigTri(0) as new com.sun.star.table.TableSortField
Dim ExoDesc(1) As New com.sun.star.beans.PropertyValue

ExoClasseur = thisComponent                           'Le classeur courant
ExoFeuille = ExoClasseur.sheets.getByName("ETAT")      'Accès à une feuille par son nom
ExoPlage = ExoFeuille.getCellRangeByName("A6:AH2008")         'Accès à une plage
ExoConfigTri(0).Field=0                              'Tri sur la colonne  A
ExoConfigTri(0).IsAscending=true


ExoDesc(0).name="SortFields"
ExoDesc(0).value=ExoConfigTri()
ExoDesc(1).name="ContainsHeader"
ExoDesc(1).value=true
ExoPlage.Sort(ExoDesc())

end sub

et voilà

en pièce jointe, le fichier avec la macro

Qui a dit que je pourrais devenir accro ? :lol:

A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 3.6.5.2 (version imposée) sous Windows XP SP3 au bureau
steph A
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 09 mars 2012 14:34

Re: [Calc] Manipuler une feuille

Message par steph A »

Bonjour Zelada,

Moi je dis que tu deviens accro :D

Je ne sais pas si ça peut servir mais, pour rebondir sur ta dernière macro de tri, moi je me suis fait celle-ci :

Code : Tout sélectionner

Sub TriSelon3Colonnes(NomFeuille as String, Plage as String, NumCol1 as Integer, NumCol2 as Integer, NumCol3 as Integer, Croissant as Boolean)

REM============================================================REM		
 ' macro adaptée de celle de Bernard Marcelly et Laurent Godard,
 ' dans Programmation OpenOffice.org 3, Eyrolles, pages 451-452
REM============================================================REM

Dim maFeuille As Object, maZone As Object
Dim ConfigTri(2) As New com.sun.star.table.TableSortField
Dim DescrTri As Variant
	
maFeuille = ThisComponent.Sheets.getByName(NomFeuille)
maZone = maFeuille.getCellRangeByName(Plage)
	
ConfigTri(0).Field = NumCol1	
ConfigTri(0).IsAscending = Croissant	'tri croissant si "true" est renseigné dans l'argument de la macro. Décroissant si "false".
ConfigTri(1).Field = NumCol2
ConfigTri(1).IsAscending = Croissant
ConfigTri(2).Field = NumCol3
ConfigTri(2).IsAscending = Croissant
	
'!!! ATTENTION, ce qui suit necessite la macro setPropVal !!!
DescrTri = maZone.createSortDescriptor	
setPropVal(DescrTri, "SortFields", ConfigTri())
setPropVal(DescrTri, "IsSortColumns", false)
setPropVal(DescrTri, "CopyOutputData", false)
setPropVal(DescrTri, "IsUserListEnabled", false)
setPropVal(DescrTri, "BindFormatsToContent", false)
setPropVal(DescrTri, "ContainsHeader", true)

'ici on effectue le tri
maZone.Sort(DescrTri())

End Sub
Elle est "commentée dans le code" dans le fichier joint.
L'avantage que je lui trouve c'est une sorte de souplesse et d'autonomie.
En effet, il suffit de renseigner les arguments NomFeuille, Plage, NumCol1 2 3 et Croissant, pour effectuer un tri.
Ainsi, je l'ai mise dans une bibliothèque "boite à outils" et je l'appelle depuis n'importe quelle macro sans avoir à rentrer dans le code
pour lui dire quoi et comment trier, j'ai juste à renseigner ses arguments.
Elle correspond à peu près à ce que l'on trouve lorsque l'on fait : menu Données > Trier...

Elle nécessite pour fonctionner l'excellente petite macro setPropVal de Bernard Marcelly et Laurent Godard que voici :

Code : Tout sélectionner

Sub setPropVal(descr As Variant, nomProp As String, valProp As Variant)	'affecte la valeur valProp à la propriété nomProp

Dim p As Object
	
for each p in descr
if p.Name = nomProp then
   p.Value = valProp
   Exit Sub
end if
next
    
'la propriété nomProp n'existe pas !
err = 423 ' déclenche l'erreur : "Propriété ou méthode introuvable"
    
End Sub
Je ne sais pas si ça peut t'intéresser toi ou quelqu'un d'autre.

En tout cas, merci de partager ton travail.
J'essaie de faire de même mais je suis très débutant :-)

Bonne journée.

Stéphane.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 25.8.3.2 (X86_64)
OS: Linux 6.12
Debian 13 Gnome 48 Wayland