Cómo copiar sin la protección

Resuelto
Caroline -  
 Caroline -
Hola,

Tengo un gran archivo que contiene varias hojas de Excel. Las hojas están protegidas por contraseña. Un código VBA permite guardar una de estas hojas en una subcarpeta.

Luego, me gustaría tomar una hoja de una subcarpeta (guardada anteriormente) y guardarla en un nuevo libro eliminando la protección sin que tenga que escribir la contraseña. (Para que otros puedan modificar estas últimas sin que tenga que dar la contraseña). No puedo hacerlo. Gracias por tu ayuda.

4 respuestas

  1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 783
     
    Hola,

    Basta con copiar las celdas de la hoja protegida en una hoja en blanco.
    Por ejemplo (si la hoja 1 está protegida y la hoja 2 está en blanco):
    Worksheets(1).Cells.Copy Worksheets(2).Cells 

    --
    Atentamente
    Patrice
    0
    1. Caroline
       
      Hola y gracias por tu ayuda. Realmente no estoy familiarizada con los códigos, así que no entiendo mucho cómo ejecutarlo.

      Al mismo tiempo, es una hoja que me gustaría copiar en un nuevo libro y no en una segunda hoja.

      Esto, para luego enviarla por correo electrónico como archivo adjunto, en formato Excel. (ya que el destinatario no puede abrir archivos PDF)

      El propósito de esto: Al guardarla en un nuevo libro, no protegido, podremos eliminar los botones que contiene el formulario original que no sirven de nada al destinatario. (Estos botones inicialmente sirven para saltar de una hoja a otra en un libro grande). Debería ser posible que otras personas puedan hacer esto fácilmente sin necesidad de la contraseña de protección del archivo principal.

      Si no, he pensado en enviar por correo electrónico solo la parte imprimible de la hoja (usando la vista de saltos de página y poniendo en gris la parte que no quiero), pero ahí tampoco sé cómo hacerlo. UFF. Gracias si alguien puede ayudarme.

      Gracias
      0
  2. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 783
     
    Hola,

    Entonces adapta este código:
    Option Explicit Sub test() Dim wbk As Workbook Dim shp As Shape ' Crear un libro en blanco que contenga una sola hoja Set wbk = Workbooks.Add(xlWBATWorksheet) ' Copiar las celdas de la hoja deseada (a adaptar) ThisWorkbook.Worksheets("Feuil1").Cells.Copy wbk.Worksheets(1).Cells ' Eliminar todas las formas en la hoja For Each shp In wbk.Worksheets(1).Shapes shp.Delete Next shp End Sub

    --
    Cordialmente
    Patrice
    0
  3. Caroline
     
    Casi lo tenemos. :)

    El código funciona, pero el formato de la página debería mantenerse igual (ancho de las columnas, altura de las filas, tamaño de página). Al ejecutar el código, los formatos ya no son los mismos. Todo debería permanecer en una sola página para poder imprimir. Además, mi hoja contiene una imagen que desaparece cuando ejecuto el código; debería quedarse, excepto los botones. Pero si no es posible conservar la imagen, puedo prescindir de ella sin los botones.

    Muchas gracias, su ayuda es apreciada.
    0
  4. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 783
     
    Hola

    Los formatos permanecen iguales (ancho de columnas, formatos de celdas, MFC, ...), lo que puede cambiar es la altura de algunas filas y el diseño que no se copia.

    Para conservar la imagen, simplemente hay que conocer su nombre (aparece a la izquierda en la barra de fórmulas cuando la imagen está seleccionada), y se pueden copiar las alturas de las filas:

    Option Explicit Sub test() Dim wbk As Workbook Dim wsh As Worksheet Dim shp As Shape Dim rng As Range Application.ScreenUpdating = False ' Definir la hoja fuente Set wsh = ThisWorkbook.Worksheets("Feuil1") ' Crear un libro en blanco que contenga una sola hoja Set wbk = Workbooks.Add(xlWBATWorksheet) ' En la hoja 1 de este libro: With wbk.Worksheets(1) ' Copiar las celdas de la hoja fuente (a adaptar) wsh.Cells.Copy .Cells ' Copiar la altura de las filas For Each rng In .UsedRange.Rows rng.RowHeight = wsh.Rows(rng.Row).RowHeight Next rng ' Eliminar todas las formas en la hoja, excepto Imagen 1 For Each shp In .Shapes If shp.Name <> "Imagen 1" Then shp.Delete Next shp End With Application.ScreenUpdating = True End Sub 

    --
    Atentamente
    Patrice
    0
    1. Caroline
       
      Ahora funciona y, efectivamente, es el formato el que no se mantiene igual. Pero puedo revertirlo antes de enviar o imprimir el documento, a menos que, por supuesto, haya alguna manera de agregar este criterio en el código...

      ¡Muchas gracias! :)
      0
      1. Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención   1 783 > Caroline
         
        ```html
        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 
                    End If 
                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 
                    
                    ' Autres propriétés de mise en page 
                    .Zoom = wsh.PageSetup.Zoom 
                    .FitToPagesTall = wsh.PageSetup.FitToPagesTall 
                    .FitToPagesWide = wsh.PageSetup.FitToPagesWide 
                End With 
            End With 
            
            Application.ScreenUpdating = True 
        End Sub


        Patrice ```
        0
      2. Caroline > Patrice33740 Mensajes publicados 8400 Fecha de registro   Estado Miembro Última intervención  
         
        ¡Muchas gracias! Funciona.
        :)
        0