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.
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
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.
Para que te guarde todas las hojas guíate en el siguiente artículo
http://blogs.itpro.es/exceleinfo/2011/06/06/uso-de-for-each-next-en-vba-excel/
Para la cuestión de que no te deja grabar correctamente como archivo xlsm es un error que detecté, el cual lo corregié en estos días.
Error corregido.
Sergio muy bueno y muchísimas gracias.
¿si quisiera que la hoja que se guarda, se guarde sin formulas?
Muchas gracias de ante mano,
Qué tal.
Cuando el archivo esté creado, sólo ejecutas las siguientes líneas.
Cells.Copy
Cells.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Muchas gracias.
Saludos y excelentes articulos
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.
Para que te guarde todas las hojas guíate en el siguiente artículo
http://blogs.itpro.es/exceleinfo/2011/06/06/uso-de-for-each-next-en-vba-excel/
Para la cuestión de que no te deja grabar correctamente como archivo xlsm es un error que detecté, el cual lo corregié en estos días.
Error corregido.
Sergio muy bueno y muchísimas gracias.
¿si quisiera que la hoja que se guarda, se guarde sin formulas?
Muchas gracias de ante mano,
Qué tal.
Cuando el archivo esté creado, sólo ejecutas las siguientes líneas.
Cells.Copy
Cells.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Muchas gracias.
Saludos y excelentes articulos
si quiero que solo seguarde como archivo de excel normal ,que no este habilitado para macros
En la opción Tipo elijes .xlsx
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
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
Javier Alfageme
funciona perfectamente pero se le puede añadir algo para que guarde forma automática en una carpeta?
gracias.
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
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
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
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
Probaste guardar en todos los formato ? En cuáles te guarda las macros ?
gracias por tu respuesta, si lo trate de guardar como .xlsx y como .xls y no, las macros se copiaron. que podra ser? muchas gracias
En mi add-in ya tengo la herramienta probada. Lo puedes descargar de addin.exceleinfo.com
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
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
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
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
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