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

Bonsoir Luc,

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,

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