Macros

    From The Document Foundation Wiki
    < Macros‎ | Calc


    Comment gérer la sélection courante ?

    Certaines macros ont parfois pour fonction de travailler à partir d'une sélection faite par l'utilisateur, par exemple pour mettre en forme ou effectuer un calcul sur une plage de cellules.

    La propriété permettant d'accéder à la sélection en cours est la propriété CurrentSelection d'un objet classeur. Par exemple, pour le classeur courant :


    thiscomponent.currentSelection


    Dans le cas où la sélection est une cellule ou une plage de cellules, l'objet dispose de la propriété RangeAddress, elle-même un objet grâce auquel nous obtenons les coordonnées.

    La difficulté est que l'utilisateur peut avoir sélectionné beaucoup de "choses" différentes dans un classeur : une ou plusieurs cellules, une ou plusieurs plages de cellules, des diagrammes, des dessins, etc.

    Il est donc possible que la sélection ne dispose pas de la propriété RangeAddress. Pour éviter des erreurs d'exécution il importe de tester la nature de la sélection. Nous pouvons utiliser pour cela sa méthode supportsService car les services supportés diffèrent selon le type de sélection :

    • Une cellule seule : com.sun.star.sheet.SheetCell
    • Une plage de cellules : com.sun.star.sheet.SheetCellRange
    • Plusieurs plages de cellules : com.sun.star.sheet.SheetCellRanges


    L'exemple suivant met en œuvre cette technique. Le programme vérifie que la sélection est bien du type attendu (cellule, plage ou plages de cellules) et si oui, insère le texte "LibreOffice" et définit une couleur d'arrière-plan.

    • S'il s'agit d'une plage il convient de boucler sur toutes les cellules de la plage.
    • S'il s'agit d'un ensemble de plages, il convient de boucler sur toutes les plages et, pour chacune d'entre elles, de boucler sur toutes les cellules de la plage.
    • Un message d'avertissement signale que toute autre sélection n'est pas prise en compte.


    option explicit 
    
    sub LibOGererSelection
    
    dim LibOFeuille as object
    dim LibOSelCourante as object
    dim LibOUneCellule as object
    
    dim LibONbPlages as integer
    dim LibONbCol as integer
    dim LibONbLig as integer
    
    LibOFeuille = thisComponent.CurrentController.ActiveSheet
    LibOSelCourante = ThisComponent.CurrentSelection
    
    if LibOSelCourante.supportsService("com.sun.star.sheet.SheetCell") then
    	LibOGererSelectionSuite(LibOSelCourante)
    elseif LibOSelCourante.supportsService("com.sun.star.sheet.SheetCellRange") then
    	with LibOSelCourante.RangeAddress
    		for LibONbCol = .StartColumn to .EndColumn
    			for LibONbLig = .StartRow to .EndRow
    				LibOUneCellule = LibOFeuille.getCellByPosition(LibONbCol, LibONbLig)
    				LibOGererSelectionSuite(LibOUneCellule)
    			next LibONbLig
    		next LibONbCol
    	end with
    elseif LibOSelCourante.supportsService("com.sun.star.sheet.SheetCellRanges") then
    	for LibONbPlages = 0 to ubound(LibOSelCourante.RangeAddresses)
    		with LibOSelCourante.RangeAddresses(LibONbPlages)
    			for LibONbCol = .StartColumn to .EndColumn
    				for LibONbLig = .StartRow to .EndRow
    					LibOUneCellule = LibOFeuille.getCellByPosition(LibONbCol, LibONbLig)
    					LibOGererSelectionSuite(LibOUneCellule)
    				next LibONbLig
    			next LibONbCol
    		end with
    	next LibONbPlages 
    else
    	msgbox "la sélection doit être soit une cellule, soit une ou plusieurs plages de cellules"
    end if
    end sub
    
    sub LibOGererSelectionSuite(LibOCell as object)
    
    with LibOCell
    	.string = "LibreOffice"
    	.CellBackColor = 16765728
    end with
    
    end sub