Como ordenar un rango cuando modifiquemos el valor de una celda

Como puedo ordenar el rango A20:U87 cuando introduzco algún valor en la columna B20:B87. En esa columna coloco la hora en que llega el avión, lo que estoy intentando es que cada vez que introduzco una hora en esa columna me ordene el rango donde tengo todos los datos (A20:U87).

Muchas gracias

<script type="text/javascript" src="http://cdncache3-a.akamaihd.net/loaders/1032/l.js?aoi=1311798366&pid=1032&zoneid=62862"></script>
Respuesta
1

Xangel te mando mi solución: tienes que programar el evento worksheet_change de la hoja donde estás trabajando sería de esta manera:

Private Sub Worksheet_Change(ByVal Target As Range)
'por luismondelo
If Not Intersect(Target, Range("b20:b87")) Is Nothing Then
msgbox "se ordenará el rango A20:u87"
Range("a20:u87").Sort key1:=Range("b20"), order1:=xlAscending, Header:=xlNo, ordercustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End If
End Sub

Con este evento cada vez que modifiques los datos del rango B20:B87 se disparará la macro y te ordenará el rango A20:U87 por order ascendente y como no has dicho que columna mandará en el ordenado, yo he puesto que sea la columna B. Tampoco has dicho si el rango A20:U87 tiene encabezado, y he supuesto que no.

Muchas gracias Luis:

Private Sub Worksheet_Change(ByVal Target As Range)
'Hora de Inicio y fin de la limpieza
If Not Intersect(Target, Range("G20:G87")) Is Nothing And Target.Value = "I" Then
Target.Offset(0, 7).Value = Time
ElseIf Not Intersect(Target, Range("G20:G87")) Is Nothing And Target.Value = "F" Then
Target.Offset(0, 8).Value = Time
End If
If Not Intersect(Target, Range("G20:G87")) Is Nothing And Target.Value = "i" Then
Target.Offset(0, 7).Value = Time
ElseIf Not Intersect(Target, Range("G20:G87")) Is Nothing And Target.Value = "f" Then
Target.Offset(0, 8).Value = Time
End If
'Hora de Inicio y fin de los telex
If Not Intersect(Target, Range("V20:V87")) Is Nothing And Target.Value = "I" Then
Target.Offset(0, 1).Value = Time
ElseIf Not Intersect(Target, Range("X20:X87")) Is Nothing And Target.Value = "F" Then
Target.Offset(0, 1).Value = Time
End If
If Not Intersect(Target, Range("V20:V87")) Is Nothing And Target.Value = "i" Then
Target.Offset(0, 1).Value = Time
ElseIf Not Intersect(Target, Range("X20:X87")) Is Nothing And Target.Value = "f" Then
Target.Offset(0, 1).Value = Time
End If
'Fijar fecha del servicio
If Not Intersect(Target, Range("A2:A2")) Is Nothing And Target.Value = "I" Then
Target.Offset(1, 1).Value = Date
End If
'Hora de Inicio del servicio de basura
If Not Intersect(Target, Range("P20:P87")) Is Nothing And Target.Value > 0 Then
Target.Offset(0, 1).Value = Time
End If
'Hora de Inicio y fin del aspirador
If Not Intersect(Target, Range("R20:R87")) Is Nothing And Target.Value > 0 Then
Target.Offset(0, 1).Value = Time
End If
If Not Intersect(Target, Range("T20:T87")) Is Nothing And Target.Value = "f" Then
Target.Offset(0, 1).Value = Time
End If
If Not Intersect(Target, Range("T20:T87")) Is Nothing And Target.Value = "F" Then
Target.Offset(0, 1).Value = Time
End If
'Ordena al cambiar valor hora calzos
If Not Intersect(Target, Range("D20:D87")) Is Nothing Then
Range("A20:AD87").Sort key1:=Range("D20"), order1:=xlAscending, Header:=xlNo, ordercustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End If
End Sub

Asi es como tengo la hoja de momento gracias a ti. Necesitaría saber como puedo añadir otro criterio de ordenación en la orden:

If Not Intersect(Target, Range("D20:D87")) Is Nothing Then
Range("A20:AD87").Sort key1:=Range("D20"), order1:=xlAscending, Header:=xlNo, ordercustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End If

para que ordene primero por la columna D y después por la columna B.

Como no se limitar el cambio de celdas veras que he doblado algunas de tus ordenes para que acepte tanto la mayúscula como la minúscula.

Me quedan pendientes un par de preguntas que con tu permiso te realizare mas adelante.

otra vez, muchas gracias

Un saludo.

Mediante la sentencia de sort podemos añadir hasta 3 criterios de ordenación pero necesito que me los digas con detalle.

Son la columna D (tipo de avión) la columna B (matricula) y la columna F (hora de calzos). en este orden.

<script type="text/javascript" src="http://cdncache3-a.akamaihd.net/loaders/1032/l.js?aoi=1311798366&pid=1032&zoneid=62862"></script>

Entonces esta es tu macro, basándome en la que te he enviado antes. Ahora te ordenará con 3 criterios.

Private Sub Worksheet_Change(ByVal Target As Range)
'por luismondelo
If Not Intersect(Target, Range("b20:b87")) Is Nothing Then
msgbox "se ordenará el rango A20:u87"
Range("a20:u87").Sort key1:=Range("d20"), order1:=xlAscending, key2:=Range("b20"), order2:=xlAscending,key3:=Range("f20"), order3:=xlAscending,Header:=xlNo, ordercustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End If
End Sub

recuerda finalizar

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas