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

#6 Héctor Miguel
16/10/2006 - 01:36 | Informe spam
hola, jose !

... 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...'



[creo que] no era muy claro el porque de la necesidad de 'quitar' autofiltros o filtros avanzados
[y para mi]... desconcertaba si eran de alguna hoja 'especifica'... o de 'cualquiera' que estuviera como 'activa' -?-
ya que de tu exposicion anterior...
> Sub Actualizar_almacen()
> With Worksheets("Lista base motores y Almacen")
> If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData



NO es lo mismo el 'FilterMode' de 'ActiveSheet' que el de With Worksheets("lista de..) ;)

si no puedes proporcionarle al codigo [+/- exactamente] cual es la ultima fila 'realmente ocupada'... -?-
puedes trabajar con las columnas completas... [excel se las 'arregla' para +/- 'adivinar' el rango usado] :))
y si no quieres/necesitas/... incluir la fila 1 [con el rango 'filtrado']... trabaja con la ultima fila 'real' [que ya conoces] :D

prueba con las siguientes adaptaciones y... si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

en el modulo de codigo de la hoja "lista de." ==Private Sub Worksheet_Deactivate()
If [v1] = -3 Then [v1] = -2: Actualizar_almacen
End Sub

en un modulo de codigo general ==Option Private Module
Sub Actualizar_almacen()
Application.ScreenUpdating = False
With Worksheets("lista base motores y almacen") ' modifica el nombre de ser necesario :D '
If .FilterMode Then .ShowAllData
.Range("p:r").Copy
.Range("m1").PasteSpecial xlPasteValues
' las siguientes 2 instrucciones son para que NO quede seleccionado el rango 'pegado' :D '
.Range("m1").Copy
.Range("m1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
.Range("m:o").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
End With
End Sub
Respuesta Responder a este mensaje
#7 ~ jose ~
16/10/2006 - 18:29 | Informe spam
Hola, muy buenas!

[creo que] no era muy claro el porque de la necesidad de 'quitar' autofiltros o filtros avanzados


El problema que tenia era que al copiar las celdas con 'With...' y el
filtro activado me pegaba el rango copiado como si estubiera sin
filtrar, por ejemplo si tengo el filtro hecho muetran las filas 1,2,3 y
5, pero al pegar en la columna 'M' me pegaba los datos en las filas
1,2,3,4. Por eso veo que hay que quitar el filtro antes de nada.


si no puedes proporcionarle al codigo [+/- exactamente] cual es la ultima fila 'realmente ocupada'... -?-
puedes trabajar con las columnas completas... [excel se las 'arregla' para +/- 'adivinar' el rango usado] :))


Me parece bien, tampoco me relentiza tanto el seleccionar solo los
datos a seleccionar la columna entera.

y si no quieres/necesitas/... incluir la fila 1 [con el rango 'filtrado']... trabaja con la ultima fila 'real' [que ya conoces] :D


No entiendo muy bien esta frase. :(


He modificado un poco el código, lee los comentarios que pongo en el
'código modificado' y me comentas, vale?
_Codigo original_

en el modulo de codigo de la hoja "lista de." ==> Private Sub Worksheet_Deactivate()
If [v1] = -3 Then [v1] = -2: Actualizar_almacen
End Sub

en un modulo de codigo general ==> Option Private Module
Sub Actualizar_almacen()
Application.ScreenUpdating = False
With Worksheets("lista base motores y almacen") ' modifica el nombre de ser necesario :D '
If .FilterMode Then .ShowAllData
.Range("p:r").Copy
.Range("m1").PasteSpecial xlPasteValues
' las siguientes 2 instrucciones son para que NO quede seleccionado el rango 'pegado' :D '
.Range("m1").Copy
.Range("m1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
.Range("m:o").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
End With
End Sub



_Código modificado_

Option Private Module
Sub Actualizar_almacen()
Application.ScreenUpdating = False
With Worksheets("Lista base motores y Almacén") ' modifica el nombre
de ser necesario :D '
If .FilterMode Then .ShowAllData
.Range("p2:r65536").Copy ' he modificado esta linea para no borrar
los encabezados
.Range("m2").PasteSpecial xlPasteValues
' las siguientes 2 instrucciones son para que NO quede seleccionado el
rango 'pegado' :D '
.Range("m2").Copy
.Range("m2").PasteSpecial xlPasteValues
Application.CutCopyMode = False
'.Range("d:d").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
' si hago el filtro sobre la columna D de esta forma, toma bastante
tiempo

' hacer el filtro de esta forma me toma mucho menos tiempo. Me sobra
mucho codigo, está así bien?
' la columna D si que tiene todas las filas con datos
.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
End Sub


Bueno Héctor, muchas gracias por todo, ya me comentarás, vale?
un saludo,
jose
Respuesta Responder a este mensaje
#8 Héctor Miguel
16/10/2006 - 22:42 | Informe spam
hola, jose !

y si no quieres/necesitas/... incluir la fila 1 [con el rango 'filtrado']... trabaja con la ultima fila 'real' [que ya conoces] :D


No entiendo muy bien esta frase. :(

He modificado un poco el codigo, lee los comentarios que pongo en el 'codigo modificado' y me comentas, vale? [...]
_Codigo modificado_ [...]



-> te re/comento -solo- algunas partes sobre lo ya modificado ;)
__ 1 __
.Range("p2:r65536").Copy ' he modificado esta linea para no borrar los encabezados
.Range("m2").PasteSpecial xlPasteValues

1) podrias dejar el codigo original de la propuesta [evitando indicar 'rangos fantasma']...
.Range("p:r").Copy
.Range("m1").PasteSpecial xlPasteValues
-> y 'reponer' [de inmediato] los encabezados en 'P1:R1' +/- como sigue:
.range("p1:r1!") = Array("Encabezado 1", "Encabezado 2", "Encabezado 3")

__ 2 __
'.Range("d:d").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
' si hago el filtro sobre la columna D de esta forma, toma bastante tiempo
' hacer el filtro de esta for
ma me toma mucho menos tiempo. Me sobra mucho codigo, esta así bien?
' la columna D si que tiene todas las filas con datos
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)), Unique:=True

2) el 'sentido' de la frase que no habias entendido... es -precisamente- indicar/encontrar/... la ultima fila 'real'
[tal como lo has modificado] :D
solo 'probaria' omitiendo el 'CriteriaRange'... ya que usas 'xlFilterInPlace' y ya indicas que solo los 'Unique:=True' -?-

saludos,
hector.
Respuesta Responder a este mensaje
#9 ~ jose ~
16/10/2006 - 23:20 | Informe spam
Hola hector,
muy bien!!!, lo único que aquí:

-> y 'reponer' [de inmediato] los encabezados en 'P1:R1' +/- como sigue:
.range("p1:r1!") = Array("Encabezado 1", "Encabezado 2", "Encabezado 3")



solo tengo que reponer los encabezados uqe he modificado al pegar la
selección, entoces quedaria así:
.range("m1:o1!") = Array("Encabezado 1", "Encabezado 2", "Encabezado
3")

Muchas gracias, Héctor
me has sido de gran ayuda y seguro que los que estan siguiendo este
hilo han aprendido mucho.
Un saludo,
jose

Héctor Miguel wrote:
hola, jose !

>> y si no quieres/necesitas/... incluir la fila 1 [con el rango 'filtrado']... trabaja con la ultima fila 'real' [que ya conoces] :D
> No entiendo muy bien esta frase. :(
>
> He modificado un poco el codigo, lee los comentarios que pongo en el 'codigo modificado' y me comentas, vale? [...]
> _Codigo modificado_ [...]

-> te re/comento -solo- algunas partes sobre lo ya modificado ;)
__ 1 __
.Range("p2:r65536").Copy ' he modificado esta linea para no borrar los encabezados
.Range("m2").PasteSpecial xlPasteValues

1) podrias dejar el codigo original de la propuesta [evitando indicar 'rangos fantasma']...
.Range("p:r").Copy
.Range("m1").PasteSpecial xlPasteValues
-> y 'reponer' [de inmediato] los encabezados en 'P1:R1' +/- como sigue:
.range("p1:r1!") = Array("Encabezado 1", "Encabezado 2", "Encabezado 3")

__ 2 __
'.Range("d:d").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
' si hago el filtro sobre la columna D de esta forma, toma bastante tiempo
' hacer el filtro de esta for
ma me toma mucho menos tiempo. Me sobra mucho codigo, esta así bien?
' la columna D si que tiene todas las filas con datos
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
.Range(.Range("d1"), .Range("d" & Rows.Count).End(xlUp)), Unique:=True

2) el 'sentido' de la frase que no habias entendido... es -precisamente- indicar/encontrar/... la ultima fila 'real'
[tal como lo has modificado] :D
solo 'probaria' omitiendo el 'CriteriaRange'... ya que usas 'xlFilterInPlace' y ya indicas que solo los 'Unique:=True' -?-

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida