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 explicitCode : 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 lignesCOPIER 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 = 3160FORMATER 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.DataArrayMASQUER 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 SubProcé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
en pièce jointe, le fichier avec la macro
Qui a dit que je pourrais devenir accro ?
A+

