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

#6 Jorge
16/07/2007 - 20:36 | Informe spam
Héctor mira le hice como dijiste y ordena bien la lista de los nombres,los
puestos y el área, sin embargo existe un pequeño detalle:

Cuando se topa con una celda vacía en la fila se desmadra todo, ya no ordena
las consecutivas celdas y pierde la correlación entre el trabajador y su
historico. ¿¿Cómo se puede evitar eso?? Hay que tomar en cuenta que siempre
habrán celdas vacías para cada período porque no necesariamente se ocuparán
todas, es decir que el trabajador no siempre saldrá de vacaciones en 8
ocasiones por período, lo cual es el límite que le tengo puesto a cada
periodo. ¿Me explico?

Me ayudas a resolver este nuevo problema?? Cómo hacer que ordene todas las
filas aunque esten vacias??

Utilicé el siguiente módulo:
Private Sub Worksheet_Deactivate()
With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub

Los otros dos:
' With Me.Range("a4")
' With Me.Range("a4").CurrentRegion
Me dan errores de compilación

No puedo rellenar las celdas con ceros porque ya no funcionaría bien la
fórmula que lleva el último valor de la derecha de la fila a la hoja oficio,
te acuerdas de ese valor?? Me ayudaste a enviarlo a la hoja oficio con la
formula:

=BUSCAR(2,1/(INDIRECTO("Personal!"&COINCIDIR(B10,Personal!A:A,0)&":"&COINCIDIR(B10,Personal!A:A,0))<>""),INDIRECTO("Personal!"&COINCIDIR(B10,Personal!A:A,0)&":"&COINCIDIR(B10,Personal!A:A,0)))

Cómo ves?? Hay otra solución más profesional??? Espero tu ayuda, Gracias
__________________________________

"Héctor Miguel" escribió:

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
#7 Héctor Miguel
17/07/2007 - 02:41 | Informe spam
hola, Jorge !

1) las instrucciones para determinar el rango a sortear [segun la que decidas]...
tienen el mismo comportamiento que en la interfase del usuario [OJO con las celdas vacias en la primer columna]

a) With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
-> selecciona el rango 'A4' y pulsa {ctrl}-{mayus}-{flecha_derecha}-{flecha_abajo}

b) With Me.Range("a4").CurrentRegion
-> selecciona el rango 'A4' y pulsa {ctrl}-{mayus}-* [si... un asterisco]

con la opcion a) el rango a ordenar se quedara *corto* si existen celdas vacias en la columna 'A' :-((
con la opcion b) no debiera importar si existen celdas vacias en la columna 'A' <= esta opcion DEBERIA de funcionar -???-

c) los *errores de compilacion* [probablemente] se deberan a que *tratas* de utilizar las 3 opciones With ... al mismo tiempo ?
recuerda que las 2 que no estes probando, debes dejarlas con marca de comentario -?-

2) en relacion con el *desmadre* y la perdida de relaciones -?-
prueba haciendo manualmente la ordenacion [NO uses macros] y ve que sucede con la inter-dependencia de las formulas
[esta parte no me queda muy clara] -?-

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

__ la consulta original __
... le hice como dijiste y ordena bien la lista de los nombres,los puestos y el area, sin embargo existe un peque#o detalle:
Cuando se topa con una celda vacia en la fila se desmadra todo, ya no ordena las consecutivas celdas
y pierde la correlacion entre el trabajador y su historico. Como se puede evitar eso??
Hay que tomar en cuenta que siempre habran celdas vacias para cada periodo porque no necesariamente se ocuparan todas
es decir que el trabajador no siempre saldra de vacaciones en 8 ocasiones por periodo
lo cual es el limite que le tengo puesto a cada periodo. Me explico?
... Como hacer que ordene todas las filas aunque esten vacias??
Utilice el siguiente modulo:
Private Sub Worksheet_Deactivate()
With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub

Los otros dos:
' With Me.Range("a4")
' With Me.Range("a4").CurrentRegion
Me dan errores de compilacion

No puedo rellenar las celdas con ceros porque ya no funcionaria bien la formula que lleva el ultimo valor de la derecha de la fila a la hoja oficio...
=BUSCAR(2,1/(INDIRECTO("Personal!"&COINCIDIR(B10,Personal!A:A,0)&":"&COINCIDIR(B10,Personal!A:A,0))<>""),INDIRECTO("Personal!"&COINCIDIR(B10,Personal!A:A,0)&":"&COINCIDIR(B10,Personal!A:A,0)))
Respuesta Responder a este mensaje
#8 Jorge
17/07/2007 - 17:54 | Informe spam
Héctor mira ya quedó al puro 100% con el siguiente código:

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

Te agradezco enormemente.

Ahora, si no es mucha molestia, podrías ayudarme a que cuando active la hoja
Oficio se autoejecute el Filtro avanzado que esconde los ejercicios en los
que el trabajador no tiene días pendientes por disfrutar??

Recuerdas que me habías ayudado a aplicar filtros solo al rango B29:E33?? Lo
que necesito ahora es que ese filtro se ejecute al entrar a la hoja oficio.
Es posible esto??

Gracias de antemano, ten por seguro que si algun día patento este programita
ten te pondre como autor y yo estare como coautor. jeje. ok??

Mil gracias.

"Héctor Miguel" escribió:

hola, Jorge !

1) las instrucciones para determinar el rango a sortear [segun la que decidas]...
tienen el mismo comportamiento que en la interfase del usuario [OJO con las celdas vacias en la primer columna]

a) With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
-> selecciona el rango 'A4' y pulsa {ctrl}-{mayus}-{flecha_derecha}-{flecha_abajo}

b) With Me.Range("a4").CurrentRegion
-> selecciona el rango 'A4' y pulsa {ctrl}-{mayus}-* [si... un asterisco]

con la opcion a) el rango a ordenar se quedara *corto* si existen celdas vacias en la columna 'A' :-((
con la opcion b) no debiera importar si existen celdas vacias en la columna 'A' <= esta opcion DEBERIA de funcionar -???-

c) los *errores de compilacion* [probablemente] se deberan a que *tratas* de utilizar las 3 opciones With ... al mismo tiempo ?
recuerda que las 2 que no estes probando, debes dejarlas con marca de comentario -?-

2) en relacion con el *desmadre* y la perdida de relaciones -?-
prueba haciendo manualmente la ordenacion [NO uses macros] y ve que sucede con la inter-dependencia de las formulas
[esta parte no me queda muy clara] -?-

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

__ la consulta original __
> ... le hice como dijiste y ordena bien la lista de los nombres,los puestos y el area, sin embargo existe un peque#o detalle:
> Cuando se topa con una celda vacia en la fila se desmadra todo, ya no ordena las consecutivas celdas
> y pierde la correlacion entre el trabajador y su historico. Como se puede evitar eso??
> Hay que tomar en cuenta que siempre habran celdas vacias para cada periodo porque no necesariamente se ocuparan todas
> es decir que el trabajador no siempre saldra de vacaciones en 8 ocasiones por periodo
> lo cual es el limite que le tengo puesto a cada periodo. Me explico?
> ... Como hacer que ordene todas las filas aunque esten vacias??
> Utilice el siguiente modulo:
> Private Sub Worksheet_Deactivate()
> With Me.Range("a4", Range("a4").End(xlToRight).End(xlDown))
> .Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
> End With
> End Sub
>
> Los otros dos:
> ' With Me.Range("a4")
> ' With Me.Range("a4").CurrentRegion
> Me dan errores de compilacion
>
> No puedo rellenar las celdas con ceros porque ya no funcionaria bien la formula que lleva el ultimo valor de la derecha de la fila a la hoja oficio...
> =BUSCAR(2,1/(INDIRECTO("Personal!"&COINCIDIR(B10,Personal!A:A,0)&":"&COINCIDIR(B10,Personal!A:A,0))<>""),INDIRECTO("Personal!"&COINCIDIR(B10,Personal!A:A,0)&":"&COINCIDIR(B10,Personal!A:A,0)))



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

... que cuando active la hoja Oficio se autoejecute el Filtro
... que esconde los ejercicios en los que el trabajador no tiene dias pendientes por disfrutar?



copia/pega las siguientes lineas en el modulo de codigo de *esa* hoja:

Private Sub Worksheet_Activate()
Range("e30:e35").AutoFilter 1, "<>*ninguno*"
End Sub

saludos,
hector.
Respuesta Responder a este mensaje
#10 Jorge
18/07/2007 - 17:18 | Informe spam
Héctor, funciona perfectamente. Solo hay un pequeño detalle, traté de
proteger la hoja con una contraseña dejando únicamente las celdas editables
sin protección pero no funcionan los códigos. Señala que no se pueden activar
los códigos en hojas protegidas.

Ni modo, no todo se puede en esta vida jajaja. Bueno pues quedará a criterio
del usuario si la descompone toda. Ya suficiente hice por ahorrarle trabajo.

Gracias por toda tu ayuda, he aprendido demasiado con este proyecto. Espero
algun día llegar al nivel de conocimiento que tienes, en verdad te envidio.

Bueno saludos y que estes bien. Mil gracias de nuevo.

Jorge

"Héctor Miguel" escribió:

hola, Jorge !

> ... que cuando active la hoja Oficio se autoejecute el Filtro
> ... que esconde los ejercicios en los que el trabajador no tiene dias pendientes por disfrutar?

copia/pega las siguientes lineas en el modulo de codigo de *esa* hoja:

Private Sub Worksheet_Activate()
Range("e30:e35").AutoFilter 1, "<>*ninguno*"
End Sub

saludos,
hector.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida