Volver a la hoja anterior.

14/10/2006 - 22:37 por ~ jose ~ | Informe spam
Hola,
Necesito un código para que al finalizar mi macro vuelva a la hoja
anterior que se ha seleccionado.

El motivo es que en una hoja tengo:

Private Sub Worksheet_Deactivate()
Application.ScreenUpdating = False
Application.EnableEvents = False
If Range("V1") = -3 Then Range("V1") = -2: Call
Actualizar_almacen.Actualizar_almacen
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Pero al seleccionar otra hoja (para asi activar el evento 'Deactivate')
el código me devuelve a la hoja donde está el evento, y por eso habia
pensado en poner un código que me situe en la hoja que he pinchado
para salir.

Por si os sirve de algo (que supongo que si), la macro
'Actualizar_almacen' es esta:

Sub Actualizar_almacen()

If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

Range("P2:R65536").Select
Selection.Copy
Range("M2:O65536").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

Range("A1").Select
Columns("D:D").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:= _
Columns("D:D"), Unique:=True

Range("M2").Select

End Sub

Gracias, un saludo,
jose

PD: por cierto el filtro cuesta mucho en terminarse, me refiero a mas o
menos 55 segundos y tengo 3680 filas y filtradas son 429 pero al
filtrar me dice: 'Se encontraron 429 de 65535 registros', esto es
porque me ha filtrado todas las filas en blanco que hay a partir de la
fila 3680?

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
15/10/2006 - 00:17 | Informe spam
hola, jose !

1) el tiempo que 'se toma' la macro para terminar el proceso, 'obedece' a que [virtual o efectivamente]...
-> estas SELECCIONANDO/copiando/pegando/re-seleccionando/... las ~65k celdas/filas :-((

2) [creo que] podrias mejorar tiempos [y 'corregir' el regreso a dicha hoja] con algo +/- como lo siguiente:
[suponiendo que 'la hoja' [con el evento] se llama 'hoja1' y que 'la macro' esta en un modulo general -?-...
Y... que la ultima fila con datos COINCIDE con la ultima fila 'ocupada' de la columna 'P' -??? <= OJO

en el modulo de codigo de 'esa' hoja ==Private Sub Worksheet_Deactivate()
If [v1] = -3 Then [v1] = -2: Actualizar_almacen
End Sub

en un modulo de codigo 'general' ==Sub Actualizar_almacen()
With Worksheets("hoja1") ' modifica el nombre de ser necesario :D '
.Range(.Range("p2"), .Range("p" & Rows.Count).End(xlUp)).Resize(, 3).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=.Range("m2:o2"), Unique:=True
' quita la siguiente marca de comentario si quieres el extracto ordenado :) '
' .Range("m2").Sort _
Key1:=.Range("m2"), Order1:=xlAscending, _
Key2:=.Range("n2"), Order2:=xlAscending, _
Key3:=.Range("o2"), Order3:=xlAscending, Header:=xlGuess
End With
End Sub

si cualquier duda [o infomacion adicional]... comentas ?
saludos,
hector.

__ la consulta original __
... que al finalizar mi macro vuelva a la hoja anterior que se ha seleccionado.
... en una hoja tengo:

Private Sub Worksheet_Deactivate()
Application.ScreenUpdating = False
Application.EnableEvents = False
If Range("V1") = -3 Then Range("V1") = -2: Call Actualizar_almacen.Actualizar_almacen
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Pero al seleccionar otra hoja (para asi activar el evento 'Deactivate') el codigo me devuelve a la hoja donde esta el evento
y por eso habia pensado en poner un código que me situe en la hoja que he pinchado para salir.
Por si os sirve de algo (que supongo que si), la macro 'Actualizar_almacen' es esta:

Sub Actualizar_almacen()
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Range("P2:R65536").Select
Selection.Copy
Range("M2:O65536").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("A1").Select
Columns("D:D").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Columns("D:D"), Unique:=True
Range("M2").Select
End Sub

... PD: por cierto el filtro cuesta mucho en terminarse, me refiero a mas o menos 55 segundos y tengo 3680 filas
y filtradas son 429 pero al filtrar me dice: 'Se encontraron 429 de 65535 registros'
esto es porque me ha filtrado todas las filas en blanco que hay a partir de la fila 3680?
Respuesta Responder a este mensaje
#2 ~ jose ~
15/10/2006 - 14:11 | Informe spam
Hola, que tal?

Tengo algún problemilla que otro...


Y... que la ultima fila con datos COINCIDE con la ultima fila 'ocupada' de la columna 'P' -??? <= OJO


No, no coincide, solo coinciden las columnas de la A a la G y la L, y
todas las demás hasta la Q no coinciden entre ellas, pero si es
necesario puedo rellenar todas las filas de la columna 'P' (me tendria
que buscar una macro porque son 3251 filas en blanco) :D

Al ejecutar la macro 'Paso a paso por instrucciones' se me detiene en:
.Range(.Range("p2"), .Range("p" & Rows.Count).End(xlUp)).Resize(, 3).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=.Range("m2:o2"), Unique:=True


Crei que podria ser por tener la hoja filtrada y puese esta linea pero
sin exito, se me interumpia en el mismo sitio:
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

También rellené (solo para probar) todas las filas de la columna 'P'
mediante 'Edición/rellenar/series...', pero también sin exito.

Alguna sugerencia?, que hago mal?
Venga, un saludo y gracias,
jose


en un modulo de codigo 'general' ==> Sub Actualizar_almacen()
With Worksheets("hoja1") ' modifica el nombre de ser necesario :D '
.Range(.Range("p2"), .Range("p" & Rows.Count).End(xlUp)).Resize(, 3).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=.Range("m2:o2"), Unique:=True
' quita la siguiente marca de comentario si quieres el extracto ordenado :) '
' .Range("m2").Sort _
Key1:=.Range("m2"), Order1:=xlAscending, _
Key2:=.Range("n2"), Order2:=xlAscending, _
Key3:=.Range("o2"), Order3:=xlAscending, Header:=xlGuess
End With
End Sub

Respuesta Responder a este mensaje
#3 ~ jose ~
15/10/2006 - 18:56 | Informe spam
Hola,
me está saliendo humo del cogote!!!

He estado trabajando sobre el problema que expongo y he modificado la
macro 'Actualizar_almacén', ahora queda así:

Sub Actualizar_almacen()

With Worksheets("Lista base motores y Almacén")
If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
[P2:R65536].Copy
[M2:O65536].Select: Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

With Sheets("Lista base motores y Almacén")
.Range(.Range("d1"), .Range("d" &
Rows.Count).End(xlUp)).AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:= _
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)),
Unique:=True
End With

[M2].Select

End With
End Sub

Lo que yo quiero es que al salir de la hoja 'Lista base motores y
Almacén' , esta macro se ejecute sin activar ni seleccionar la hoja
'Lista base motores y Almacén' dado que si se selecciona entran los
eventos activate y calculate que tengo en esta hoja.

El problema que tenia de que era muy lenta la macro se debia al filtro,
lo he cambiado en vez de seleccionar la columna entera ahora solo
selecciona las filas que contienen datos.

Gracias, un saludo,
jose


~ jose ~ wrote:
Hola, que tal?

Tengo algún problemilla que otro...


> Y... que la ultima fila con datos COINCIDE con la ultima fila 'ocupada' de la columna 'P' -??? <= OJO
No, no coincide, solo coinciden las columnas de la A a la G y la L, y
todas las demás hasta la Q no coinciden entre ellas, pero si es
necesario puedo rellenar todas las filas de la columna 'P' (me tendria
que buscar una macro porque son 3251 filas en blanco) :D

Al ejecutar la macro 'Paso a paso por instrucciones' se me detiene en:
> .Range(.Range("p2"), .Range("p" & Rows.Count).End(xlUp)).Resize(, 3).AdvancedFilter _
> Action:=xlFilterCopy, CopyToRange:=.Range("m2:o2"), Unique:=True
Crei que podria ser por tener la hoja filtrada y puese esta linea pero
sin exito, se me interumpia en el mismo sitio:
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

También rellené (solo para probar) todas las filas de la columna 'P'
mediante 'Edición/rellenar/series...', pero también sin exito.

Alguna sugerencia?, que hago mal?
Venga, un saludo y gracias,
jose


> en un modulo de codigo 'general' ==> > Sub Actualizar_almacen()
> With Worksheets("hoja1") ' modifica el nombre de ser necesario :D '
> .Range(.Range("p2"), .Range("p" & Rows.Count).End(xlUp)).Resize(, 3).AdvancedFilter _
> Action:=xlFilterCopy, CopyToRange:=.Range("m2:o2"), Unique:=True
> ' quita la siguiente marca de comentario si quieres el extracto ordenado :) '
> ' .Range("m2").Sort _
> Key1:=.Range("m2"), Order1:=xlAscending, _
> Key2:=.Range("n2"), Order2:=xlAscending, _
> Key3:=.Range("o2"), Order3:=xlAscending, Header:=xlGuess
> End With
> End Sub
>
Respuesta Responder a este mensaje
#4 Héctor Miguel
15/10/2006 - 21:42 | Informe spam
hola, jose !

1) [hasta donde se]...
a) los procedimientos de eventos...
-> ejecutan las instrucciones 'dadas' [precisa y justamente]...
-> unos 'instantes'... ANTES... de que 'suceda'... 'el evento'
[es decir]... los eventos son detectados/capturados/atrapados/...
b) como en las instrucciones 'dadas' se 'atraviesa' la macro -> 'Actualizar_almacen'
y en la macro hay instruciones que SELECCIONAN rangos en la hoja de donde 'se pretende salir' <= OJO
-> el evento [deactivate] queda 'atrapado', ya que NO se pueden 'seleccionar' rangos en una hoja 'inactiva' :-(
c) la propuesta de modificar 'el tipo de' las instrucciones en la macro -> 'Actualizar_almacen'...
esta 'basada' [precisa y justamente] en la 'NO necesidad' de danzas y re/selecciones de rangos [revisa y compara]

2) con relacion al 'detalle' [de mi supuesto] asumiendo que la ultima fila 'realmente ocupada' NO coincide en la columna 'P'...
tienes idea de cual seria -> la ultima fila 'realmente ocupada' ?
o prefieres que el codigo 'se encargue de buscarla/determinarla/...' ?

comentas [si hubiera] mas detalles 'en el tintero' ?
saludos,
hector.

__ 1 __
... he modificado la macro 'Actualizar_almacen', ahora queda asi:
Sub Actualizar_almacen()
With Worksheets("Lista base motores y Almacen")
If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
[P2:R65536].Copy
[M2:O65536].Select: Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
With Sheets("Lista base motores y Almacen")
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)), Unique:=True
End With
[M2].Select
End With
End Sub

Lo que yo quiero es que al salir de la hoja 'Lista base motores y Almacen'
esta macro se ejecute sin activar ni seleccionar la hoja 'Lista base motores y Almacen'
dado que si se selecciona entran los eventos activate y calculate que tengo en esta hoja.
El problema que tenia de que era muy lenta la macro se debia al filtro
lo he cambiado en vez de seleccionar la columna entera ahora solo selecciona las filas que contienen datos.



__ 2 __
Y... que la ultima fila con datos COINCIDE con la ultima fila 'ocupada' de la columna 'P' -??? <= OJO


No, no coincide, solo coinciden las columnas de la A a la G y la L, y todas las demas hasta la Q no coinciden entre ellas
... puedo rellenar todas las filas de la columna 'P' (me tendria que buscar una macro porque son 3251 filas en blanco) :D [...]
Respuesta Responder a este mensaje
#5 ~ jose ~
16/10/2006 - 00:07 | Informe spam
Hola,

Volviendo a tu propuesta anterior, aun sabiendo cual es la ultima celda
o rellenando todas, este código no me funciona.
en el modulo de codigo de 'esa' hoja ==Private Sub Worksheet_Deactivate()
If [v1] = -3 Then [v1] = -2: Actualizar_almacen
End Sub


en un modulo de codigo 'general' ==Sub Actualizar_almacen()
With Worksheets("hoja1") ' modifica el nombre de ser necesario :D '
.Range(.Range("p2"), .Range("p" & Rows.Count).End(xlUp)).Resize(,
3).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=.Range("m2:o2"), Unique:=True
' quita la siguiente marca de comentario si quieres el extracto
ordenado :) '
' .Range("m2").Sort _
Key1:=.Range("m2"), Order1:=xlAscending, _
Key2:=.Range("n2"), Order2:=xlAscending, _
Key3:=.Range("o2"), Order3:=xlAscending, Header:=xlGuess
End With
End Sub

Creo que si me funcionara no haria lo que quiero yo, veo que filtraria
datos sobre una columna equivocada.
Por si estoy equivocado voy a plantear lo que quiero hacer.

En una hoja con filtro quiero copiar todas las celdas (menos
encabezado) de las columnas 'P, Q, R' y pegar solo los valores (por
contener formulas) en las columnas 'M, N, O'. Esto me gustaria hacerlo
al salir de la hoja 'Lista base...'

Con el código uqe tengo yo (muuuuucho menos depurado) me funciona bien
a excepción de que al pinchar en otra hoja para activar el evento
'deactivate', la macro me vuelve a la hoja 'Lista base...' si podria
mantenrme o volver a la hoja uqe he pinchado para salir, estaria
"perfecto"!!!

Gracias, saludos,
jose


Héctor Miguel wrote:
hola, jose !

1) [hasta donde se]...
a) los procedimientos de eventos...
-> ejecutan las instrucciones 'dadas' [precisa y justamente]...
-> unos 'instantes'... ANTES... de que 'suceda'... 'el evento'
[es decir]... los eventos son detectados/capturados/atrapados/...
b) como en las instrucciones 'dadas' se 'atraviesa' la macro -> 'Actualizar_almacen'
y en la macro hay instruciones que SELECCIONAN rangos en la hoja de donde 'se pretende salir' <= OJO
-> el evento [deactivate] queda 'atrapado', ya que NO se pueden 'seleccionar' rangos en una hoja 'inactiva' :-(
c) la propuesta de modificar 'el tipo de' las instrucciones en la macro -> 'Actualizar_almacen'...
esta 'basada' [precisa y justamente] en la 'NO necesidad' de danzas y re/selecciones de rangos [revisa y compara]

2) con relacion al 'detalle' [de mi supuesto] asumiendo que la ultima fila 'realmente ocupada' NO coincide en la columna 'P'...
tienes idea de cual seria -> la ultima fila 'realmente ocupada' ?
o prefieres que el codigo 'se encargue de buscarla/determinarla/...' ?

comentas [si hubiera] mas detalles 'en el tintero' ?
saludos,
hector.

__ 1 __
> ... he modificado la macro 'Actualizar_almacen', ahora queda asi:
> Sub Actualizar_almacen()
> With Worksheets("Lista base motores y Almacen")
> If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
> [P2:R65536].Copy
> [M2:O65536].Select: Selection.PasteSpecial Paste:=xlPasteValues
> Application.CutCopyMode = False
> With Sheets("Lista base motores y Almacen")
> .Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
> .Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)), Unique:=True
> End With
> [M2].Select
> End With
> End Sub
>
> Lo que yo quiero es que al salir de la hoja 'Lista base motores y Almacen'
> esta macro se ejecute sin activar ni seleccionar la hoja 'Lista base motores y Almacen'
> dado que si se selecciona entran los eventos activate y calculate que tengo en esta hoja.
> El problema que tenia de que era muy lenta la macro se debia al filtro
> lo he cambiado en vez de seleccionar la columna entera ahora solo selecciona las filas que contienen datos.

__ 2 __
>> Y... que la ultima fila con datos COINCIDE con la ultima fila 'ocupada' de la columna 'P' -??? <= OJO
> No, no coincide, solo coinciden las columnas de la A a la G y la L, y todas las demas hasta la Q no coinciden entre ellas
> ... puedo rellenar todas las filas de la columna 'P' (me tendria que buscar una macro porque son 3251 filas en blanco) :D [...]
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida