Signaler

Deprotéger plusieurs feuilles [Résolu]

Posez votre question Emilie - Dernière réponse le 14 févr. 2017 à 17:17 par ThauTheme
Bonjour,

Je dois enregistrer de manière mensuelle une copie d'un classeur protégé, en écrasant les formules (copier/coller valeurs). Il faut donc que j'ôte la protection pour chaque feuille (sachant que j'ai oublié le mot de passe !!!).

Pour déprotéger j'ai trouvé ça ;
Sub enleve_protection()
Dim a, b, c, d, e, f, g, h, i, j, k, l As Integer
On Error Resume Next
For a = 65 To 66
For b = 65 To 66
For c = 65 To 66
For d = 65 To 66
For e = 65 To 66
For f = 65 To 66
For g = 65 To 66
For h = 65 To 66
For i = 65 To 66
For j = 65 To 66
For k = 65 To 66
For l = 32 To 126
ActiveSheet.Unprotect Chr(a) & Chr(b) & Chr(c) & Chr(d) & Chr(e) & Chr(f) & Chr(g) & Chr(h) & Chr(i) & Chr(j) & Chr(k) & Chr(l)
If ActiveSheet.ProtectContents = False Then
Exit Sub
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
End Sub


Mon problème est que la macro le fait pour un onglet, j'aurais aimé sur tous.

Merci d'avance,
Afficher la suite 
Utile
+0
plus moins
Bonjour Émilie,

Essaie comme ça :

Sub Copie_TBX()
Dim Feuille As Worksheet
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, f As Integer
Dim g As Integer, h As Integer, i As Integer, j As Integer, k As Integer, l As Integer

Workbooks.Open Filename:="MON FICHIER.xlsx", UpdateLinks:=0
ActiveWorkbook.SaveAs Filename:="MON FICHIER MENSUEL.xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
For Each Feuille In ActiveWorkbook.Worksheets
    On Error Resume Next
    For a = 65 To 66
        For b = 65 To 66
            For c = 65 To 66
                For d = 65 To 66
                    For e = 65 To 66
                        For f = 65 To 66
                            For g = 65 To 66
                                For h = 65 To 66
                                    For i = 65 To 66
                                        For j = 65 To 66
                                            For k = 65 To 66
                                                For l = 32 To 126
                                                    ActiveSheet.Unprotect Chr(a) & Chr(b) & Chr(c) & Chr(d) & Chr(e) & Chr(f) & Chr(g) & Chr(h) & Chr(i) & Chr(j) & Chr(k) & Chr(l)
                                                    If ActiveSheet.ProtectContents = False Then
                                                        GoTo suite
                                                    End If
                                                Next l
                                            Next k
                                        Next j
                                    Next i
                                Next h
                            Next g
                        Next f
                    Next e
                Next d
            Next c
        Next b
    Next a
suite:
    Feuille.Select
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Range("A1").Select
Next Feuille
feuilleRef.Activate
ActiveWorkbook.Save
ActiveWindow.Close
End Sub


Petite remarque sur la déclaration des variables. Tu peux déclarer plusieurs variables dans la même ligne mais il faut spécifier le type de chacune d'entre elles sinon elle prendra le type Variant par défaut (le plus gourmand en mémoire...)
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Merci pour le code. Toutefois ça ne fonctionne pas. Le fichier se créé mais il ne répond plus.

J'ai supprimer le copier coller dans la macro, ça créé la copie mais ne deprotège que la feuille active.
Donnez votre avis
Utile
+0
plus moins
Re,

Pourtant le code de déprotection est à l'intérieur de la boucle des onglets (feuilles) !... Mais, reste à savoir si il est efficace à 100%... J'en doute.
Donnez votre avis
Utile
+0
plus moins
J'ai réussi :

Après avoir créé la macro qui enlève la protection (enleve_protection) à part voici le code :

Sub Copier_calculatrice()
Workbooks.Open Filename:= _
"MONFICHIER DE BASE.xlsx"
ActiveWorkbook.SaveAs Filename:= _
"MONFICHIERMENSUEL.xlsx" _

, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

Dim Feuille As Worksheet, mémo As Boolean, feuilleRef As Worksheet

Application.ScreenUpdating = False

Set feuilleRef = ActiveSheet

For Each Feuille In Worksheets
Feuille.Select
Application.Run "'MON FICHIER DE TRAVAIL.xlsm'!enleve_protection"

Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("A1").Select

Next Feuille
feuilleRef.Activate

Application.CutCopyMode = False
Application.ScreenUpdating = True
ActiveWorkbook.Save
ActiveWindow.Close

End Sub


Merci de ton aide,
Donnez votre avis
Utile
+0
plus moins
Finalement, pratiquement le même code du début ! Non ?...

Évite les accents dans l'utilisation d'un nom de variable (mémo). Variable qui par ailleurs ne sert à rien puisqu'elle n'est ni initialisée ni utilisée dans le reste du code...
Emilie- 14 févr. 2017 à 14:13
Oui pratiquement, mais je n'avais pas pensé à le faire de cette manière.
Je bidouille en vba, donc c'est des bribes de code trouvé à droite, à gauche...
"Memo as boolean" peut être supprimer, c'est ça ?

Un jour j'irai me former sérieusement
Répondre
ThauTheme 4337Messages postés mardi 21 octobre 2014Date d'inscription 8 août 2017 Dernière intervention - 14 févr. 2017 à 17:17
Oui c'est ça ! Ce n'est pas bien grave mais c'est plus clair pour celui ou celle qui aurait à retravailler ton code...
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !