Comment copier sans la protection

Résolu
Caroline -  
 Caroline -
Bonjour,

J'ai un gros dossier qui contient plusieurs feuilles excel. Les feuilles y sont protégées par mot de passe. Un code VBA permet d'enregistrer une de ces feuilles dans un sous-dossier.

Je voudrais ensuite prendre une feuille d'un sous dossier (enregistré précédemment) et l'enregistrer dans un nouveau classeur en enlevant la protection sans que j'ai à taper le mot de passe. (pour que d'autre puissent modifier ces dernières sans que j'aie à donner le mot de passe). Je n'y arrive pas. Merci de m'aider.

4 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    Il suffit de copier les cellules de la feuille protégée dans un feuille vierge.
    Par exemple (si feuille 1 protégée et feuille 2 vierge) :
    Worksheets(1).Cells.Copy Worksheets(2).Cells
    
    0
    1. Caroline
       
      Bonjour et merci pour votre aide. Je ne suis vraiment pas familière avec les codes alors je ne comprends pas trop comment l'exécuter.

      En même temps c'est une feuille que je voudrais copier dans un nouveau classeur et non sur une seconde feuille.

      Ceci, pour ensuite envoyer cette dernière par courriel en pièce jointe, en format excel. (car le destinataire ne peut pas ouvrir les fichiers PDF)

      Le but de ceci: En l'enregistrant dans un nouveau classeur, non protégé, on pourra effacer les boutons que contient le formulaire original qui ne servent à rien au destinataire. (Ces boutons servent au départ à sauter d'une feuille à une autre dans un gros classeur). Il faudrait que d'autres personnes puissent faire ceci facilement sans avoir besoin du mot de passe de protection du fichier principal.

      Si non, j'ai pensé envoyer par courriel seulement la partie imprimable de la feuille (en utilisant l'affichage des sauts de page et en mettant en gris la partie que je ne veux pas) mais là non plus je ne vois pas comment faire. OUF. Merci si quelqu'un peut m'aider.

      Merci
      0
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    Alors adaptes ce code :
    Option Explicit
    Sub test()
    Dim wbk As Workbook
    Dim shp As Shape
      ' Créer un classeur vierge contenant une seule feuille
      Set wbk = Workbooks.Add(xlWBATWorksheet)
      ' Y copier les cellules de la feuille désirée (à adapter)
      ThisWorkbook.Worksheets("Feuil1").Cells.Copy wbk.Worksheets(1).Cells
      ' Supprimer toutes les formes posées sur la feuille
      For Each shp In wbk.Worksheets(1).Shapes
        shp.Delete
      Next shp
    End Sub
    0
  3. Caroline
     
    On y est presque. :)

    Le code fonctionne mais il faudrait que le format de page reste le même (largeur des colonnes, hauteur des lignes, grandeur de page. En exécutant le code, les formats ne sont plus les mêmes. Il faudrait que tout reste sur une seule page pour pouvoir imprimer. Aussi, ma feuille contient une image qui disparaît quand j'exécute le code, elle devrait rester, sauf les boutons. Mais si c'est pas possible de garder l'image, sans les boutons je peux laisser tomber l'image.

    Merci beaucoup votre aide est appréciée.
    0
  4. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour

    Les formats restent les mêmes (largeur des colonnes, Formats de cellules, MFC, ...), ce qui peut changer c'est la hauteur de certaines lignes et la mise en page qui n'est pas copiée !

    Pour conserver l'image, il suffit de connaître son nom (il apparaît à gauche sur la barre des formules lorsque l'image est sélectionnée), et on peur copier les hauteurs de lignes :

    Option Explicit
    Sub test()
    Dim wbk As Workbook
    Dim wsh As Worksheet
    Dim shp As Shape
    Dim rng As Range
      
      Application.ScreenUpdating = False
      ' Définir la feuille source
      Set wsh = ThisWorkbook.Worksheets("Feuil1")
      ' Créer un classeur vierge contenant une seule feuille
      Set wbk = Workbooks.Add(xlWBATWorksheet)
      ' Sur la feuille 1 de ce classeur :
      With wbk.Worksheets(1)
        ' Y copier les cellules de la feuille source (à adapter)
        wsh.Cells.Copy .Cells
        ' Copier la hauteur des lignes
        For Each rng In .UsedRange.Rows
          rng.RowHeight = wsh.Rows(rng.Row).RowHeight
        Next rng
        ' Supprimer toutes les formes posées sur la feuille, sauf Image 1
        For Each shp In .Shapes
          If shp.Name <> "Image 1" Then shp.Delete
        Next shp
      End With
      Application.ScreenUpdating = True
    End Sub
     
    0
    1. Caroline
       
      Cela fonctionne maintenant et effectivement, c'est la mise en page qui ne reste pas la même. Mais je peux la remettre avant d'envoyer ou imprimer le document, à moins bien sûr qu'il y ait une façon d'ajouter ce critère dans le code...

      Merci beaucoup! :)
      0
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783 > Caroline
         
        Avec les principales propriétés de mise en page (ne conserves que celles qui sont utiles, ajoutes celles manquent) :
        Option Explicit
        Sub test()
        Dim wbk As Workbook
        Dim wsh As Worksheet
        Dim shp As Shape
        Dim rng As Range
        Dim psu As PageSetup
          
          Application.ScreenUpdating = False
          ' Définir la feuille source
          Set wsh = ThisWorkbook.Worksheets("Feuil1")
          ' Créer un classeur vierge contenant une seule feuille
          Set wbk = Workbooks.Add(xlWBATWorksheet)
          ' Sur la feuille 1 de ce classeur :
          With wbk.Worksheets(1)
            ' Y copier les cellules de la feuille source (à adapter)
            wsh.Cells.Copy .Cells
            ' Copier la hauteur des lignes
            For Each rng In .UsedRange.Rows
              rng.RowHeight = wsh.Rows(rng.Row).RowHeight
            Next rng
            ' Supprimer toutes les formes posées sur la feuille, sauf Image 1
            For Each shp In .Shapes
              If shp.Name <> "Image 1" Then shp.Delete
            Next shp
            ' Copier la mise en page (principales propriétés)
            With .PageSetup
             ' Feuille
             .Orientation = wsh.PageSetup.Orientation
             .PaperSize = wsh.PageSetup.PaperSize
             .PrintArea = wsh.PageSetup.PrintArea
             ' Marges
             .TopMargin = wsh.PageSetup.TopMargin
             .BottomMargin = wsh.PageSetup.BottomMargin
             .RightMargin = wsh.PageSetup.RightMargin
             .LeftMargin = wsh.PageSetup.LeftMargin
             ' En têtes et pieds de page
             .RightFooter = wsh.PageSetup.RightFooter
             .CenterFooter = wsh.PageSetup.CenterFooter
             .LeftFooter = wsh.PageSetup.LeftFooter
             .RightHeader = wsh.PageSetup.RightHeader
             .CenterHeader = wsh.PageSetup.CenterHeader
             .LeftHeader = wsh.PageSetup.LeftHeader
            End With
          End With
          Application.ScreenUpdating = True
        End Sub


        Patrice
        0
      2. Caroline > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
         
        Merci infiniment! Cela fonctionne.
        :)
        0