¿Cómo aplicar macro en hojas activas de libro? ¿Cómo resolver un mensaje de error NEXT sin For en VBA?

Estoy empezando a usar VBA y me imagino que como hace mucha gente voy copiando compilaciones que funcionan y adaptándolas a los que yo quiero hacer. En este caso quiero que la macro guarde un libro que tiene varias hojas, algunas ocultas y otras no, sin las fórmulas, es decir, obtener el mismo libro, con otro nombre y sólo con los valores de las celdas de las hojas activas en el libro inicial.

He encontrado una compilación que al parecer funciona, es la siguiente:

Sub GuardarSinFormulas()
Application.ScreenUpdating = False
Dim copia As String
copia = Left(ThisWorkbook.FullName, _
Len(ThisWorkbook.FullName) - 4) & " (Sin fórmulas).xls"
ActiveWorkbook.SaveCopyAs copia
Workbooks.Open copia
With ActiveWorkbook
For Each hoja In .Sheets
hoja.Rows("1:200").Value = hoja.Rows("1:200").Value
Next
Call EliminarHojasOcultas
Call EliminsProyectosVbaTodos
.Save
.Close
End With
Application.ScreenUpdating = True
End Sub


Sub EliminarHojasOcultas()
Application.DisplayAlerts = False
For i = Sheets.Count To 1 Step -1
If Sheets(i).Visible = False Then
Sheets(i).Delete
End If
Next i
Application.DisplayAlerts = True
End Sub


Sub EliminsProyectosVbaTodos()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Set VBProj = ActiveWorkbook.VBProject
For Each VBComp In VBProj.VBComponents
If VBComp.Type = vbext_ct_Document Then
Set CodeMod = VBComp.CodeModule
With CodeMod
.DeleteLines 1, .CountOfLines
End With
Else
VBProj.VBComponents.Remove VBComp
End If
Next VBComp
End Sub

Mi problema es que en mi libro tengo tablas dinámicas y por algún motivo, esta complicación da error con las tablas dinámicas. Como las tablas dinámicas las tengo en hojas ocultas y no me hace falta aplicar la macro, estoy modificando la complicación para que se aplique sólo a las hojas activas

Para ello he hecho esto:

Sub GuardaSinformulas()
Application.ScreenUpdating = False

Dim copia As String
copia = Left(ThisWorkbook.FullName, _
Len(ThisWorkbook.FullName) - 4) & "(sin fórmulas).xls"
ActiveWorkbook.SaveCopyAs copia
Workbooks.Open copia
With ActiveWorkbook
Call OcultarHojas
Dim j As Byte
For j = Sheets.Count To 1 Step -1
If Sheets(j).Visible = True Then
hoja.Rows("1:200").Value = hoja.Rows("1:200").Value
Else
Next
Call EliminarHojasOcultas
Call EliminsProyectosVbaTodos
.Save
.Close
End With
Application.ScreenUpdating = True
End Sub

En este punto me sale el error NEXT sin FOR

Veréis he he añadido otra macro llamada OcultarHojas

es un poco chapuza pero funciona: 

Sub OcultarHojas()

Dim i As Byte

Sheets(3).Visible = False
Sheets(7).Visible = False
Sheets(24).Visible = False
Sheets(25).Visible = False
Sheets(28).Visible = False
Sheets(33).Visible = False
For i = 9 To 15
Sheets(i).Visible = False
Next
For i = 20 To 22
Sheets(i).Visible = False
Next
For i = 30 To 31
Sheets(i).Visible = False
Next
End Sub

1 Respuesta

Respuesta
2

Te paso la parte del código que te marca error para que puedas avanzar:

For j = Sheets.Count To 1 Step -1
If Sheets(j).Visible = True Then
   hoja.Rows("1:200").Value = hoja.Rows("1:200").Value
End If
Next
Call EliminarHojasOcultas
Call EliminsProyectosVbaTodos
.Save
.Close
End With
Application.ScreenUpdating = True
End Sub

PD) Podés descargar un manual de VBA Inicial desde mi sitio. Está desarrollado para versiones Excel 2003 pero los conceptos sirven aún hoy.

Sdos

Elsa

Lo correcto sería así ya que 'hoja' no va en esta parte del código:

For j = Sheets.Count To 1 Step -1
If Sheets(j).Visible = True Then
   Sheets(j).Rows("1:200").Value = Sheets(j).Rows("1:200").Value
End If
Next

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas