Macro para guardar hoja activa como archivo nuevo en Excel

Esta macro que les comparto viene incluída en la reciente versión de EXCELeINFO add-in y en lo personal es una macro que uso mucho.

Cómo funciona

En caso de que la estructura del archivo o ventanas no estén protegidas, pregunta si deseamos guardar la hoja. Si decimos que sí, se procede a copiar la hoja y nos muestra el formulario de Guardar como. La macro permite guardar con las extensiones .xls, .xlsx, .xlsm y .csv.

Guardar hoja como archivo nuevo

Código de la macro

Fe de erratas: Se añade un Select Case para detectar correctamente el tipo de archivo a guardar.

Option Explicit
'
Sub EXCELeINFOGuardarHojaComoArchivoNuevo()
'
'Declaramos las variables.
Dim VentanasProtegidas As Boolean
Dim EstructuraProtegida As Boolean
Dim NombreHoja As String
Dim Confirmacion As String
Dim NombreArchivo As String
Dim GuardarComo As Variant
Dim Extension As String
'
'En caso de error.
On Error GoTo ErrorHandler
'
'Validamos si la ventana o la estructura del archivo están protegidos.
VentanasProtegidas = ActiveWorkbook.ProtectWindows
EstructuraProtegida = ActiveWorkbook.ProtectStructure
'
'En caso de estar protegidas mostramos mensaje.
If VentanasProtegidas = True Or EstructuraProtegida = True Then
    MsgBox "No se puede ejecutar el comando cuando la estructura del archivo está protegida.", _
           vbExclamation, "EXCELeINFO"
Else
    '
    'Copiamos la hoja y guardamos.
    NombreHoja = ActiveSheet.Name
    Confirmacion = MsgBox("Desea guardar la hoja '" & NombreHoja & "' como archivo nuevo?", _
                          vbQuestion + vbYesNo, "EXCELeINFO")
    Application.ScreenUpdating = False
    If Confirmacion = vbYes Then
        ActiveSheet.Select
        ActiveSheet.Copy
        NombreArchivo = ActiveWorkbook.Name
        GuardarComo = Application.GetSaveAsFilename(InitialFileName:=NombreHoja, _
            fileFilter:="Libro de Excel(*.xlsx), *.xlsx, Libro de Excel habilitado para macros(*.xlsm), *.xlsm, Libro de Excel 97-2003(*.xls), *.xls,CSV (delimitado por comas)(*.csv),*.csv", _
            Title:="EXCELeINFO - guadar hoja activa como archivo nuevo.")
        If GuardarComo = False Then
            Workbooks(NombreArchivo).Close SaveChanges:=False
        Else
            With Application.WorksheetFunction
                Extension = .Trim(Right(.Substitute(GuardarComo, ".", .Rept(" ", 500)), 500))
            End With

            Select Case Extension
            Case Is = "xlsx"
                ActiveWorkbook.SaveAs GuardarComo
            Case Is = "xlsm"
                ActiveWorkbook.SaveAs GuardarComo, xlOpenXMLWorkbookMacroEnabled
            Case Is = "xls"
                ActiveWorkbook.SaveAs GuardarComo, xlExcel8
            Case Is = "csv"
                ActiveWorkbook.SaveAs GuardarComo, xlCSV
            Case Else
                ActiveWorkbook.SaveAs GuardarComo
            End Select
        End If
    Else
    End If
    '
End If
'
Exit Sub
'
'En caso de error mostramos un mensaje.
ErrorHandler:
MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, "EXCELeINFO"
Workbooks(NombreArchivo).Close SaveChanges:=False
'
End Sub

You may also like...

35 Responses

  1. Joan Æ Felippe says:

    Muchas gracias, me ha servido mucho esta información.

    En mi caso, necesito que me guarde todas las hojas del libro, no solo una. Qué debo de modificar?

    Cuando le doy guardar le doy en la opción de “Libro de Excel habilitado para macros(*.xlsm)” y me sale (Las siguientes características no se pueden en libro sin macros: Proyecto de VB)

    He copiado tal cual esta esta formula que has publicado.

  2. Joan Æ Felippe says:

    Muchas gracias, me ha servido mucho esta información.

    En mi caso, necesito que me guarde todas las hojas del libro, no solo una. Qué debo de modificar?

    Cuando le doy guardar le doy en la opción de “Libro de Excel habilitado para macros(*.xlsm)” y me sale (Las siguientes características no se pueden en libro sin macros: Proyecto de VB)

    He copiado tal cual esta esta formula que has publicado.

  3. Fernando Carrancá says:

    Sergio muy bueno y muchísimas gracias.

    ¿si quisiera que la hoja que se guarda, se guarde sin formulas?

    Muchas gracias de ante mano,

    • sergioacamposh says:

      Qué tal.

      Cuando el archivo esté creado, sólo ejecutas las siguientes líneas.

      Cells.Copy
      Cells.PasteSpecial Paste:=xlPasteValues
      Application.CutCopyMode = False

  4. hector says:

    si quiero que solo seguarde como archivo de excel normal ,que no este habilitado para macros

  5. Anibal Gallegos says:

    Hola, muy buena aplicación, pero como haría si al escoger guardar la hoja en xlsx, se guardara sin formulas, sin macros ni los botones que tenga la hoja, además que tuviera la opción de guardar todas las hojas excepto las ocultas, si es posible.

    Agradecería mucho tu ayuda

  6. Anibal Gallegos says:

    Hola, muy buena aplicación, pero como haría si al escoger guardar la hoja en xlsx, se guardara sin formulas, sin macros ni los botones que tenga la hoja, además que tuviera la opción de guardar todas las hojas excepto las ocultas, si es posible.

    Además hay un problema cuando se detecta que hay un archivo con el mismo nombre

    Agradecería mucho tu ayuda

  7. javier alfageme says:

    Javier Alfageme
    funciona perfectamente pero se le puede añadir algo para que guarde forma automática en una carpeta?
    gracias.

    • sergioacamposh says:

      Hola.

      Primer define en una variable la ruta por default que desees y despué usa ChDir para que ese sea por defecto.

      RutaArchivo = ActiveWorkbook.Path
      ChDir RutaArchivo

  8. David Pérez says:

    Hola muy buena la macro, buscava algo que hiciera algo similar y de momento como base para lo que necesito me va de lujo pero quisiera incluirle alguna modificacion para acabar de adaptarla a mis necesidades y quisera saber si me puedes ayudar, de momento he visto que una vez guardado el archivo nuevo este se queda abierto como libro activo de manera que al final de la macro entre el “end if” y el “exit sub” le he añadido el comando “activeworkbook.close (false)” de manera que me cierre el nuevo archivo y vuelva a quedar activo el libro de origen. Lo que quisera es que esta macro se me ejecutase al hacer click sobre el icono de “Guardar” o cuando al cerrar el libro este me pregunta si deseo guardar los cambios o no de manera que al guardar nunca me sobrescriba el libro de origen y siempre me cree un archivo nuevo.
    Seguro que no debe ser muy complicado pero no acabo de encontrar la forma, gracias

  9. Isaac says:

    Muchas gracias, excelente funciona al 100, gracias, una pregunta, si quisiera que me guarde sin la macros, que tendria que modificar muchas gracias.

    • Hola. Cambia esta línea:

      Case Is = “xlsx”
      ActiveWorkbook.SaveAs GuardarComo

      Por esta:

      Case Is = “xlsx”
      ActiveWorkbook.SaveAs GuardarComo, FileFormat:=xlOpenXMLWorkbook

      • Isaac says:

        muchas gracias por tu respuesta, lo trate queda de esta forma,

        Select Case Extension

        Case Is = “xlsx”

        ActiveWorkbook.SaveAs GuardarComo, FileFormat:=xlOpenXMLWorkbook

        Case Is = “xlsm”

        ActiveWorkbook.SaveAs GuardarComo, xlOpenXMLWorkbookMacroEnabled

        Case Is = “xls”

        ActiveWorkbook.SaveAs GuardarComo, xlExcel8

        Case Is = “csv”

        ActiveWorkbook.SaveAs GuardarComo, xlCSV

        Case Else

        ActiveWorkbook.SaveAs GuardarComo

        End Select

        End If

        Si guarda y todo, solamente las macros se siguen guardando tambien, que podra ser, para que ya no se guarden?
        Muchas gracias de antemano

  10. Luisa says:

    Hola,
    Por ejemplo , yo tengo esto pero es para autoguardar todo el libro, en una ruta especifica, y , además , te guarda el nuevo archivo con el texto de la celda indicada (B8) y con un numero al costado.
    Por ejemplo si B8=METRO se guarda como FacturaMetro_v1.xlsm y si vuelvo a usar Metro otra vez saldria FacturaMetro_v(cualquiernumero). y así va cambiando , me va perfecto , lo malo es que es para todo el libro , yo quisiera que solo fuera para la hoja activa y no todo el libro.
    Además no sé si podria para autoguardarlo solo como .xlsx y no para macros . Como veras gaudead en .xlsm ,lo que no me conviene es que sea todo el libro.Pero con que guarde solo la hoja me ayudarias un monton.Agardecería que me mandes la macro actualizada, ya que soy nueva en esto .

    Te dejo el macro que tengo

    Sub GuardarVersion()
    ‘poner en ruta lo que aparece en propiedades de la ubicación que quieras
    ruta = “C:UsersuserDesktopFACTURAS”
    If InStr(ActiveWorkbook.Name, “_v”) = 0 Then
    nombre = ruta & “Factura ” & Range(“B8”).Value & “_v1.xlsm”
    Else
    n = CInt(Split(Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) – InStr(ActiveWorkbook.Name, “_v”) – 1), “.”)(0))
    n = n + 1
    nombre = ruta & “Factura” & Range(“B8”).Value & “_v” & n & “.xlsm”
    End If
    ActiveWorkbook.SaveAs (nombre)
    End Sub

    • Hola Luisa.

      Le hice unos cambios mínimos a la macro para que se guarde solo la hoja activa, pero toma en cuenta que al guardarse la hoja como XLSX queda sin macros.

      Sub GuardarVersion()
      ‘poner en ruta lo que aparece en propiedades de la ubicación que quieras
      ruta = “C:UsersTelcelDesktop”
      If InStr(ActiveWorkbook.Name, “_v”) = 0 Then
      nombre = ruta & “Factura ” & Range(“B8”).Value & “_v1.xlsx”
      Else
      n = CInt(Split(Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) – InStr(ActiveWorkbook.Name, “_v”) – 1), “.”)(0))
      n = n + 1
      nombre = ruta & “Factura” & Range(“B8”).Value & “_v” & n & “.xlsx”
      End If

      ‘Copiamos la hoja activa
      ActiveSheet.Copy

      ActiveWorkbook.SaveAs (nombre)

      End Sub

      • Luisa says:

        Muchísimas gracias. enserio, estaba con esto hace dos días . Una consulta extra como podría configurar el código para guardarlo como pdf. Asi como está tal cual , pero en formato pdf .
        Gracias.

        • Para PDF este ejemplo:

          ‘ Save as PDF
          ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SaveFolder & DocName, Quality:=xlQualityStandard, _
          IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
          True

          • Luisa says:

            En qué parte de la macro que me mandaste lo insertaría?

          • Hola.

            Si quieres guardar como PDF, quita esta línea:

            ActiveSheet.Copy

            Y reemplaza esta línea:

            ActiveWorkbook.SaveAs (nombre)

            Por:

            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=name, Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= True

          • Luisa says:

            Gracias, Me funcionó. Tengo una ultima consulta con respecto de la macro que me enviaste para que se guarde solo como .xlsx , es que me funciona genial , pero me lo guarda y se abre automáticamente , yo lo que quisiera es que guarde nada mas y no se abra inmediatamente .
            Te dejo aquí la macro que me enviaste y que he adaptado a mi necesidad para que veas que le falta .

            Sub GuardarVersion()
            ‘poner en ruta lo que aparece en propiedades de la ubicación que quieras
            ruta = “C:UsersuserDesktopBase de Datos”
            If InStr(ActiveWorkbook.Name, “_v”) = 0 Then
            nombre = ruta & Range(“K3”).Value & Range(“B8”).Value & “_v1.xlsx”
            Else
            n = CInt(Split(Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) – InStr(ActiveWorkbook.Name, “_v”) – 1), “.”)(0))
            n = n + 1
            nombre = ruta & Range(“K3”).Value & Range(“B8”).Value & “_v” & n & “.xlsx”
            End If
            ‘Copiamos la hoja activa
            ActiveSheet.Copy
            ActiveWorkbook.SaveAs (nombre)
            End Sub

            Gracias de antemano .

          • Al final de la macro añade esto para que se cierre el archivo nuevo:

            NombreArchivo = ActiveWorkbook.Name
            Workbooks(NombreArchivo).Close SaveChanges:=False

          • Luisa says:

            Me sirvió , pero ahora mira finalmente me quedo esto: como podria hacer para que en vez de que me guarde como .xlsx me guarde como para macros , ya que he visto ue no me funciona solo como hoja de excel.

            Te dejo la macro final

            Sub GuardarVersion()
            ‘poner en ruta lo que aparece en propiedades de la ubicación que quieras
            ruta = “C:UsersuserDesktopINVENTARIO”
            If InStr(ActiveWorkbook.Name, “_v”) = 0 Then
            nombre = ruta & Range(“K3”).Value & Range(“B8”).Value & “_v1.xlsx”
            Else
            n = CInt(Split(Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) – InStr(ActiveWorkbook.Name, “_v”) – 1), “.”)(0))
            n = n + 1
            nombre = ruta & Range(“K3”).Value & Range(“B8”).Value & “_v” & n & “.xlsx”
            End If
            ‘Copiamos la hoja activa
            ActiveSheet.Copy
            ActiveWorkbook.SaveAs (nombre)
            ‘PARA QUE SE GUARDE AUTOMATICAMENTE
            NombreArchivo = ActiveWorkbook.Name
            Workbooks(NombreArchivo).Close SaveChanges:=False
            End Sub

            Sub GuardarProforma()
            ‘poner en ruta lo que aparece en propiedades de la ubicación que quieras
            ruta = “C:UsersuserDesktopPDF”
            If InStr(ActiveWorkbook.Name, “_v”) = 0 Then
            nombre = ruta & Range(“K3”).Value & Range(“B8”).Value & “_v1.xlsx”
            Else
            n = CInt(Split(Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) – InStr(ActiveWorkbook.Name, “_v”) – 1), “.”)(0))
            n = n + 1
            nombre = ruta & Range(“K3”).Value & Range(“B8”).Value & “_v” & n & “.xlsx”
            End If
            ‘Copiamos la hoja activa
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nombre, Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
            End Sub

          • En la misma macro de este artículo viene la opción para que se guarde como xlsm:

            ActiveWorkbook.SaveAs nombre, xlOpenXMLWorkbookMacroEnabled

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: