Instruction Unprotect qui fonctionne une fois sur deux

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.

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

Bonjour à tous,

J'en suis arrivé à la même conclusion :

Le fautif est : Application.EnableEvents = False

ric

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.

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

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.

Bonjour,

mais elles sont protégées pour les utilisateurs avec UserInterfaceOnly=True.

Et les macros peuvent écrire sans déprotection.

eric

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.

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

Bonjour,

Merci à tous les deux pour vos conseils qui concordent.

J'ai tenté de modifier mes fichiers en utilisant cette instruction, mais mon travail va tellement dans tous les sens que je n'y arrive pas pour l'instant.

Toutefois je vais utiliser dorénavant cette idée en remplacement des nombreux .Unprotect / .Protect qui sont souvent nécessaires.

Encore un grand merci et bonnes salutations.

Bonjour,

eriiic a éveillé ma curiosité et mon intérêt à propos de cette instruction (le terme est-il exact ?)

Après m'être renseigné sur du site dont j'ai donné le lien, j'ai testé sur un fichier complexe sur lequel je tente d'aider un autre membre en privé.

Je ne peux dire que : "Très efficace".

J'ai mis en commentaire les dizaines de Unprotect et de Protect ... tout fonctionne à merveille.

Merci de m'avoir fait découvrir "UserInterFaceOnly".

ric

Rechercher des sujets similaires à "instruction unprotect qui fonctionne fois deux"