Calc : sélection multiple de cellules dans une macro

classic Classic list List threaded Threaded
3 messages Options
Luc Mamin Luc Mamin
Reply | Threaded
Open this post in threaded view
|

Calc : sélection multiple de cellules dans une macro

Bonjour

Préambule : je suis néophyte complet en macro...

Dans un fichier tableur, j'ai besoin de pouvoir effacer rapidement le
contenu des cellules "déverrouillées".
Je pensais passer par une macro.

J'ai débuté par l'enregistreur de macro et je parviens partiellement à
mes fins.

Ce que je n'arrive pas à faire, c'est la sélection des seules cellules
désirées.
Exemple :
Dans la macro, j'arrive à sélectionner la plage C4:C37 :

> dim args1(0) as new com.sun.star.beans.PropertyValue
> args1(0).Name = "ToPoint"
> args1(0).Value = "$C$4:$C$37"
>
> dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

En fait, j'aurais voulu que les cellules soient sélectionnées ainsi : de
C4 à C6 et de C9 à C11, et de C13 à C16.
Mais je n'y arrive pas.

Mieux en fait : j'aurais voulu sélectionner l'ensemble des cellules
déverrouillées de cette feuille.

Si quelqu'un·e avait un début de solution courte...

Merci

@+
Luc


--
Envoyez un mail à [hidden email] pour vous désinscrire
Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/
Privacy Policy: https://www.documentfoundation.org/privacy
Jean-Francois Nifenecker Jean-Francois Nifenecker
Reply | Threaded
Open this post in threaded view
|

Re: Calc : sélection multiple de cellules dans une macro

Bonsoir Luc,

Le 23/05/2019 à 10:08, Luc Mamin a écrit :

>
> Dans un fichier tableur, j'ai besoin de pouvoir effacer rapidement le
> contenu des cellules "déverrouillées".
> Je pensais passer par une macro.
>
> J'ai débuté par l'enregistreur de macro et je parviens partiellement à
> mes fins.
>
> Ce que je n'arrive pas à faire, c'est la sélection des seules cellules
> désirées.

l'enregistreur ne permet pas cette finesse.

Si tu veux parcourir une plage et agir sur les seules cellules non
protégées, il te faut utiliser un énumérateur.

Voici un exemple, tiré de l'aide-mémoire n°3 (verso - "Parcourir les
cellules d'une plage"), voir ici :
https://documentation.libreoffice.org/assets/Uploads/Documentation/en/MACROS/RefCards/LibOBasic-3-Calc-Flat-A4-EN-v111.pdf

Principe :
À partir d’une collection (Plages.Cells) on crée une énumeration.
Celle-ci est parcourue en appelant ses propriétés hasMoreElements et
NextElement.

8< ---------------------------------------------------------------

Dim MaFeuille As Object 'l'objet feuille qui contient la plage
Dim MaPlage As Object   'l'objet plage à parcourir
Dim Plages As Object    'la collection de plages qui fournit l'énumérateur
Dim Cellule As Object   'la cellule en cours
Dim LEnum As Object     'l'énumérateur

MaFeuille = ThisComponent.Sheets(0) 'ici, la 1ere feuille du classeur
MaPlage = MaFeuille.getCellRangeByName("C4:C37")

Plages = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
Plages.insertByName("", MaPlage)
LEnum = Plages.Cells.CreateEnumeration
Do While LEnum.hasMoreElements
        Cellule = LEnum.NextElement
        'appliquer un traitement à partir de l'objet Cellule
        'ex:
        'If Not Cellule.IsProtected Then Cellule.String = ""
Loop

---------------------------------------------------------------- >8


J'ai déposé une feuille démo ici :
https://framadrop.org/r/xIsgqcIQiN#J6CD4/bJH8GruOtCt1WEaNL77pKOhQk8CvcwrQcUmJI=


Si vous répondez, merci de penser à utiliser la fonction "répondre à
tous" de votre logiciel de courrier électronique de façon que la liste
reçoive une copie de votre réponse.

Très cordialement,
Si vous répondez, merci de penser à utiliser la fonction "répondre à
tous" de votre logiciel de courrier électronique de façon que la liste
reçoive une copie de votre réponse.

Bien cordialement,
--
Jean-Francois Nifenecker, Bordeaux


--
Envoyez un mail à [hidden email] pour vous désinscrire
Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/
Privacy Policy: https://www.documentfoundation.org/privacy
Mamin Luc Mamin Luc
Reply | Threaded
Open this post in threaded view
|

Re: Calc : sélection multiple de cellules dans une macro

Bonsoir et merci pour cette macro.

Je m'en étais finalement sorti avec l'enregistreur en enregistrant les
actions  : Édition -> Sélectionner -> Sélectionner les cellules non
protégées.
Le code de la macro contenait une remarque indésirable, je l'ai enlevée,
et ça tourne :

> REM  *****  BASIC  *****
> sub Main
> rem ----------------------------------------------------------------------
> rem define variables
> dim document   as object
> dim dispatcher as object
> rem ----------------------------------------------------------------------
> rem get access to the document
> document   = ThisComponent.CurrentController.Frame
> dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
> rem ----------------------------------------------------------------------
> dispatcher.executeDispatch(document, ".uno:SelectUnprotectedCells",
> "", 0, Array())
> rem ----------------------------------------------------------------------
> dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())
> end sub
Cela s'applique à toutes les cellules non verrouillées.

L'intérêt de ta macro c'est qu'elle définit aussi la plage sur laquelle
elle doit s'appliquer.
Ça me sera utile pour un autre fichier où je ne veux pas forcément
effacer toutes les cellules déverrouillées.

Merci !
@+
Luc

Le 23/05/2019 à 22:18, jean-francois a écrit :

> Bonsoir Luc,
>
> Le 23/05/2019 à 10:08, Luc Mamin a écrit :
>>
>> Dans un fichier tableur, j'ai besoin de pouvoir effacer rapidement le
>> contenu des cellules "déverrouillées".
>> Je pensais passer par une macro.
>>
>> J'ai débuté par l'enregistreur de macro et je parviens partiellement
>> à mes fins.
>>
>> Ce que je n'arrive pas à faire, c'est la sélection des seules
>> cellules désirées.
>
> l'enregistreur ne permet pas cette finesse.
>
> Si tu veux parcourir une plage et agir sur les seules cellules non
> protégées, il te faut utiliser un énumérateur.
>
> Voici un exemple, tiré de l'aide-mémoire n°3 (verso - "Parcourir les
> cellules d'une plage"), voir ici :
> https://documentation.libreoffice.org/assets/Uploads/Documentation/en/MACROS/RefCards/LibOBasic-3-Calc-Flat-A4-EN-v111.pdf
>
> Principe :
> À partir d’une collection (Plages.Cells) on crée une énumeration.
> Celle-ci est parcourue en appelant ses propriétés hasMoreElements et
> NextElement.
>
> 8< ---------------------------------------------------------------
>
> Dim MaFeuille As Object 'l'objet feuille qui contient la plage
> Dim MaPlage As Object   'l'objet plage à parcourir
> Dim Plages As Object    'la collection de plages qui fournit
> l'énumérateur
> Dim Cellule As Object   'la cellule en cours
> Dim LEnum As Object     'l'énumérateur
>
> MaFeuille = ThisComponent.Sheets(0) 'ici, la 1ere feuille du classeur
> MaPlage = MaFeuille.getCellRangeByName("C4:C37")
>
> Plages =
> ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
> Plages.insertByName("", MaPlage)
> LEnum = Plages.Cells.CreateEnumeration
> Do While LEnum.hasMoreElements
>     Cellule = LEnum.NextElement
>     'appliquer un traitement à partir de l'objet Cellule
>     'ex:
>     'If Not Cellule.IsProtected Then Cellule.String = ""
> Loop
>
> ---------------------------------------------------------------- >8
>
>
> J'ai déposé une feuille démo ici :
> https://framadrop.org/r/xIsgqcIQiN#J6CD4/bJH8GruOtCt1WEaNL77pKOhQk8CvcwrQcUmJI= 
>
>
>
> Si vous répondez, merci de penser à utiliser la fonction "répondre à
> tous" de votre logiciel de courrier électronique de façon que la liste
> reçoive une copie de votre réponse.
>
> Très cordialement,
> Si vous répondez, merci de penser à utiliser la fonction "répondre à
> tous" de votre logiciel de courrier électronique de façon que la liste
> reçoive une copie de votre réponse.
>
> Bien cordialement,



--
Envoyez un mail à [hidden email] pour vous désinscrire
Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/
Privacy Policy: https://www.documentfoundation.org/privacy