Problème de protection/déprotection

emsylvin69

XLDnaute Junior
Bonjour à tous.
Je viens quémander de nouveau votre aide. Le sujet du jour: La protection et déprotection d'un classeur.
Le fichier fonctionne avec plusieurs macros. Je suis obligé de protéger les feuilles et le classeurs afin que les utilisateurs ne puissent changer quoi que ce soit dans le fichier sauf ce qui est autorisé bien sur.
J'ai voulu faire une macro que j'ai appelée "rapatriment" mais elle échoue lors de son lancement. Elle bloque à ce niveau:
Sheets("URGENCES").Visible = True.
Je pense que la cause provient du faite que je suis passé par une commande userinterfaceonly. Pouvez-vous m'aider en me disant ou est cette erreur?
D'avance merci. Bonne journée à vous.
 

Pièces jointes

  • Vers test.xlsm
    118.5 KB · Affichages: 68

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

Bonsoir,

De mon côté, la macro bloque sur cette ligne :

Code:
Selection.ClearContents

Est-ce dans l'onglet TRAVAIL que tu veux effacer le contenu? Si oui, il faudrait le spécifier car avant dans ta macro, tu fais références à la feuille URGENCES.

Ensuite, ça bloque à :

Code:
Sheets("URGENCES").Visible = True

et ça c'est parce que tu as mis une protection sur ton classeur. Une fois la protection enlevé, cette ligne fonctionne, mais ça plante plus loin...

Bref, un petit ménage dans ton code s'impose...

Je remarque que tu utilises beaucoup de .Select dans ta macro. Cela alourdit et ralentit ton code. Exemple, tu pourrais remplacer ceci :

Code:
    Range("B13:D32,K13:K32").Select
    Range("K13").Activate
    Selection.ClearContents
    Range("B13").Select

Par :

Code:
    Range("B13:D32,K13:K32").ClearContents
(En spécificant la feuille, c'est encore mieux :

Code:
    Sheets("TRAVAIL").Range("B13:D32,K13:K32").ClearContents

A+
 

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Bonsoir Grand Chaman,
Il est vrai que mon code nécessite un grand coup de balai.
Pour ce qui est du fonctionnement la feuille Urgences est caché car elle me sert à avoir un état de presence du personnel qui j'imprime en cas de soucis. Et je ne veux pas que les utilisateurs puissent y accéder. D'autre part, le lieu de travail tourne 24/24 et il faut qu'a un moment donné je puisse remettre cette feuille à zéro tout en gardant une trace du personnel sur place. C'est pourquoi la page "travail" est divisée en deux partie. La premiere qui recupère la deuxième partie et ceci une fois fait je vide la deuxième pour pouvoir travailler dessus.
Pour ce qui est de Sheets("URGENCES").Visible = True, c'est vrai que ca bloque à cause de cette histoire de protection de classeur et de feuille mais je n'arrive pas à la contourner.
A+
 

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Re,
en faite, j'ai oublié de préciser que je rends la feuille "URGENCES" visible car je ne sais pas comment faire pour y acceder et m'en servir sans ça.
Et je passe par:
Application.ScreenUpdating = False pour eviter que cela ne se voit.
Cdt.
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

Bonjour emsylvin69,

En fait, tu peux travailler sur la feuille même si elle n'est pas visible.
C'est pour cela qu'il ne faut pas utiliser les .Select. Tu dois par contre indiquer sur quelle feuille tu travailles avant tes lignes de code.

Exemple, si ta feuille est cachée et que tu écris :

Code:
Sheets("URGENCES").Range("B1") = "Toto"
Sheets("Travail").Range("B1") = "Tata"

ça va aller écrire "Toto" dans B1 sur Urgences et "Tata" dans B1 sur Travail, même si une est cachée mais pas l'autre.

A essayer.
 

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Re bonjour Grand Chaman,
merci pour ta réponse. J4ao essayé de l'adapter à mon code mais cela ne passe pas car pour le coup il ne s'agit pas d'inscrire dans une case mais de récuperer des infos pour les recopier dans la page travail.
J'ai fais comme ça:
Sheets("URGENCES").Range("Tableau5[[PLAQUES]:[HEURES]]").Select
ActiveSheet.ListObjects("Tableau5").Range.AutoFilter Field:=7, Criteria1:= _
"<>"
Selection.Copy
Sheets("TRAVAIL").Range("B13").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=True, Transpose:=False

mais ca bloque dès la première ligne.
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

Re-bonjour,

Le problème est que tu n'utilises pas correctement la fonction .Range

Il faudrait que ça ressemble à quelque chose comme :
Code:
    Sheets("URGENCES").ListObjects("Tableau5").Range.AutoFilter field:=7, Criteria1:="<>"
    Sheets("URGENCES").Range("A2:C14").Copy Sheets("DONNEES").Range("B13")

Note que la sélection des cellules à copier n'est probablement pas la bonne et que ça ne copie pas seulement les valeurs. Le but étant simplement de t'indiquer la bonne syntaxe.

J'avoue que j'ai de la misère à saisir ce que tu veux faire. Peux-tu expliquer un peu plus comment est utilisé ton fichier. Où sont entrées les données? Qu'est-ce que la macro doit faire exactement (copier quoi et où), etc... Je pourrai mieux peut-être t'aider si j'en sais plus.

A+
 

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Re
Alors, je vais essayé de te faire un topo rapide et comprehensible.
Tout d'abord, tu as dans la page travail, 2 tableaux. 1 Bleu et 1 rosé. Le bleu sert pour la journée et l'autre pour la nuit. La page des données me sert à remplir automatiquement les differents champs des tableaux avec une fonction recherchv. quand un gars arrive, on tape son numero dans les cases bleues et quand il part les vertes. l'heure s'inscrie automatiquement quand on entre un numero.
La page des Urgences me sert en cas d'évacuation à savoir qui est present ou non sur le site. Je fais un tri par macro et une impression de la page. sachant que les postes sont a cheval sur 2 jours (de 07h00 à 06h59 le lendemain), il m'est difficile de refaire un tableau vierge car a aucun moment le site est vide. Donc pour garder, en mémoire qui est present de l'equipe de nuit quand l'equipe de jour arrive, je me sert de la page urgence, fait un copier-coller des personnes présentes de la feuille urgence à la feuille travail dans le tableau rosé qui donc represente la nuit de la veille.
Est ce que jusque là ca passe? Je reconnais que ce n'est pas si simple à décrire.
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

Salut,

Je pense mieux comprendre. Voici un code qui boucle dans ta feuille Urgences et recopie dans Travail. Si ce ne sont pas les bonnes cellules qui sont copiées, il te suffira d'ajuster les références (rgT et rgU).

VB:
Sub Toto()
'copie des données de la feuille Urgences à Travail
Dim wsT As Worksheet, wsU As Worksheet
Dim rgT As Range, rgU As Range

Set wsT = Sheets("Travail")
Set wsU = Sheets("Urgences")
Set rgU = wsU.Range("A3")
Set rgT = wsT.Range("B33").End(xlUp)    '1re ligne où écrire dans Travail en haut de B33

Debug.Print rgT.Row
'On part de la cellule A3 et on vérifie chaque ligne si la colonne G n'est pas vide alors on
' recopie dans travail sur 1re ligne disponible entre les lignes 13 et 32
Do Until rgU.Value = ""
    If rgU.Offset(0, 6) <> 1 Then   'Si la cellule de la colonne G est vide alors on doit recopier
        '
        rgT = rgU.Offset(0, 1)  'le contenu de B dans Urgences est recopié dans Travail
        Set rgT = wsT.Range("B33").End(xlUp).Offset(1, 0) 'prochaine ligne
    End If
Set rgU = rgU.Offset(1, 0)  'on passe à la ligne suivante
Loop

End Sub

A+
 

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Hello,
j'ai adapté ton code en faisant quelques modifs cela pourrais fonctionner sauf que lors de la copie je me retrouve avec effectivement bien la recopie des cellules concernées en feuille URGENCES mais elles defillent toutes dans la case B13 et ne s'incrementent pas du tout en B14, B15.....etc.
Voilà le code que j'ai adapté:
Sub Toto()
'copie des données de la feuille Urgences à Travail
Dim wsT As Worksheet, wsU As Worksheet
Dim rgT As Range, rgU As Range

Set wsT = Sheets("Travail")
Set wsU = Sheets("Urgences")
Set rgU = wsU.Range("A3")
Set rgT = wsT.Range("B14").End(xlUp) '1re ligne où écrire dans Travail a partir de B13
Debug.Print rgU.Row
'On part de la cellule A3 et on vérifie chaque ligne si la colonne G n'est pas vide alors on
' recopie dans travail sur 1re ligne disponible entre les lignes 13 et 32
Do Until rgU.Value = ""
If rgU.Offset(0, 7) <> 1 Then 'Si la cellule de la colonne G est vide alors on doit recopier
'
rgT = rgU.Offset(0, 1) 'le contenu de B dans Urgences est recopié dans Travail
Set rgT = wsT.Range("B13").End(xlUp).Offset(1, 0) 'prochaine ligne
End If
Set rgU = rgU.Offset(1, 0) 'on passe à la ligne suivante
Loop

End Sub


Bonne soirée à toi.
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

C'est mon erreur, j'ai fait un changement de dernière minute sans valider...
Remplace :
Set rgT = wsT.Range("B13").End(xlUp).Offset(1, 0) 'prochaine ligne

par

Set rgT = rgT.Offset(1, 0) 'prochaine ligne

J'ai remarqué que tu as mis :
Set rgT = wsT.Range("B14").End(xlUp) '1re ligne où écrire dans Travail a partir de B13
au lieu de "B33" comme j'avais mis. En fait, si ton tableau est vide, tu peux écrire directement
Set rgT = wsT.Range("B13") '1re ligne où écrire dans Travail a partir de B13

Tu as aussi changé le
rgU.offset(0,6)
Fais attention car si tes données sont dans la colonne G, le offset est vraiment de 6 colonnes par rapport à la colonne A...
 

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Bonjour Grand Chaman,
j'ai fait quelques essais mais cela fonctionne en parti seulement. En faite, cela me recopie bien toutes les donnees au bon endroit mais cela me met aussi toutes celles que je ne veux pas garder. J'ai essayé plusieurs solutions mais rien y fait.
J'ai fais un fichier qui explique l'articulation de mon fichier. Encore une fois je te remercie de prendre du temps pour me donner ce coup de main.
 

Pièces jointes

  • Explication.xlsx
    17.9 KB · Affichages: 56
  • Explication.xlsx
    17.9 KB · Affichages: 62
  • Explication.xlsx
    17.9 KB · Affichages: 60

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

Bonjour,

Je pense que cette fois-ci ce sera mieux.
Voici ton fichier, j'ai légèrement modifié la macro que je t'avais envoyé hier.
Ça semble répliquer l'exemple que tu as fourni.

A+
 

Pièces jointes

  • Vers_test.xlsm
    111.4 KB · Affichages: 73

emsylvin69

XLDnaute Junior
Re : Problème de protection/déprotection

Re.
Parfait.
Ca Fonctionne et colle à l'exemple. Si je veux que les heures d'entrées ainsi que les modifications correspondantes soient aussi recopiées, puis-je reprendre la marco, l'adapter aux autres cellules et l'inclure à la macro d'origine?
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Problème de protection/déprotection

Oui, ça devrait fonctionner.
La base est là, il suffit d'adapter maintenant.
Il faudra probablement que tu adaptes cette ligne de code, une autre pour les heures d'entrées et une autre pour les modifications.
Code:
rgT = rgU.Offset(0, 1) 'le contenu de B dans Urgences est recopié dans Travail

Quelque chose comme :

Code:
rgT.Offset(0,1) = rgU.Offset(0, 2) 'le contenu de C dans Urgences est recopié dans Travail (C)
rgT.Offset(0,9) = rgU.Offset(0, 3) 'le contenu de E dans Urgences est recopié dans Travail (K)

A+
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 207
Membres
103 157
dernier inscrit
youma