Imbrication de plusieurs macro
Bonjour,
je cherche à faire une macro qui, si la valeur "S01" est présente dans une cellule précise (ici N1) :
- enlève la protection par mdp sur toutes les feuilles du classeur
- sélectionne certaines cellules bien précises pour les déverrouiller
- y supprimer le contenu
- remet la protection par mdp sur l'ensemble des feuilles du classeur (tout en laissant ces cellules déverouiller, les rendant ainsi modifiable en cas de S01 en N1 donc).
Alors j'ai bricolé a partir de marco que j'utilise et l'enregistrement d'Excel mais ça ne marche pas.
Pourriez-vous me corrier s'il vous plait ?
Je vous remercie.
'Si S01 est présent en N1
Sub creation_semaine()
If Range("N1") <> "S01" Then
End If
' Déprotection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Unprotect Password = "test"
Next i
' Selection des cellules a deproteger et a vider
Range("C7:C8").Select
Selection.Locked = False
Selection.FormulaHidden = False
Selection.ClearContents
' Protection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Protect Password = "test"
Next i
End Sub
Bonjour
Essaie ce code
'Si S01 est présent en N1
Sub creation_semaine()
If Range("N1") = "S01" Then
' Déprotection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Unprotect Password = "test"
Next i
' Selection des cellules a deproteger et a vider
Range("C7:C8").Locked = False
Range("C7:C8").FormulaHidden = False
Range("C7:C8").ClearContents
' Protection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Protect Password = "test"
Next i
End If
End Sub
Après pas mal de tests, je me suis apercu qu'il fallait que je le met en "auto open" car le contenu des cellules, c'est des hyperliens. Ca permet ainsi à la macro de virer les liens sans que ceux ci ne posent probleme.
Par contre, lorsque je protege la feuille avec "test", a l'ouverture il me dit erreur 1004 sur la ligne Worksheets(i).Unprotect Password = "test"
je ne comprend pas pourquoi la.
je remet le code modifié :
Sub auto_open()
'Si S01 est présent en M1
If Range("M1") = "S01" Then
' Déprotection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Unprotect Password = "test"
Next i
' Selection des cellules a deproteger et a vider
Range("C7:C8").Locked = False
Range("C7:C8").FormulaHidden = False
Range("C7:C8").ClearContents
' Protection automatique de toutes les feuilles d'un classeur
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Protect Password = "test"
Next i
End If
End Sub
Bonjour
Essaie ce code :
Sub creation_semaine()
If Range("N1") = "S01" Then
' Déprotection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
Set F = ActiveSheet
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
' Déprotection
Worksheets(i).Unprotect Password = "test"
' Selection des cellules a deproteger et a vider
Sheets(i).Range("C7:C8").Locked = False
Sheets(i).Range("C7:C8").FormulaHidden = False
Sheets(i).Range("C7:C8").ClearContents
' Protection automatique de toutes les feuilles d'un classeur
Worksheets(i).Select
ActiveSheet.Protect Password = "test"
Next i
F.Select
End If
End Sub
Bye !
J'utilise cette macro pour proteger mes classeurs :
Sub Protéger()
' Protection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
Dim Motdepasse As String
Motdepasse = InputBox("Entrer le mot de passe :", "Mettre la protection sur toutes les feuilles", "")
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Protect Password:=Motdepasse
Next i
End Sub
et ca me donne toujours cette erreur : Worksheets(i).Unprotect Password = "test"
Y'a un rapport avec ?
Bonjour
Pour la protection ( ainsi que pour la déprotection) la syntaxe est
Worksheets(i).Unprotect Password:= "test"
ActiveSheet.Protect Password:= "test"
Erreur assez courante : Combien de fois je l'ai faite
Je test !
Ok, ca fonctionne mais la macro que j'utilise déjà en auto_open posse probleme.
je continue de tester avant de revenir ici !
Sub auto_open()
If Range("M1") = "S01" Then
' Déprotection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
Set F = ActiveSheet
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
' Déprotection
Worksheets(i).Unprotect Password:="test"
' Selection des cellules a deproteger et a vider
Sheets(i).Range("C7:C8").Locked = False
Sheets(i).Range("C7:C8").FormulaHidden = False
Sheets(i).Range("C7:C8").ClearContents
' Protection automatique de toutes les feuilles d'un classeur
Worksheets(i).Protect Password:="test"
Next i
F.Select
End If
End Sub
Merde, je viens de m'apercoir d'une ÉNORME erreur, j'ai complètement oublié que lorsqu'une feuille est protégée, les macros n'y fonctionnent pas, j'ai complètement mis de cote cette EVIDENCE. Et du coup, je suis VRAIMENT dedans....
Je n'arrive pas a faire en sorte qu'a l'ouverture du classeur, la macro lance de la dé-protection de toutes les feuilles, applique ma macro de rechercher/remplacer puis reverrouille tout. Ca bloque
Sub auto_open()
' Déprotection automatique de toutes les feuilles d'un classeur
Dim nombre As Integer
Set F = ActiveSheet
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
' Déprotection
Worksheets(i).Unprotect Password:="test"
'Macro pour (STOCK N-1) via semaine precedente
Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
' Protection automatique de toutes les feuilles d'un classeur
Worksheets(i).Protect Password:="test"
Next i
End Sub
J'ai essayé de mélanger celle que vous m'avez aidé a faire et la mienne mais non, c'est pas bon. Il faut absolument que celle-ci fonctionne afin d'actualiser mes fichiers d'une année sur l'autre mais j'ai oublié cette foutue protection qui empeche toutes sorties de modifs (je travaille en mode non protégé). Je suis en panique totale là !!!
Bonjour
Tes feuilles sont dé-protégés et protégées au fur et à mesure de l'avancement de la macro
Bonjour
Avec des images pas évident de vérifier des variables,de voir quelle page est concernée etc ....
Ton fichier est indispensable dans ce cas
Car moi je ne vois pas, mais ce n'est que moi
Oui, je comprends tout à fait.
Je te fais un RAR ci-joint. Il faut le décompresser à la racine du disque dur (de manière à obtenir la bonne arborescence "C:\ZONE06"), le mot de passe employé est toujours "test"
Comme tu le verras, ce sont les cellules vertes qui sont concernées par ma macro d’actualisation (ce qui permet de dupliquer les feuilles d'une année sur l'autre), et vu que ce sont des cellules avec des liens, je dois les verrouiller pour eviter les agents ne les suppriment!
C'est pour ca que j'ai besoin de la macro qui a l'ouverture de la feuille, déprotège->autorise ma macro a actualiser-> puis reprotége toutes les feuilles.
Concernant la macro dont je parle au début de ce topic, si tu regardes bien, les cellules vertes appellent le classeur de la semaine précédente. Hors la première semaine de l'année, n'a pas de semaine précédente (il faut remonter a l'année N-1),
C'est pourquoi, je souhaite déprotèger les feuilles-> déverrouille les cellules vertes-> y supprimer le contenu->reprotege les feuilles. Comme ca en S01 les agents notent eux même le stock.
edit : je modifie le fichier RAR, il manquait un repertoire.
Bonjour
Bizarre bizarre
C'est le fait d'être masqué qui empêche la protection, why - I don't know
En mode pas-à-pas (avec une petite modification cela fonctionnait, mais en mode normal cela plantait)
Testes ces macros car il veut mettre à jour des liens que je n'ai pas
Sub auto_open()
' Déprotection automatique de toutes les feuilles d'un classeur
Dim Nombre As Integer
Set F = ActiveSheet
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
Oteprotection
For I = 1 To Nombre
'Macro pour (STOCK N-1) via semaine precedente
Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next I
Protection
End Sub
Sub Oteprotection()
Dim I As Integer, Nombre As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Worksheets(I).Unprotect Password:="test"
Next I
End Sub
Sub Protection()
Dim Cache As Integer
Dim I As Integer, Nombre As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Cache = Sheets(I).Visible
Sheets(I).Visible = xlSheetVisible
Worksheets(I).Protect Password:="test"
Sheets(I).Visible = Cache
Next I
End Sub
Bonsoir
Impossible de fermer l'oeil, cette histoire me stresse!
J'ai donc pris tes codes, Excel m'a demandé de corriger certains morceaux, voici ce que cela donne :
Sub auto_open()
' Déprotection automatique de toutes les feuilles d'un classeur
Dim I As Integer, Nombre As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Worksheets(I).Unprotect Password:="test"
Next I
'Macro pour (STOCK N-1) via semaine precedente
Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Dim Cache As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Cache = Sheets(I).Visible
Sheets(I).Visible = xlSheetVisible
Worksheets(I).Protect Password:="test"
Sheets(I).Visible = Cache
Next I
End Sub
Et ça semble fonctionner. Je suis trop K.O. pour approfondir le niveau de fonctionnement, je testerai à fond en me levant.
Si j'ai bien compris ce que tu as dis, les lignes cachées bloqueraient le fonctionnement prévu de la macro? C'est ca ?
En tout cas, merci mille fois, j'ai failli faire une attaque en me rendant compte de cet oublie majeur !!!
J'en ai profiter pour bricoler la macro en y ajoutant ce dont j'avais besoin en début de topic, ca donne ca
Sub auto_open()
' Déprotection automatique de toutes les feuilles d'un classeur
Dim I As Integer, Nombre As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Worksheets(I).Unprotect Password:="test"
Next I
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu
If Range("M1") = "S01" Then
Range("C9:C20").Select
Selection.Locked = False
Selection.FormulaHidden = False
Selection.ClearContents
End If
'Macro pour (STOCK N-1) via semaine precedente
Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
' Déprotection automatique de toutes les feuilles d'un classeur
Dim Cache As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Cache = Sheets(I).Visible
Sheets(I).Visible = xlSheetVisible
Worksheets(I).Protect Password:="test"
Sheets(I).Visible = Cache
Next I
End Sub
J'ai rapidement testé, ça a l'air de fonctionner mais je peux me tromper faute de temps pour la tester comme il faut.
Est ce que tu y vois quelquechose qui ne devrait pas s'y trouver? Est-elle améliorable ?
Merci encore!
ps : j'ai uploadé le fichier joint d'hier soir, m’étant aperçu que le répertoire n-1 était manquant mais tu l'avais déjà téléchargé!
Bonjour
Kev a écrit :Si j'ai bien compris ce que tu as dis, les lignes cachées bloqueraient le fonctionnement prévu de la macro? C'est ca ?
Pas les lignes cachées mais les feuilles
Pourquoi dans cette macro tu ne fais pas e remplacement dans toutes les feuilles l ?
Je ne comprends non plus le test sur M1, de quelle page, si tu as enregistré le fichier en ayant une page (A8 par exemple) à l'ouverture le test de la cellule se fera sur cette page
Pourquoi C8:C20 ?
Et de quelle page ?
Tout est peut-être normal mais je trouve ça un peu bizarre
Pourquoi dans cette macro tu ne fais pas e remplacement dans toutes les feuilles l ?
+++ parceque les cellules a vider se trouvent sur la feuille "AM"
Je ne comprends non plus le test sur M1, de quelle page, si tu as enregistré le fichier en ayant une page (A8 par exemple) à l'ouverture le test de la cellule se fera sur cette page
+++ Ah bien vu, j'avais laissé passer ce détails, il faut que ce soit sur l'onglet "AM" (vu pour un autre département ou la c'est sur plusieurs onglets a cause de leur organisation). Comment fait-on pour spécifier que cela ne se fasse que sur cet onglet ??
Pourquoi C8:C20 ?
+++ car C8:C20 correspondant au stock N-1. Pour la semaine 2 à la 52e de l'année, ca ne pose pas de problème, puisque la semaine précédente existe. Mais pour la première semaine de l'année, il n'y a pas de semaine précédente, il faut remonter à la semaine 52 de l'année précédente. Pour des raisons informatiques du taf, je ne peux pas remonter au répertoire de l'année N-1, donc il faut y virer les liens "stock semaine -1" pour la semaine 1.
Et comme on vire les liens, il faut autoriser du coup une saisie manuelle par les agents, tout en protégeant le reste du document.
C'est se faire des noeuds au cerveau mais j'ai tres peu de marge de manoeuvre (grosse restriction dans le cahier des charges).
Bonjour
Kev a écrit :parceque les cellules a vider se trouvent sur la feuille "AM"
Oui alors
Pourquoi déprotéger/protéger toutes les feuilles - Seulement la page AM aurait suffit ?
Banzai64 a écrit :Pourquoi C8:C20 ?
Et de quelle page ?
Pourquoi pas C8:C36 ?
Tu ne fais que sur la page AM cette Recherche/Remplacement - exact ?
Ce n'est juste que pour mon information personnelle, tant que pour toi c'est bien le résultat que tu attendais
Dans cette macro la Recherche/Remplacement ne se fait que dans la page AM et seulement si en M1 il y a S01
On déprotège/protège toutes les pages parce que ?
Sub auto_open()
Dim I As Integer, Nombre As Integer
Dim Cache As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
' Déprotection automatique de toutes les feuilles d'un classeur
For I = 1 To Nombre
Worksheets(I).Unprotect Password:="test"
Next I
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu
With Sheets("AM")
If .Range("M1") = "S01" Then
With .Range("C9:C20")
.Locked = False
.FormulaHidden = False
.ClearContents
End With
End If
'Macro pour (STOCK N-1) via semaine precedente
.Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End With
' Protection automatique de toutes les feuilles d'un classeur
For I = 1 To Nombre
Cache = Sheets(I).Visible
Sheets(I).Visible = xlSheetVisible
Worksheets(I).Protect Password:="test"
Sheets(I).Visible = Cache
Next I
End Sub
Banzai64 a écrit :Bonjour
Kev a écrit :parceque les cellules a vider se trouvent sur la feuille "AM"
Oui alors
Pourquoi déprotéger/protéger toutes les feuilles - Seulement la page AM aurait suffit ?
+++ Alors les fichiers du repertoire "RT", oui tu as raison, car le stock ne se trouve que sur la fiche AM et rien sur les fiches Agents. MAIS, pour les fiches situées dans le répertoire "PREV", il y a un stock sur chaque fiche agent.
Du coup cette macro va me servir pour d'autres fiches et ne sachant pas vraiment coder du VBA, je me dis que partir sur une macro "universelle" sur certaines fonction est la meilleure solution (et ca évite de demander aux gens des forums de m'aider).
Banzai64 a écrit :Pourquoi C8:C20 ?
Et de quelle page ?
Pourquoi pas C8:C36 ?
+++ Là aussi tu as raison, c’était juste pour un test rapide. J'ai effectivement corrigé ensuite lorsque j'ai vu quela macro fonctionnait.
Tu ne fais que sur la page AM cette Recherche/Remplacement - exact ?
Ce n'est juste que pour mon information personnelle, tant que pour toi c'est bien le résultat que tu attendais
Dans cette macro la Recherche/Remplacement ne se fait que dans la page AM et seulement si en M1 il y a S01
On déprotège/protège toutes les pages parce que ?
+++ Ah, j'ai répondu plus haut! Parceque sur d'autres fiches, les agents ont leur propre stock d'une semaine à l'autre. D'autant plus que pour la direction j'ai des classeurs excel qui eux ont beaucoup d'hyperliens sur différents onglets.
Sub auto_open() Dim I As Integer, Nombre As Integer Dim Cache As Integer Nombre = ActiveWorkbook.Sheets.Count Application.ScreenUpdating = False ' Déprotection automatique de toutes les feuilles d'un classeur For I = 1 To Nombre Worksheets(I).Unprotect Password:="test" Next I 'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu With Sheets("AM") If .Range("M1") = "S01" Then With .Range("C9:C20") .Locked = False .FormulaHidden = False .ClearContents End With End If 'Macro pour (STOCK N-1) via semaine precedente .Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End With ' Protection automatique de toutes les feuilles d'un classeur For I = 1 To Nombre Cache = Sheets(I).Visible Sheets(I).Visible = xlSheetVisible Worksheets(I).Protect Password:="test" Sheets(I).Visible = Cache Next I End Sub
Si je veux y ajouter plus d'onglet, je sépare par un ; non, comme ceci :
With Sheets("AM";"A1") ?
et si je veux que sur le classeur "PREVOYANCE", l'onglet STOCK, AM et A1 aie leur propre configuration, je refait 3 blocs différents genre comme ceci ? :
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu pour l'onglet STOCK
With Sheets("STOCK")
If .Range("M1") = "S01" Then
With .Range("C9:C20")
.Locked = False
.FormulaHidden = False
.ClearContents
End With
End If
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu pour l'onglet AM
With Sheets("AM")
If .Range("M1") = "S01" Then
With .Range("C19:C80")
.Locked = False
.FormulaHidden = False
.ClearContents
End With
End If
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu de l'onglet A1
With Sheets("A1")
If .Range("M1") = "S01" Then
With .Range("B20:B44")
.Locked = False
.FormulaHidden = False
.ClearContents
End With
End If
Je peux ajouter ce genre de partie comme ceci ?
Bonjour
Kev a écrit :Si je veux y ajouter plus d'onglet, je sépare par un ; non, comme ceci :
With Sheets("AM";"A1") ?
Non remplaces la partie correspondante par celle-ci (non testé)
Dim Ws As Worksheet
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu
For Each Ws In Sheets(Array("AM", "M1"))
If Ws.Range("M1") = "S01" Then
With Ws.Range("C8:C20")
.Locked = False
.FormulaHidden = False
.ClearContents
End With
End If
'Macro pour (STOCK N-1) via semaine precedente
Ws.Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next Ws
Kev a écrit :et si je veux que sur le classeur "PREVOYANCE", l'onglet STOCK, AM et A1 aie leur propre configuration, je refait 3 blocs différents genre comme ceci ?
Ok cela n'est pas mal
Top, t'as macro marche sauf qu'Excel a voulu que je rajoute un End With tout à la fin (je trouve ca étrange)
Sub auto_open()
' Déprotection automatique de toutes les feuilles d'un classeur
Dim I As Integer, Nombre As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Worksheets(I).Unprotect Password:="test"
Next I
'Si on se trouve en S01 alors on deverouille ces cellules puis on y supprime le contenu
With Sheets("AM")
If .Range("M1") = "S01" Then
With .Range("C9:C20")
.Locked = False
.FormulaHidden = False
.ClearContents
End With
End If
'Macro pour (STOCK N-1) via semaine precedente
Cells.Replace What:="2015\S01", Replacement:=Sheets("calendrier").Range("G14").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
' Déprotection automatique de toutes les feuilles d'un classeur
Dim Cache As Integer
Nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For I = 1 To Nombre
Cache = Sheets(I).Visible
Sheets(I).Visible = xlSheetVisible
Worksheets(I).Protect Password:="test"
Sheets(I).Visible = Cache
Next I
End With
End Sub
Une fois le rajout effectué, ça semble fonctionner !
C'était tres bien vu le coup de l'onglet!!! Excellent, j'allais une fois de plus passer à coté de l'évidence!!!
Bon je continue mes différents tests, merci beaucoup pour ton aide, tu n'as pas idée à quel point ton aide m'a été précieuse !