Instruction Unprotect qui fonctionne une fois sur deux ! Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'589
Appréciations reçues : 40
Inscrit le : 6 avril 2007
Version d'Excel : 2010

Message par Yvouille » 11 février 2019, 21:34

Bonjour,

Je travaille bénévolement pour une association qui organise soit des randonnées d’un jour, soit des séjours de plusieurs jours. Il est demandé à chaque responsable de ces courses d’établir un rapport sur la base d’un fichier personnalisé qu’on lui remet. Ce fichier est créé sur la base du fichier ci-joint, lui-même réactualisé régulièrement selon les nouveaux membres entrants ou ceux nous quittant.

Si j’ouvre le fichier ci-joint et que je choisis une randonnée d’un jour, par exemple les courses numéro 1 à 26, il est demandé, sur Windows, de choisir un emplacement où enregistrer le nouveau fichier qui servira de rapport à cette course, et le nom de ce nouveau fichier est proposé. Le fichier de base est alors refermé automatiquement.

Sans que l’on s’en rende compte, des données concernant la machine utilisée pour ce travail sont enregistrées dans la colonne AA de la feuille ‘’Liste des participants du jour’’ par la macro Workbook_BeforeSave.

Si j’ouvre à nouveau le fichier de base qui vient d’être refermé automatiquement et que je choisi un séjour – par exemple la course numéro 27 ou la numéro 34 – la macro Workbook_BeforeSave qui enregistre les données concernant la machine utilisée en colonne AA de la feuille ‘’Liste des participants du jour’’ bloque bizarrement. L’instruction .unprotect qui fonctionne parfaitement pour le rapport d’une randonnée d’un jour ne déprotège pas la feuille ‘’Liste des participants du jour’’ s’il s’agit d’un séjour !!!!

Avez-vous une idée pourquoi ?


Complément d’information 1 : si je prépare un rapport pour une randonnée, la première feuille (onglet de gauche) est la feuille ‘’Rapport de randonnee’’ alors que pour un séjour, c’est la feuille ‘’Rapport de sejour’’ qui sera visible, les 3 autres feuilles visibles étant les deux fois les mêmes.

Complément d’information 2 : tout aussi bizarrement, si je passe par-dessus cette instruction qui bloque et que j’enregistre le fichier sous son nouveau nom, ce passage ne bloque plus lorsque j’ouvre à nouveau ce rapport de séjour et l’enregistrement voulu en colonne AA fonctionne aussi bien que pour les rapports des randonnées !!

Complément d’information 3 : J’ai alors tenté d’utiliser l’instruction On Error Resume Next pour éviter que ça coince à ce premier passage, mais ça crée d’autres problème, notamment que la boîte de dialogue avec laquelle on peut choisir l’emplacement où enregistrer le rapport de séjour ne s’ouvre plus.

Salutations.
Liste des membres pour CdC - 2019.02.11.xlsm
(221.41 Kio) Téléchargé 13 fois
Modifié en dernier par Yvouille le 11 février 2019, 22:10, modifié 1 fois.
Yvouille


:btres:
Avatar du membre
BOB71AU
Membre dévoué
Membre dévoué
Messages : 632
Appréciation reçue : 1
Inscrit le : 1 janvier 2010
Version d'Excel : 2003 - 2007

Message par BOB71AU » 11 février 2019, 22:09

Bonsoir Yves

j'aurai tendance à supprimer les 2
Application.EnableEvents = False
Cela sert à ne pas faire un autre événement, mais pour moi il n'y en a pas d'autre à part générer des problèmes
1 membre du forum aime ce message.
Cordialement
Bob
Avatar du membre
ric
Membre impliqué
Membre impliqué
Messages : 1'399
Appréciations reçues : 92
Inscrit le : 29 mai 2018
Version d'Excel : 2016 (365)

Message par ric » 11 février 2019, 22:15

Bonjour à tous,

J'en suis arrivé à la même conclusion :
Le fautif est : Application.EnableEvents = False



ric
1 membre du forum aime ce message.
Smart Indenter,
Excel fermé, https://www.add-ins.com/macro-products- ... a-code.htm .
Puis, clic-droit sur le code.

Ma formation avance ... je ne sais pas quelle forme j'aurai. :P
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'589
Appréciations reçues : 40
Inscrit le : 6 avril 2007
Version d'Excel : 2010

Message par Yvouille » 11 février 2019, 22:37

Bonjour,

Merci pour vos réponses.

J'ai tenté de supprimer ces deux instructions dans ce code, mais ça bloque alors à un autre endroit où ça n'avait jamais bloqué !!! Bon, aussi un passage ou le .Unprotect ne réagit plus, mais vraiment qui n'avait jamais causé de souci jusqu'à ce jour.

Mais j'ai eu l'idée de contourner le problème en n'enregistrant plus mes données sur une feuille qu'il faut déprotéger à chaque fois, mais sur une feuille masquée qui n'est jamais protégée et ça à l'air de jouer.

Je vais faire d'autres essais plus poussés ces jours prochains, mais je peux quand même mettre mon fil sur ''Résolu''.

A nouveau un tout grand merci pour votre aide.
Yvouille


:btres:
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 8'685
Appréciations reçues : 292
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 11 février 2019, 23:30

Bonjour,

ça m'a occupé un moment aussi, mais sans trouver le pourquoi le .Unprotect n'agissait plus sur cette feuille.
La différence que j'ai trouvée en cas de séjour, c'est que tu fais une écriture supplémentaire dans cette feuille.
Effectivement, si on met ces lignes en commentaire on n'a plus l'erreur :
Private Sub Worksheet_Change(ByVal Target As Range)
'...
'...
'            With Sheets("Liste des participants du jour") ' Autrement, ces formules font a la base reference a la feuille "Rapport de randonnee"
'                .Unprotect
'                .Range("C5") = Sheets("Rapport de sejour").Range("E7")
'                .Unprotect ' Par securite, car la feuille est probablement protegee a nouveau entre deux [j'ai eu le temps d'ecrire ce texte, mais non pas de controler la chose :-)]
'                .Range("E5:I5") = Sheets("Rapport de sejour").Range("E11") & " / " & Sheets("Rapport de sejour").Range("E19") ' A la base il y a une formule qui est remplacee si c'est un sejour
'                .Protect
'            End With
mais ça n'explique pas pourquoi il s'y perd ensuite.
A défaut, une solution de contournement à tester.
Plutôt que tous ces valses de . Protect .Unprotect qui lui font tournebouler la tête, protéger tes feuilles une bonne fois pour toutes avec le paramètre UserInterfaceOnly=True.
Plus besoin de déprotéger pour les macros.
Et si toutes les cellules de saisies sont bien déverrouillées, pas besoin pour l'utilisateur non plus.

Autre solution testée : déverrouiller 'Liste des participants du jour'!AA et il ne fait plus iech ;-)
Je préfère quand même la précédente car rien ne dit qu'au fil du temps la feuille ne sera pas plus vérolée avec cette bizarrerie.
eric
eric
1 membre du forum aime ce message.
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'589
Appréciations reçues : 40
Inscrit le : 6 avril 2007
Version d'Excel : 2010

Message par Yvouille » 14 février 2019, 20:47

Salut Eriiic,

Merci beaucoup pour ta réponse, tes informations et tes propositions.

Comme je l'avais indiqué juste avant, j'ai tenté une autre solution pour ce problème bien précis. Mais tes remarques au sujet de ma valse .protect / .unprotect / .protect / .unprotect n'est pas sans fondement.

Bon, une partie du problème est que les utilisateurs peuvent avancer avec ce travail petit-peu à petit-peu (ils reçoivent par exemple un téléphone le mardi et inscrive une personne, puis trois téléphones le mercredi et inscrivent trois personnes, puis inscrivent leurs frais le lendemain de la course, etc.) et que je préfère que les feuilles soient protégées entre deux.

J'espère que gentiment j'arrive à de bon résultat, mais c'est certain que chaque pierre apportée permet de construire un bout du mur :)

Cordialement.
Yvouille


:btres:
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 8'685
Appréciations reçues : 292
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 14 février 2019, 22:05

Bonjour,

mais elles sont protégées pour les utilisateurs avec UserInterfaceOnly=True.
Et les macros peuvent écrire sans déprotection.
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 8'589
Appréciations reçues : 40
Inscrit le : 6 avril 2007
Version d'Excel : 2010

Message par Yvouille » 17 février 2019, 12:29

Salut Eriiic,

Merci pour ces dernières précisions.

J’ai compris que l’instruction ActiveSheet.Protect , UserInterfaceOnly:=True par exemple mettait en place une option qui protégeait la feuille active mais permettait d’en modifier le contenu protégé, par exemple par une deuxième macro.

Cependant, j’ai remarqué que si je ferme ce fichier et l’ouvre à nouveau, cette deuxième macro bloque car la feuille concernée n’a plus l’option UserInterfaceOnly:=True.

Vu la valse de mes macros, penses-tu qu’il vaut mieux créer une macro à l’ouverture du fichier – par Private Sub Workbook_Open - qui irait placer une fois pour toute sur toutes les feuilles qui en ont besoin l’option UserInterfaceOnly:=True ou qu’il est mieux de placer cette instruction au début de chaque macro qui en a besoin ?

Cordialement.


Très bonnes salutations.
Yvouille


:btres:
Avatar du membre
ric
Membre impliqué
Membre impliqué
Messages : 1'399
Appréciations reçues : 92
Inscrit le : 29 mai 2018
Version d'Excel : 2016 (365)

Message par ric » 17 février 2019, 13:08

Bonjour,

Info sur UserInterFaceOnly ...
http://www.criticaltosuccess.com/speedu ... rfaceonly/




ric
Smart Indenter,
Excel fermé, https://www.add-ins.com/macro-products- ... a-code.htm .
Puis, clic-droit sur le code.

Ma formation avance ... je ne sais pas quelle forme j'aurai. :P
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 8'685
Appréciations reçues : 292
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 17 février 2019, 14:08

Bonjour,

oui, c'est mieux dans workbook_open(). Enfin ça a ma préférence, tout est rassemblé au même endroit et c'est fait une fois pour toutes.
Par contre si tu es obligé de l'enlever pour certaines opérations, il faut la remettre à l'identique dès qu'on en a plus besoin bien entendu.
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message