Deprotéger plusieurs feuilles

Résolu
Emilie -  
ThauTheme Messages postés 1564 Statut Membre -
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,

5 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    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...)
    0
  2. Emilie
     
    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.
    0
  3. ThauTheme Messages postés 1564 Statut Membre 160
     
    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.
    0
  4. Emilie
     
    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,
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ThauTheme Messages postés 1564 Statut Membre 160
     
    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...
    0
    1. Emilie
       
      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
      0
      1. ThauTheme Messages postés 1564 Statut Membre 160 > Emilie
         
        Oui c'est ça ! Ce n'est pas bien grave mais c'est plus clair pour celui ou celle qui aurait à retravailler ton code...
        0