Error al guardar 2 hojas de un libro mediante macro

Tengo un libro en el cual tengo 5 hojas.

Con una macro guardo una hoja en una carpeta especifica, el código funciona correctamente.

Ahora cuando quiero usar el mismo código haciendo las modificaciones (que creo son correctas) me da un error que no sucede cuando guardo una hoja.

El código que utilizo y no me da error es:

Sub guardar_hoja1()
Dim nombre As String
Ruta = "C:\Users\Usuario\Downloads\hojas1\"
nombre = Sheets("hoja1").Range("B1").Value
ActiveSheet.Copy
ActiveSheet.SaveAs Filename:=Ruta & nombre & ".xlsx"
ActiveWorkbook.Close True
End Sub

El código que uso para guardar 2 hojas es:

Sub guardar_hoja4_5()
Dim nombre As String
Ruta = "C:\Users\Usuario\Downloads\hojas4-5\"
nombre = Sheets("hoja4").Range("C1").Value

Sheets(Array("hoja4","hoja5")).Copy

ActiveSheet.SaveAs Filename:=Ruta & nombre & ".xlsx"
ActiveWorkbook.Close True
End Sub

Al ejecutar me sale un cartel que dice:

Las siguientes características no se pueden guardar en libros sin macros:

Proyecto de VBA

Para guardar un archivo con estas características, haga en No y a continuación, elija un tipo de archivo habilitado para macros en la lista Tipo de archivo.

Para seguir guardando el archivo como libro sin macros, haga clic en Sí.

Cuando pongo en NO, me sale un cartel para finalizar o depurar.

Si coloco depurar, la línea resaltada en amarillo es:

ActiveSheet.SaveAs Filename:=Ruta & nombre & ".xlsx"

Me resulta raro porque uso la misma extensión en la macro donde guardo solo una hoja y esta hoja tiene macros y no da error.

Estimo que hay algún error en alguna línea, pero no logro darme cuenta cual es.

Respuesta
3

Las macros están correctas. Pero si tenés algún código en el objeto HOJA te saldrá este mensaje porque estás intentando guardarlo como libro sin macros.

Comentás que la Hoja1 tiene macros, pero seguramente no están en el Editor en el objeto Hoja1, sino en módulos. Y en ese caso no te aparecerá el mensaje de error.

Revisá las otras hojas, quizás tengas botones del tipo ActiveX o algún evento de Hoja que te impide guardarlo como xlsx.

Lamento contradecirte Dante, pero las 2 macros del usuario corren correctamente, si no tienen código en los eventos o botones ActiveX de las hojas 4 y 5.

Es cierto que con la instrucción DisplayAlerts en False sobreescribe si hubiese ya un archivo con igual nombre.

Pero el tema de guardarlo como libro no es necesario. Con ActiveSheet corre perfecto, por lo menos en versión 365. Y el usuario tampoco tiene problemas con la primer macro que también se guarda como libro.

El problema está en que se intenta guardar como xlsx cuando alguna hoja tiene macros. Si tiene botones asignados a macros ubicadas en módulo, no hay problemas. Solo con los controles ActiveX o eventos de hoja.

Sdos!

¡Gracias! 

Elsa es tal cual usted dice, en la hoja 5 tengo evento de Hoja, pero no puedo eliminarlo porque cumple una función.

Como puedo modificar la macro para que se mantenga el evento y poder guardar el archivo.

En ese caso lo tenés que guardar como libro xlsm:

ActiveSheet.SaveAs Filename:=Ruta & nombre & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled

Sdos!

¡Gracias! Elsa

Ha sido usted muy amable

Había probado cambiando guardar el archivo como "xlsm", pero me faltaba el resto del código.

Nuevamente muchas gracias

Atentamente

CSI

1 respuesta más de otro experto

Respuesta
1

Utiliza

Application.DisplayAlerts = False

Para que no te envíe el aviso y pueda sobreescribir el archivo en caso de que ya exista.

También cambia en esta línea ActiveSheet por ActiveWorkbook, lo que vas a guardar es un libro.

ActiveSheet.SaveAs Filename:=Ruta & nombre & ".xlsx"

Prueba así:

Sub guardar_hoja4_5()
  Dim nombre As String, Ruta As String
  '
  Application.DisplayAlerts = False
  '
  Ruta = "C:\Users\Usuario\Downloads\hojas4-5\"
  nombre = Sheets("hoja4").Range("C1").Value
  '
  Sheets(Array("hoja4", "hoja5")).Copy
  '
  ActiveWorkbook.SaveAs Filename:=Ruta & nombre & ".xlsx"
  ActiveWorkbook.Close True
End Sub

Si quieres revisar si las hojas tienen código.

Si tienen código, entonces guardar como macros, si no tienen, entonces guardar como archivo de Excel normal.

Copia todo el código incluyendo la función VerificaCodigo. Ejecuta la macro guardar_hoja1 o guardar_hoja4_5

Sub guardar_hoja1()
  Dim nombre As String, Ruta As String, ext As String
  Dim frm As XlFileFormat
  Dim wb As Workbook
  '
  Application.DisplayAlerts = False
  '
  Ruta = "C:\Users\Usuario\Downloads\hojas4-5\"
  nombre = Sheets("hoja1").Range("B1").Value
  '
  Sheets("Hoja1").Copy
  '
  Set wb = ActiveWorkbook
  If VerificaCodigo(wb) = True Then
    ext = ".xlsm"
    frm = xlOpenXMLWorkbookMacroEnabled
  Else
    ext = ".xlsx"
    frm = xlOpenXMLWorkbook
  End If
  wb.SaveAs Filename:=Ruta & nombre & ext, FileFormat:=frm
  wb.Close False
End Sub
'
Sub guardar_hoja4_5()
  Dim nombre As String, Ruta As String, ext As String
  Dim frm As XlFileFormat
  Dim wb As Workbook
  '
  Application.DisplayAlerts = False
  '
  Ruta = "C:\Users\Usuario\Downloads\hojas4-5\"
  nombre = Sheets("hoja4").Range("C1").Value
  '
  Sheets(Array("hoja4", "hoja5")).Copy
  '
  Set wb = ActiveWorkbook
  If VerificaCodigo(wb) = True Then
    ext = ".xlsm"
    frm = xlOpenXMLWorkbookMacroEnabled
  Else
    ext = ".xlsx"
    frm = xlOpenXMLWorkbook
  End If
  wb.SaveAs Filename:=Ruta & nombre & ext, FileFormat:=frm
  wb.Close False
End Sub
'
Function VerificaCodigo(wb As Workbook) As Boolean
  Dim sh As Worksheet
  For Each sh In wb.Sheets
    If wb.VBProject.VBComponents(sh.CodeName).CodeModule.CountOfLines > 2 Then
      VerificaCodigo = True
    End If
  Next
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas