Rango variable para ordenar

Me he tropezado con un nuevo problema. Como sabes utilizo excel 2007 y con esta versión se puede autofiltrar por colores, cosa que es fundamental en el libro que estoy creando. El problema es que al compartir el libro me he dado cuenta que ha desaparecido la opción de autofiltrar por colores.
Para solucionarlo quiero hacer una macro que me ordene por colores, el problema es que el rango a ordenar es variable, siempre empieza en A8 y para saber en que fila termina hay que ver la ultima celda escrita de la columna F y es en la columna J de esta fila donde termina.
He hecho el código con la grabadora, pero no se como indicar el rango variable
Range("A8:J33").Select
ActiveWorkbook. Worksheets("Proformas"). Sort. SortFields. Clear
ActiveWorkbook. Worksheets("Proformas"). Sort. SortFields.Add(Range("E9:E33"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
, 240)
With ActiveWorkbook.Worksheets("Proformas").Sort
.SetRange Range("A8:J33")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("D10").Select
End Su
Disculpa mi abuso con tanta pregunta frecuente, pero intento realizar un libro excel bastante grande y cuando soluciono un problema, me encuentro con otro y así llevo semanas...

1 Respuesta

Respuesta
1
Cuando un rango varía y no se sabe cuántas filas abarca, lo que se hace es un Rango Dinámico. La explicación es bastante extensa pero trataré de abreviar.
Primeramente en las celdas de A1 hasta J8 tienes que poner la siguiente fórmula:
=CONTARA(A2:A30000)+1
Esto te dirá cuántas celdas tienen datos en las diferentes columnas. Aquí el inconveniente es que tienes que pasar tus datos a la fila 2. Me explico, todo lo que va de A8 hasta J33 lo tienes que pasar a la fila 2.
Ahora viene la parte que quiero que me entiendas porque solo ésta vez te lo diré.
1- Presionas las teclas Ctrol-F3.
2- En la pantalla que te sale, presionas el botón Nuevo.
3- En la siguiente pantalla, en la parte donde dice "Nombre" puedes poner MisDatos.
4- Donde dice "Hace Referencia A" pones esta fórmula: =DESREF(Hoja1!$A$1,0,0,MAX(Hoja1!$A$1:$J$1),CONTARA(Hoja1!$1:$1))
Esto hará que cada vez que ingreses datos el Rango se agrandará, igual pasa si eliminas, se encoge.
Para que lo combines con tu código, puedes hacerlo de la siguiente forma:
Range("MisDatos").Select
ActiveWorkbook. Worksheets("Proformas"). Sort. SortFields. Clear
ActiveWorkbook. Worksheets("Proformas"). Sort. SortFields.Add(Range("MisDatos"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
, 240)
With ActiveWorkbook.Worksheets("Proformas").Sort
.SetRange Range("MisDatos")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("D10").Select
[email protected]
Gracias por la formación, esta muy claro y he tomado buena nota, pero no me sirve por 2 motivos. No puedo traspasar los datos a la fila 2 y ademas la función contar tiene en cuenta las celdas donde no hay fórmulas aunque su valor sea "".
He investigado y creo que hay otra manera de hacerlo, te adjunto el código que he realizado, yo creo que esta bien pero te agradezco me lo confirmes.
El código en teoría hace lo siguiente: mira la ultima celda con datos de la columna DE y selecciona el rango desde A8:X, siendo el nº de fila de X el mismo que la ultima fila con datos de la columna D. Y ordena por la columna E (dese E9 hasta la ultima celda de E con datos)
Dim ultfilaD As Long
ultfilaD = Sheets("Proformas").Range("D65536").End(xlUp).Row
ActiveWorkbook.Worksheets("Proformas").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Proformas").Sort.SortFields.Add(Range("E9").End(xlDown), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
, 240)
ActiveWorkbook.Worksheets("Proformas").Sort.SortFields.Add(Range("E9").End(xlDown), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(146, _
208, 80)
ActiveWorkbook.Worksheets("Proformas").Sort.SortFields.Add Key:=Range("E9").End(xlDown), _
SortOn:=xlSortOnCellColor, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Proformas").Sort
.SetRange Range("A8:X" & ultfilaD)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("E9").Select
End Sub
Gracias por tu ayuda
Si ese código te funciona, perfecto.
[email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas