Macro que se ejecute automatica al cambiar entre dos Hojas

07/07/2007 - 02:02 por Jorge | Informe spam
A ver quien me puede ayudar con esto que intento hacer, me explico:

Tengo una macro que ordena alfabeticamente un rango de filas y columnas por
nombre de empleados en la hoja "Personal". Estos datos tienen que estar
ordenados para que puedan efectuarse los calculos en la otra hoja nombrada
"Oficio". ¿Cómo puedo hacer para que al pasar de la hoja "Personal" a la hoja
"Oficio" la macro Ordenar de la primera hoja se ejecute automáticamente,
evitando con ello el olvido de la persona operadora de tener que ordenar
manualmente los datos con las teclas asignadas a la macro (Ctrl+A)??

Espero puedan ayudarme, gracias.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
07/07/2007 - 02:52 | Informe spam
hola, Jorge !

Tengo una macro que ordena... un rango... en la hoja "Personal".
... Como puedo hacer para que al pasar de la hoja "Personal" a la hoja "Oficio"
la macro Ordenar de la primera hoja se ejecute automaticamente
evitando... el olvido de la... operadora de... ordenar... con las teclas asignadas a la macro (Ctrl+A)?



prueba *llamando* a [o copiando el codigo de] la macro que ordena
=> en el evento '_deactivate' en el modulo de codigo de la hoja "personal"

OJO: si por casualidad el codigo *hace selecciones efectivas* de hojas o rangos...
[p.e.] Range(xyz).Select combinada con algo como: Selection.Sort [etc. etc. etc.]
-> va a ser necesario modificar la forma de referenciar el rango y hoja a ordenar
[de lo contrario no vas a poder *salir* de la hoja al activarse el evento '_deactivate'] :-((

si este fuera el caso, necesitaras exponer el codigo de la macro que ordena ;)

saludos,
hector.
Respuesta Responder a este mensaje
#2 Jorge
07/07/2007 - 03:06 | Informe spam
Hector gracias de nuevo, mira aqui esta el codigo que utiliza la macro

Sub ordenarpersonal()
' ordenarpersonal Macro
' Macro grabada el 20/06/2007 por Jorge
'
Range("A4").Select
Range(Selection, Selection.End(xlToRight)).Select
Range("A4:BX4").Select
Range(Selection, Selection.End(xlDown)).Select
Range("A4:BX701").Select
Selection.Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End Sub

Como puedes ver creo que es lo que mencionas en "OJO: si por casualidad el
codigo *hace selecciones efectivas* de hojas o rangos... [p.e.]
Range(xyz).Select combinada con algo como: Selection.Sort [etc. etc. etc.]"

Qué puedo hacer en ese caso??

Mil gracias

"Héctor Miguel" escribió:

hola, Jorge !

> Tengo una macro que ordena... un rango... en la hoja "Personal".
> ... Como puedo hacer para que al pasar de la hoja "Personal" a la hoja "Oficio"
> la macro Ordenar de la primera hoja se ejecute automaticamente
> evitando... el olvido de la... operadora de... ordenar... con las teclas asignadas a la macro (Ctrl+A)?

prueba *llamando* a [o copiando el codigo de] la macro que ordena
=> en el evento '_deactivate' en el modulo de codigo de la hoja "personal"

OJO: si por casualidad el codigo *hace selecciones efectivas* de hojas o rangos...
[p.e.] Range(xyz).Select combinada con algo como: Selection.Sort [etc. etc. etc.]
-> va a ser necesario modificar la forma de referenciar el rango y hoja a ordenar
[de lo contrario no vas a poder *salir* de la hoja al activarse el evento '_deactivate'] :-((

si este fuera el caso, necesitaras exponer el codigo de la macro que ordena ;)

saludos,
hector.



Respuesta Responder a este mensaje
#3 Héctor Miguel
07/07/2007 - 03:59 | Informe spam
hola, Jorge !

hay ciertos detalles que podrian hacer mas agil [o no] la siguiente propuesta [p.e.]
- si estas usando xlToRight y xlDown, significa que la region actual de 'B4' esta llena
[al menos en sus fila y columna 1]
- no se que haya arriba de la fila 4 y si la primer fila son titulos
[seria mejor no usar el Header:=xlGuess sino afirmar si existen -o no- titulos]
- incluso, cuando la region actual esta llena, puedes ordenar indicando solo la primer celda
[generalmente excel puede arreglarselas con el resto] :))

haz algunas pruebas con las siguientes lineas => en el modulo de codigo de la hoja "personal"
[alterna las lineas comentadas para comprobar si ninguna causa *errores* en la ordenacion] :D

Private Sub Worksheet_Deactivate()
' With Me.Range("a4")
' With Me.Range("a4").CurrentRegion
With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub

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

__ la consulta original __
... aqui esta el codigo que utiliza la macro

Sub ordenarpersonal()
' ordenarpersonal Macro
' Macro grabada el 20/06/2007 por Jorge
'
Range("A4").Select
Range(Selection, Selection.End(xlToRight)).Select
Range("A4:BX4").Select
Range(Selection, Selection.End(xlDown)).Select
Range("A4:BX701").Select
Selection.Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End Sub

... es lo que mencionas en "OJO: si por casualidad el codigo *hace selecciones efectivas* [...]
Respuesta Responder a este mensaje
#4 Jorge
10/07/2007 - 04:16 | Informe spam
Héctor, si entendi bien tu exposición le voy a poner en el modulo de codigo
de la hoja "personal" lo siguiente:
Private Sub Worksheet_Deactivate()
' With Me.Range("a4")
' With Me.Range("a4").CurrentRegion
With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub

Dejo aparte sin ningun cambio el código que tiene la macro que ordena??

Entendi bien? Por favor espero tu respuesta, gracias


"Héctor Miguel" escribió:

hola, Jorge !

hay ciertos detalles que podrian hacer mas agil [o no] la siguiente propuesta [p.e.]
- si estas usando xlToRight y xlDown, significa que la region actual de 'B4' esta llena
[al menos en sus fila y columna 1]
- no se que haya arriba de la fila 4 y si la primer fila son titulos
[seria mejor no usar el Header:=xlGuess sino afirmar si existen -o no- titulos]
- incluso, cuando la region actual esta llena, puedes ordenar indicando solo la primer celda
[generalmente excel puede arreglarselas con el resto] :))

haz algunas pruebas con las siguientes lineas => en el modulo de codigo de la hoja "personal"
[alterna las lineas comentadas para comprobar si ninguna causa *errores* en la ordenacion] :D

Private Sub Worksheet_Deactivate()
' With Me.Range("a4")
' With Me.Range("a4").CurrentRegion
With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub

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

__ la consulta original __
> ... aqui esta el codigo que utiliza la macro
>
> Sub ordenarpersonal()
> ' ordenarpersonal Macro
> ' Macro grabada el 20/06/2007 por Jorge
> '
> Range("A4").Select
> Range(Selection, Selection.End(xlToRight)).Select
> Range("A4:BX4").Select
> Range(Selection, Selection.End(xlDown)).Select
> Range("A4:BX701").Select
> Selection.Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlGuess, _
> OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
> DataOption1:=xlSortNormal
> End Sub
>
> ... es lo que mencionas en "OJO: si por casualidad el codigo *hace selecciones efectivas* [...]



Respuesta Responder a este mensaje
#5 Héctor Miguel
10/07/2007 - 04:50 | Informe spam
hola, Jorge !

... si entendi bien... le voy a poner en el modulo de codigo de la hoja "personal" lo siguiente:
Private Sub Worksheet_Deactivate()
' With Me.Range("a4")
' With Me.Range("a4").CurrentRegion
With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub

Dejo aparte sin ningun cambio el codigo que tiene la macro que ordena?



la propuesta anterior es [o pudiera ser] *en sustitucion* de la macro que ordena ;)
la cual puedes *desaparecer* del mapa... o dejarla para el uso *discrecional* de tu operador :D
-> la hoja se auto-ordena en cuanto te cambias a otra

solo un comentario [por si no hubiera quedado claro]...
hay 3 lineas que dan inicio a un bloque *With ... End With* [dos estan comentadas]
-> usa solo una para comprobar con cual funciona mejor segun tus necesidades
[o sea, debes mantener 2 con el caracter de comentarios y despues decidiras con cual quedarte] ;)

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida