Protection par macro d'une feuille Calc avec désélection des autorisations

Bonsoir,

Pour protéger une feuille Calc par macro, l’instruction suivante marche très
bien : oFeuille.protect("motDePasse")

Mais je ne trouve pas comment désélectionner les autorisations :

  - Sélectionner les cellules protégées

  - Sélectionner les cellules non protégées

Merci de vos lumières et bonne fin de dimanche,

Michel

Bonsoir Michel,

Pour protéger une feuille Calc par macro, l’instruction suivante marche très
bien : oFeuille.protect("motDePasse")

Mais je ne trouve pas comment désélectionner les autorisations :

   - Sélectionner les cellules protégées

   - Sélectionner les cellules non protégées

Je ne sais pas ce que tu veux accomplir précisément. Alors voici qq idées, en vrac.

Ce bout de code qui parcourt une feuille ne pourrait-il pas te servir de base ? (trouvé ici : [1])

Sub LockCells(oRange As Object)
    Dim Doc As Object
    Dim oSheet As Object
    Dim oCell As Object
    Dim p As New com.sun.star.util.CellProtection
    Dim col As Long
    Dim row As Long

    Doc = ThisComponent
    oSheet = Doc.Sheets(oRange.RangeAddress.Sheet)
    oSheet.unprotect("Password")

    For col = 0 to oRange.Columns.Count - 1
       For row = 0 to oRange.Rows.Count - 1
          oCell = oRange.getCellByPosition(col,row)
          p = oCell.CellProtection
          If oCell.getType() <> com.sun.star.table.CellContentType.EMPTY and not p.IsLocked Then
             p.Islocked = True
             oCell.CellProtection = p
          End If
       Next Row
    Next col

    oSheet.protect("Password")

End Sub

En le combinant avec :
1. La création d'un range sur les cellules (non)protégées trouvées
2. La sélection du range ensuite

Mieux (?) mais je n'ai jamais essayé dans ce type d'usage : utiliser queryContentCells(CellFlags)
avec CellFlags à : com.sun.star.sheet.CellFlags.HARDATTR (ou STYLES)
Plus d'infos dans OOME par Andrew Pitonyak [2]

Tu trouveras sans doute aussi dans la bible par saints Marcelly et Godard, édition 2011, des idées à combiner. Voir au chapitre 9 les rubriques :
-- Protéger une cellule (p.423)
-- Énumérer les cellules d'une zone (p.448)

[1] https://forum.openoffice.org/en/forum/viewtopic.php?f=9&t=34393
[2] http://www.pitonyak.org/OOME_3_0.pdf

Bonsoir Jean-François et merci, particulièrement pour le Pitonyak que je ne
connaissais pas

Jean-Francois Nifenecker wrote

Pour protéger une feuille Calc par macro, l’instruction suivante marche
très
bien : oFeuille.protect("motDePasse")

Mais je ne trouve pas comment désélectionner les autorisations :

   - Sélectionner les cellules protégées
   - Sélectionner les cellules non protégées

Je ne sais pas ce que tu veux accomplir précisément. Alors voici qq
idées, en vrac.

C'est très simple, il s'agit de faire par macro les choix que l'on peut
faire manuellement quand on protège une feuille, c-a-d autoriser ou non
l'utilisateur à sélectionner certains types de cellules :
<http://nabble.documentfoundation.org/file/n4177789/ScreenShot761.jpg>
Par défaut toutes les sélections sont autorisées, et je veux les interdire.

Ce n'est pas très important, mais pour certaines feuilles qui n'ont pour
objet que d'être lues, je trouve visuellement gênant (et inesthétique) la
sélection de cellules quelconques par l'utilisateur. Je préfère figer la
sélection sur une cellule de mon choix.

J'ai pas mal cherché, je me suis voué à nos saints préférés, j'ai examiné
les propriétés de l'objet feuille mais sans résultat. Je ne sais plus à
quelle version est apparue cette fonctionnalité avancée, et je me demande
si l'accès par macro a été implémenté.

Et je réponds à la question: pourquoi faire par macro ce qui est si simple
et rapide manuellement ?
Parce que j'ai des classeurs pour des clients que je fais évoluer
régulièrement, ils comportent des feuilles masquées, des feuilles protégées,
et des combinaisons des deux. Après chaque évolution, il y a un travail
fastidieux, remettre sans erreur toutes les feuilles du classeur dans l'état
souhaité.
J'ai donc deux procédures , une qui expose tout le classeur (affiche toutes
les feuilles et les déprotège) pour le début du travail , une autre à la fin
qui remet dans l'état final (protection, masquage, sélection d'une cellule
particulière sur la feuille) - pour ne pas réécrire la procédure pour chaque
classeur, une astuce me permet en bouclant sur toutes les feuilles de savoir
l'opération à faire pour chacune . Je peux ainsi remettre le classeur final
dans l'état voulu sans risque d’erreur.

Bonne fin de soirée,
Michel

Bonjour Michel,

C'est très simple, il s'agit de faire par macro les choix que l'on peut
faire manuellement quand on protège une feuille, c-a-d autoriser ou non
l'utilisateur à sélectionner certains types de cellules :
<http://nabble.documentfoundation.org/file/n4177789/ScreenShot761.jpg>
Par défaut toutes les sélections sont autorisées, et je veux les interdire.

en résumé, que le classeur puisse se trouver alternativement dans deux modes : un mode "développement" (tout est permis) et un mode "production" (on restreint/masque selon les besoins) ?

J'ai également rencontré le même besoin, cela va sans dire.

Voici ce je que j'utilise :

Je crée une feuille "Gestion" qui comporte des infos sur les feuilles mais -- surtout -- deux boutons : "Mode développement" et "Mode production". Ces deux boutons basculent d'un mode à l'autre en appelant deux macros correspondantes (et sensiblement de même structure). L'une active (mode développement), l'autre désactive/cache/etc. (mode production).

Voici ces deux macros (PrepareDev et PrepareDev), qui -- elles-mêmes -- appellent deux macros de travail (PrepareForDev et PrepareForProd). Ces macros sont listées ci-dessous.

PW_SPREAD et PW_SHEETS sont les constantes qui contiennent les mots de passe de protextion,
"accueil" est le nom de la feuille à afficher à l'entrée dans le classeur (feuille active),
Array() liste les feuilles qui doivent être masquées/affichées

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

Sub PrepareDev()
  PrepareForDev(PWD_SPREAD, PWD_SHEETS, "accueil", Array("cote_p_calculs", "heures", "bonifs", "artt", "artt2", "rh", "à reporter", "ref", "gestion"))
End Sub 'PrepareDev

Sub PrepareProd()
  PrepareForProd(PWD_SPREAD, PWD_SHEETS, "accueil", Array("cote_p_calculs", "heures", "bonifs", "artt", "artt2", "rh", "à reporter", "ref", "gestion"))
End Sub 'PrepareProd

'et les sous-programmes "utiles" :

Sub PrepareForDev(ByRef pDocPwd As String, pSheetPwd As String, pActiveSheet As String, pHiddenSheets())
'prepare the spreadsheet for development: unprotect sheets, etc.

  Dim oDoc As Object
  Dim oCtrl As Object
  Dim oSheet As Object
  Dim i As Long

  oDoc = ThisComponent

  'document setup
  oCtrl = oDoc.CurrentController
  oCtrl.HasColumnRowHeaders = True
  ShowInputLine(True)

  'show sheets
  For i = 0 To UBound(pHiddenSheets)
    ShowSheet(pHiddenSheets(i), True)
  Next
  
  'unprotect sheets
  For i = 0 To oDoc.Sheets.Count - 1
    oSheet = oDoc.Sheets(i)
    ProtectSheet(oSheet.Name, pSheetPwd, False)
  Next
  
  'set active sheet
  SetActiveSheet(pActiveSheet)
  
  'unprotect document
  If IsMissing(pDocPwd) Then pDocPwd = ""
  oDoc.unprotect(pDocPwd)

End Sub 'PrepareForDev

Sub PrepareForProd(ByRef pDocPwd As String, pSheetPwd As String, pActiveSheet As String, ByRef pHiddenSheets())
'prepare the spreadsheet for production: protect sheets, etc.

  Dim oDoc As Object
  Dim oCtrl As Object
  Dim oSheet As Object
  Dim l_Zoom As String
  Dim i As Long

  oDoc = ThisComponent

  'document setup
  oCtrl = oDoc.CurrentController
  oCtrl.HasColumnRowHeaders = False 'hide column and row headers
  l_Zoom = GetNamedCellString(SHEET_GESTION, CELL_ZOOM)
  If (l_Zoom <> "") Then
    SetZoomValue(CInt(l_Zoom))
  End If
  ShowInputLine(False) 'hide input line

  'hide sheets
  For i = 0 To UBound(pHiddenSheets)
    ShowSheet(pHiddenSheets(i), False)
  Next
  
  'protect sheets using the same pwd
  For i = 0 To oDoc.Sheets.Count - 1
    oSheet = oDoc.Sheets(i)
    ProtectSheet(oSheet.Name, pSheetPwd, True)
  Next
  
  'set active sheet
  SetActiveSheet(pActiveSheet)
  
  'protect document
  oDoc.protect(pDocPwd)

End Sub 'PrepareForProd

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

La seule chose à faire manuellement pour passer du mode "production" au mode "développement" est l'affichage de la feuille "Gestion" pour rendre les boutons accessibles. Il y aurait possibilité de lui associer un raccourci clavier mais pour l'instant je fonctionne comme ça.

En espérant que ça aidera.
Amitiés,

Protection par macro d'une feuille Calc avec désélection des autorisations :
Voici le rapport de bug - dernière mise à jour le 04/02/2014 - qui semble dire que cela n'est pas possible :
https://bugs.documentfoundation.org/show_bug.cgi?id=55969&redirected_from=fdo
Mailing
Mais peut-être du nouveau depuis ?

Cordialement

Bonjour,

-----Message d'origine-----
De : Bruno JARNO [mailto:bruno.jarno@tonoconseils.com]
Envoyé : lundi 7 mars 2016 08:53
À : users@fr.libreoffice.org
Objet : Re: [fr-users] Re: Protection par macro d'une feuille Calc avec
désélection des autorisations

Protection par macro d'une feuille Calc avec désélection des autorisations
:
Voici le rapport de bug - dernière mise à jour le 04/02/2014 - qui
semble dire que cela n'est pas possible :
https://bugs.documentfoundation.org/show_bug.cgi?id=55969&redirected_from=
fdo
Mailing
Mais peut-être du nouveau depuis ?

Merci Bruno de me rafraîchir la mémoire, j'avais déjà posé la question il y
a longtemps et Pierre-Yves m'avait informé de ce manque - mais j'avais
complètement oublié.

Cordialement,
Michel

Merci Jean-François,

C'est très intéressant tout ça !

Cordialement,
Michel