Comment copier sans la protection

Résolu/Fermé
Caroline - 19 avril 2016 à 23:03
 Caroline - 20 avril 2016 à 22:23
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.
A voir également:

4 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
20 avril 2016 à 00:08
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
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
20 avril 2016 à 17:37
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
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
20 avril 2016 à 20:52
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
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775 > Caroline
20 avril 2016 à 21:54
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
Caroline > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
20 avril 2016 à 22:23
Merci infiniment! Cela fonctionne.
:)
0