Volver atrás con código VBA en un botón

En mi programa de excel tengo la siguiente macro en un botón de cada una de las hojas que me permite volver a la hoja anterior

Por un lado el código en un módulo:

$$\begin{align}&Private Sub Worksheet_Activate()\\&      previa = actual\\&      actual = ActiveSheet.Name\\&\end Sub\end{align}$$

Y por otro lado en cada una de las hojas pongo el siguiente código:

$$\begin{align}&Private Sub Worksheet_Activate()\\&      previa = actual\\&      actual = ActiveSheet.Name\\&\end Sub\end{align}$$

El problema me surge cuando abro un formulario y luego le doy quiero volver atrás, me salta un error para depurar

¿Cómo puedo solucionarlo?

3 Respuestas

Respuesta
1

Vuelvo a copiar los códigos que me confundí.

Por un lado, en módulo:

Private Sub Worksheet_Activate()
      previa = actual
      actual = ActiveSheet.Name
End Sub

y por otro lado en cada hoja:

Public previa, actual As String  'Declarar variables públicas
Sub ir()
    Sheets(previa).Activate
End Sub
Respuesta
2

Se entiende que tenés en cada hoja una macro que se ejecuta al activar la hoja y que te guarda las hojas actual/previa.

Además tenés un formulario que se mueve a cierta hoja... lo que genera que se ejecute el proceso Activate... y eso es lo que necesitas evitar.

Por lo tanto hay 2 opciones:

1- Desactivar momentaneamente el evento Activate desde el formulario, antes de cambiar de hoja y volverlo a activar al finalizar.

Por ej: si tu form se ejecuta desde una hoja Datos y lleva info a otra llamada Clientes

Application.EnableEvents = False   'inhabilitar la ejecución de procesos

Sheets("Clientes").Select

'tus instrucciones de pase

'volver a tu hoja desde donde se esta ejecutando el formulario

Sheets("Datos").Select

Application.EnableEvents = True   'volver a habilitar la ejecución de las macros

2- Otra opción y la más recomendable cuando de pase de datos se trata, es NO pasar a la hoja sino solo mencionarla.

Se declara la hoja y cada pase se hace con instrucciones como en este ejemplo:

Set hojax = sheets("Clientes")

'diferente modos de pasar a celdas

hojax.Cells(fila1,col1) = TextBox1.text

hojax.Range("B" & filx) = Combobox1

De este modo nunca te moves de tu hoja activa y no tenés que estar inhabilitando procesos.

Espero te haya sido claro y resuelva tu consulta. En ese caso no olvides valorar ESTA consulta también.

Si necesitas ayuda con la macro de pase inicia una consulta dirigida a mi nombre con un ejemplo de cómo son los encabzados de tu hoja destino y los campos a pasar.

Respuesta
1

.27.03.17

Buenas tardes, Esteban

Prueba declarar como públicas las variables al iniciar el formulario para que esté disponibre cuando ejecutes IR()

Public previa, actual As String
Private Sub Worksheet_Activate()
      previa = actual
      actual = ActiveSheet.Name
End Sub

Si, eventualemente, esto no resolviera tu problema, escribe de nuevo indicando el error que te arroja el programa.

Saludos

Fernando

.

Hola experto, 

He probado a colocar ese código en dos de las hojas y ahora me da error sin siquiera abrir formulario. Lo he quitado y ya funciona aunque he detectado que el error del que hablaba me salta si cuando abro el formulario realizo alguna acción como al guardar datos que pasa determinado dato de un textbox a una celda. Si simplemento lo abro y lo cierro, el código para volver atrás funciona.

Cuando me salta el error me indica lo siguiente:

Se ha producido error 9 en tiempo de ejecución:  Subíndice fuera del intervalo

Y como digo, sólo salta si dentro del formulario realizo una acción que modifica algo en la hoja.

Gracias 

.

Buenas,

Probablemente eso ocurra cuando la variable actual esté vacía.

Es decir, al activar la hoja por primera vez previa (y actual) están vacías, luego IR() querrá activar la hoja llamada "" (vacío) porque aún no cargó valor alguno.

Entonces te sugeríría que controles eso con esta variante de la subrutina ir():

Sub ir()
    If len(previa) > 0 Then Sheets(previa).Activate
End Sub

Prueba con este cambio

Abrazo

Fer

Hola Fernando,

Sigue sin funcionar, ya no salta el error del subíndice para depurar, simplemente no hace nada, hago click y no responde a la macro.

Si no hago nada en el formulario, si funciona y responde perfectamente.

Muchas gracias por la ayuda

.

Hola, Esteban

Creo que estamos cerca. Es sólo que me parece no estar entendiendo bien el objetivo de ese evento.

Si la rutina no hace nada es porque el condicional indica que la variable previa carece de contenido.

Por ello, habría que asignarle un valor para cuando no tenga una página anterior donde ir.

Public previa, actual As String
Private Sub Worksheet_Activate()
if len(previa) = 0 then
      previa = ActiveSheet.Name
else
      previa = actual
      actual = ActiveSheet.Name
end if
End Sub

Intuyo que tampoco hará nada la primera vez porque iria a la hoja actual.

Si no fuera lo que buscas, ayudaría que me comentes qué es lo que quieres que haga la rutina.

Tal vez el evento Worksheet_Activate no sea el que necesitas.

Abrazo

Fer

.

Vale pruebo y te digo

La macro es para asignarla a un botón en las hojas que me permita moverme de una a otra, en este caso regresar a la anterior, y si no hago nada en el formulario, regresa sin problemas a la. Hoja previa, imaginate estas en menu principal y vas a la hoja clientes, pulsas ek.botón y vuelves, el problema es si abro el form de selección y selecciono un cliente, ya no va...

Voy a probar que tal.

Nada Fernando, sigue sin funcionar :S

.

Bien, ahora entiendo mejor. Creo.

Me parece que el botón que te permite moverte entre hojas es el que debería tener la instrucción para capturar el nombre de la hoja y dejarlo en alguna celda de esa hoja. Luego el botón de volver buscará en esa celda cual fue la hoja de donde vino.

Esto se haría con estas rutinas.

Sub IrAClie()
CeldaPrevia = "AA11" 'celda donde dejará la hoja a regresar
HojaDest = "Clientes"
'  
Sheets(HojaDest).Range(CeldaPrevia).Value = ActiveSheet.Name
Sheets(HojaDest).Select
End Sub
'  
'  
'  
'  
Sub Vuelve()
previa =Range(CeldaPrevia).Value
If len(previa) > 0 Then Sheets(previa).Activate
End Sub

Entonces no necesitarás el evento Worksheet_activate para registrar la hoja previa que -además- suelen consumir recursos por estar evaluando estos eventos cada vez que te mueves entre esas hojas.

Espero que sea una variante válida para ti.

Un abrazo

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas