Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Lenteur de protection/déprotection d'une feuille avec Excel2013

9 réponses
Avatar
HD
Bonjour,

J'ai un classeur comportant des macros. Sur ces macros j'ai un grand
nombre d'opérations de protection/déprotection de feuilles qui
s'effectue. Le souci est que si sur tous mes postes avec des versions
Excel 97 à Excel 2010 je n'ai pas de souci... j'ai un problème de
lenteur sur les postes avec Excel 2013 (qu'ils soient sur Windows 7 ou
Windows 8). Ce problème de lenteur doit être de l'ordre de quelques
dixièmes de secondes... mais mon souci est que répété un grand nombre de
fois j'aboutis à un blocage de quelques secondes là où la même macro ne
provoquait aucun ralentissement visible sur les versions précédentes
d'Excel.

Mes macros font appellent à la fonction Deprot pour déprotéger et la
macro Prot pour reprotéger :

Function Deprot()
ActiveSheet.Unprotect Password:="MonMotdePasse"
End Function

Sub Prot()
ActiveSheet.Protect Password:="MonMotdePasse"
End Sub

Avez vous également constaté de tels problèmes de lenteurs avec Excel
2013 ? Y'a-t-il un paramétrage permettant de modifier cela ?

Cordialement,

HD

9 réponses

Avatar
MichD
Bonjour,

Au lieu de déprotéger la feuille et la protéger à nouveau pour exécuter certains codes affectant le
contenu de la feuille de calcul, pourquoi ne pas utiliser seulement ceci :

Colle ceci dans le ThisWorkbook de ton classeur en adaptant le mot de passe dans la procédure.
Ceci te permet d'exécuter la grande majorité du code de tes procédures sans te soucier du fait
que la ou les feuilles sont protégées ou non. Bien que tu puisses accéder à la feuille de calcul
par macro, les feuilles demeurent toujours protégées pour les modifications manuelles que
pourraient faire les usagers. Nul besoin de faire appel à tes fonctions dans les procédures!

Après avoir copié cette procédure, tu dois l'exécuter manuellement ou fermer et ouvrir à nouveau
ton classeur.

'-----------------------------------
Private Sub Workbook_Open()

Dim Sh As Worksheet
For Each Sh In ThisWorkbook.Worksheets
Sh.Protect Password:="toto", DrawingObjects:=True, _
Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
Next
End Sub
'-----------------------------------
Avatar
HD
Bonjour MichD,

Ce n'est pas aussi simple que cela car certaines plages de cellules sont
protégées ou déprotégées en fonction de la saisie sur la feuille en
cours ceci afin de mettre la ligne de saisie en rouge (en cas d'erreur)
ou en noire (quand il n'y a pas de souci). L'on a donc pour chaque
événement Worksheet.Change d'une feuille un contrôle des cellules et en
cas d'erreur ou non il y'a déprotection de la feuille pour modifier la
couleur de la ligne puis reprotection.

Mais pourquoi y'a-t-il une si grande lenteur à protéger/déprotéger une
feuille avec Excel2013 par rapport à toutes les anciennes versions
d'Excel ? Avec ces classeurs il n'y a aucun souci de lenteur sur les
versions d'Excel allant de 97 à 2010.

@+
HD
Avatar
MichD
Cette lenteur avec Excel 2013 concernant la protection des feuilles s'explique par :

'------------------------------------------------------------
The delay is caused by increased security in Excel 2013 for password-protected files, because it
uses a stronger hashing algorithm (SHA-512). In Office 2010, the default hashing algorithm for
password protected files is SHA1.

This change makes Excel password protected workbooks more secure than they were in previous
versions, but can cause a performance issue for some Office Developers.

This is by design, so there is no way around it unfortunately!
'------------------------------------------------------------
Avatar
MichD
La source du message, dans la seconde moitié de la page...

http://office.microsoft.com/en-us/excel-help/office-2013-known-issues-HA102919019.aspx

'------------------------------------------------------------
The delay is caused by increased security in Excel 2013 for password-protected files, because it
uses a stronger hashing algorithm (SHA-512). In Office 2010, the default hashing algorithm for
password protected files is SHA1.

This change makes Excel password protected workbooks more secure than they were in previous
versions, but can cause a performance issue for some Office Developers.

This is by design, so there is no way around it unfortunately!
'------------------------------------------------------------
Avatar
HD
Merci pour cette info.

Il ne doit pas pouvoir y avoir la possibilité de désactiver cet encodage
SHA-512 sur 2013 pour le forcer à travailler en SHA1 ?

@+
HD
Avatar
HD
Il ne doit pas pouvoir y avoir la possibilité de désactiver cet
encodage SHA-512 sur 2013 pour le forcer à travailler en SHA1 ?



D'après ce que je viens de lire il n'existerait pas de solution de
contournement... plus de sécurité mais malheureusement comme souvent au
détriment de la performance...

Je viens d'avoir un éditeur de logiciel en ligne qui fonctionne en
pilotant des fichiers Excel (Revisaudit) et eux recommandent d'ailleurs
de ne pas utiliser Excel 2013 mais de rester sur d'anciennes versions
Excel.

@+
HD
Avatar
MichD
Ce que tu peux faire, c'est de piloter la saisie et la modification de données en
utilisant un formulaire personnalisé. Cela te permettrait d'utiliser ce que je t'ai proposé
comme solution.

Je sais, encore faut-il créer ces formulaires!

Une dernière alternative, tu protèges les feuilles comme je l'ai suggéré et tu utilises le
formulaire (grille) d'Excel pour ajouter ou modifier les données de la plage de cellules.

Dans le Thisworkbook du classeur, copie cette procédure :
Dans ce code, tu dois adapter le nom des feuilles de calcul pour lesquels tu veux avoir la
possibilité d'intervenir même si la feuille est protégée ainsi que la plage de cellules concernées
pour chacune des feuilles.

Dès que tu changes de feuille, la grille apparaît. Avec cette dernière tu peux modifier ou saisir de
nouvelles données.

'----------------------------------------------------
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
With Sh
Select Case LCase(Sh.Name)
Case Is = "feuil1"
Range("a1:g2").Select
Application.DisplayAlerts = False
Application.CommandBars.FindControl(ID:†0).Execute
Application.DisplayAlerts = True

Case Is = "feuil2"
Range("C5:L55").Select
Application.DisplayAlerts = False
Application.CommandBars.FindControl(ID:†0).Execute
Application.DisplayAlerts = True
End Select
End With

End Sub
'----------------------------------------------------
Avatar
HD
Je connaissais pas ces formulaires grilles... intéressant.

Pour mon problème, je me suis résolu à optimiser au maximum mon script
pour minimiser le nombre de protection/déprotection. Avec les anciens
Excel, je me disais qu'il ne me servait à pas grand chose d'optimiser
tout cela si l'utilisateur devait gagner 0,001 seconde entre chaque
modif... mais là, avec le nouvel Excel bien plus lent je n'ai plus le
choix.

Il y'a des moments on a l'impression que plus l'on avance et plus l'on
recul... ;-)
Lorsque l'on voit que même les éditeurs de logiciels qui pilotent le VBA
de Microsoft Office déconseille de passer à Excel 2013... il y'a de quoi
se poser des questions... :-/
Si ça continue l'on va finir par me demander de réinstaller des licences
Excel 97...

@+
HD
Avatar
MichD
| Je connaissais pas ces formulaires grilles... intéressant.

Tu as une grille similaire, mais plus "avancée" à cette adresse gratuitement:

http://spreadsheetpage.com/index.php/dataform/home