como automatizo el comado de orden ascendente en excel

10/07/2005 - 00:23 por Ric | Informe spam
Deseo realizar la automatizacion de un rango de campos en excel en orden
ascendente o descendente mediante una formula o macro la cual me ordene
automaticamente el rango de campos sin tener que utilizar el icono de orden
ascendente

Preguntas similare

Leer las respuestas

#1 KL
10/07/2005 - 00:42 | Informe spam
Hola Ric,

Suponiendo que quieres ordenar los registros (filas) del rango [A2:Gn] segun
los datos en la columna A, puedes colocar el codigo que te pongo a
continuacion en el modulo VBA de la hoja en cuestion. Para ello:

1) haz clic-derecho sobre el nombre de la hoja en cuestion en una de las
pestañas de la parte de abajo de la ventana de Excel.
2) Elige la opcion Ver Codigo para abrir el editor VBA.
3) En la ventana mas grande a la derecha pega el codigo de abajo
4) Ahora pulsa Alt+F11 para volver a la hoja.
5) prueba introducir algo en la columna [A]

Saludos,
KL

Private Sub Worksheet_Change(ByVal Target As Range)
With Me
If Intersect(Target, .Range("A:A")) _
Is Nothing Then Exit Sub
uFila = .Cells(.Rows.Count, "A").Row
.Range("A2:G" & uFila).Sort _
Key1:=Range("A1"), _
Order1:=xlAscending, _
Orientation:=xlTopToBottom
End With
End Sub


"Ric" wrote in message
news:
Deseo realizar la automatizacion de un rango de campos en excel en orden
ascendente o descendente mediante una formula o macro la cual me ordene
automaticamente el rango de campos sin tener que utilizar el icono de
orden
ascendente
Respuesta Responder a este mensaje
#2 Héctor Miguel
10/07/2005 - 02:49 | Informe spam
hola, chicos !

Ric escribio en el mensaje ...
... automatizacion de un rango... en orden ascendente o descendente... sin... utilizar el icono de orden

KL escribio en el mensaje ...
... ordenar... [A2:Gn] segun... la columna A... en el modulo VBA de la hoja en cuestion


Private Sub Worksheet_Change(ByVal Target As Range)
With Me
If Intersect(Target, .Range("A:A")) _
Is Nothing Then Exit Sub
uFila = .Cells(.Rows.Count, "A").Row
.Range("A2:G" & uFila).Sort _
Key1:=Range("A1"), _
Order1:=xlAscending, _
Orientation:=xlTopToBottom
End With
End Sub





[solo comentarios 'adelgazantes'] :D
1) Range(xyz) SIN un 'calificador previo' [como 'worksheets(x)' o 'me']... 'asume' que sera 'aplicable' a la hoja activa
-> al estar el codigo en un modulo 'de clase' [de 'la hoja en cuestion'] el uso del 'calificador' [Me] no es 'necesario'
2) .Rows.Count 'aplicado' a .Cells que es [a su vez] 'objeto/propiedad' de Me [la hoja en cuestion]...
-> 'devuelve' [siempre] 65536 [creo que] 'detectar'... cual es 'la ultima fila'... -tambien- es 'sacrificable'

para no hacer mas 'largo' este correo 'de adelgazamiento' :)) otras alternativas [dentro del mismo evento en 'esa' hoja]
op1:
If Intersect(Target, Range("a:a")) Is Nothing Then Exit Sub
Range("a:g").Sort Key1:=Range("a1"), Order1:=xlAscending, Header:=xlGuess
op2: [SOLO si no se van a 'dejar' celdas en blanco al introducir datos en la columna 'A']
If Target.Column = 1 Then SendKeys "~": CommandBars.FindControl(Id:’8).Execute
-> esta segunda opcion [aunque 'chistosa'] 'aprovecha' las opciones 'por omision' cuando se pulsa el boton ord-asc
la 'contra-parte' [el boton de ord-desc] tiene una Id:!1
y [probablemente] se vea 'menos mal' [el 'pantallazo'] con un Application.ScreenUpdating = False :-(

saludos,
hector.
Respuesta Responder a este mensaje
#3 Héctor Miguel
10/07/2005 - 06:22 | Informe spam
hola, chicos ! [fe de erratas] :-((

'dice'...
la 'contra-parte' [el boton de ord-desc] tiene una Id:!1


'debe decir'...
la 'contra-parte' [el boton de ord-desc] es una 'secuencia de teclas' distinta...


If Target.Column = 1 Then SendKeys "{tab}{down}~": CommandBars.FindControl(Id:’8).Execute

saludos,
hector.
Respuesta Responder a este mensaje
#4 Héctor Miguel
10/07/2005 - 07:58 | Informe spam
hola [de nuevo], chicos ! :DD

una op3: mas 'universalizada' [y 'creo que' sigue siendo 'delgada'] :)
If Not Intersect(Target.Cells(1, 1), Range("a:a")) Is Nothing Then Target.Cells(1, 1).Sort _
Key1:=Target.Cells(1, 1), Order1:=xlAscending, Header:=xlGuess

saludos,
hector.
Respuesta Responder a este mensaje
#5 KL
10/07/2005 - 11:04 | Informe spam
Hola HM,

1) Range(xyz) SIN un 'calificador previo' [como 'worksheets(x)' o 'me']...
'asume' que sera 'aplicable' a la hoja activa
-> al estar el codigo en un modulo 'de clase' [de 'la hoja en
cuestion'] el uso del 'calificador' [Me] no es 'necesario'



Tienes razon es que yo siempre compongo los macros como Sub normales (no
subnormales :-)) y luego los copio a los eventos. En este caso se me ocurrio
que era mas rapido cambiar ActiveSheet por Me en vez de quitar todo el
With...End With.

2) .Rows.Count 'aplicado' a .Cells que es [a su vez]
'objeto/propiedad' de Me [la hoja en cuestion]...
-> 'devuelve' [siempre] 65536 [creo que] 'detectar'... cual es 'la
ultima fila'... -tambien- es 'sacrificable'



Ultimamente yo siempre procuro usar Rows.Count por razones de compatibilidad
futura ya que parece que es posible que la proxima version de Excel tenga
mas de 65536 filas (sabes como el cambio de XL95 a XL97)

op1:
If Intersect(Target, Range("a:a")) Is Nothing Then Exit Sub
Range("a:g").Sort Key1:=Range("a1"), Order1:=xlAscending, Header:=xlGuess



prefiero no dejarle a Excel que adivine los titulos - a veces no lo adivina
correctamente como en el caso de que no haya datos en todas las columnas.
asi que me decanto por:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A:A")) _
Is Nothing Then Exit Sub
Range("A2:G" & Cells(Rows.Count, "A").Row).Sort _
Key1:=Range("A1"), _
Order1:=xlAscending, _
Orientation:=xlTopToBottom
End Sub

op2: [SOLO si no se van a 'dejar' celdas en blanco al introducir datos en
la columna 'A']
If Target.Column = 1 Then SendKeys "~":
CommandBars.FindControl(Id:’8).Execute



Yo procuro usar el comando SendKeys solo si como ultimo recurso porque
entiendo que el usuario puede interferir con el funcionamiento del macro en
tiempo de ejecucion pulsando accidentalmente alguna tecla, pero la opcion es
interesante.

una op3: mas 'universalizada' [y 'creo que' sigue siendo 'delgada'] :)
If Not Intersect(Target.Cells(1, 1), Range("a:a")) Is Nothing Then
Target.Cells(1, 1).Sort _
Key1:=Target.Cells(1, 1), Order1:=xlAscending, Header:=xlGuess



Este codigo falla si hay una celda vacia entre la lista y el valor
introducido y tambien si se borran todos los datos

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