Imprimir página | Cerrar ventana

Ordenar el área Seleccionada

Impreso de: Foro de Access y VBA
Categoría: Otros de Microsoft: Windows y Office
Nombre del foro: Excel
Descripción del foro: Foro de Excel y VBA de Excel
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85923
Fecha de impresión: 19/Abril/2024 a las 11:03


Tema: Ordenar el área Seleccionada
Publicado por: Gladiador
Asunto: Ordenar el área Seleccionada
Fecha de publicación: 01/Abril/2021 a las 20:42
Buenas a todos.
Nuevamente solicito su valiosa ayuda con la siguiente instrucción

He grabado una macro para ordenar fechas del mas antiguo al mas nuevo, según el área que he seleccionado

Sin embargo me da un error en tiempo de ejecución, cuando le digo "Depurar", se coloca en la última instrucción  "Apply"

Esta es la macro

Dim myRange As Range
Set myRange = Selection
'
    ActiveWorkbook.Worksheets("Cuenta").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Cuenta").Sort.SortFields.Add2 Key:=myRange, _
         SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Cuenta").Sort
        .SetRange myRange
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply           (acá es donde indica que es el error)
    End With


Que puedo estar haciendo mal?

Otro punto, de esta misma consulta.

Es posible cambiar la instrucción ActiveWorkbook.Worksheets("Cuenta") por ActiveSheet
La idea es grabar la Macro en mi libro Personal, de manera de poder usarlo en cualquier hoja en la que me encuentre trabajado.

Gracias por la ayuda




Respuestas:
Publicado por: SkaryBlondi
Fecha de publicación: 01/Abril/2021 a las 21:01
Hola

Prueba con

.SetRange Range(myRange)

Saludos,


Publicado por: AnSanVal
Fecha de publicación: 01/Abril/2021 a las 21:16
A mi me funciona sin error 'tal cual' tienes el código.

Teniendo en cuenta que...
- Tu macro no trabaja con rangos absolutos sino con la variable myRange.
- Sin ver como son tus datos.
- Sin ver que rango tienes seleccionado.
... es decir: como lo haces... no puedo decirte lo que estás haciendo malErmm




-------------
Saludos desde Tenerife.


Publicado por: AnSanVal
Fecha de publicación: 01/Abril/2021 a las 21:29
Suponiendo que tu afirmación...

« Es posible cambiar la instrucción ActiveWorkbook.Worksheets("Cuenta") por ActiveSheet »

... pretende ser una pregunta, la respuesta es  Sí .




-------------
Saludos desde Tenerife.


Publicado por: Gladiador
Fecha de publicación: 02/Abril/2021 a las 20:42
Hola, gracias por las respuestas y las aclaratorias.


Gracias SkaryBloni por tu aporte

Gracia AnSanVal por tus observaciónes.

Tengo una tabla con fechas en la columna C, luego datos en las columnas D,E,F,G,H

A veces se introducen datos, con fechas anteriores a la última fecha ingresada, y deben ser ordenados por fechas para mantener la secuencia.

Luego de revisar detenidamente la macro me he dado cuenta de lo siguiente:

Dim myRange As Range
Set myRange = Selection

    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add2 Key:=Range( _
        "C100:C109"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("C100:H109")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

El rango C100:C109 corresponde a la columna que se va a ordenar;
Mientras el rango C100:H109 corresponde al área seleccionada.

Por lo tanto myRange solo puedo usarlo aqui:

    With ActiveSheet.Sort
        .SetRange myRange
        .
        .
y funciona.

Ahora, mi problema radica en cómo instruir a la macro para que tome como la columna de "ordenamiento" la primera columna de la selección? En este caso la columna "C"

Me gustaría usar la macro en otras hojas en donde la columna de fecha no está necesariamente en la columna "C"

Gracias


Publicado por: AnSanVal
Fecha de publicación: 02/Abril/2021 a las 22:42
«... mi problema radica en cómo instruir a la macro para que tome como la columna de "ordenamiento" la primera columna de la selección...»

Puedes hacerlo con RESIZE: Set myRange = Selection.Resize(Selection.Rows.Count, 1)





-------------
Saludos desde Tenerife.


Publicado por: Gladiador
Fecha de publicación: 03/Abril/2021 a las 05:00
Gracias AnSanVal, funciona bien.

La macro quedó como sigue:

Dim myRange, mycol As Range
Set myRange = Selection
Set mycol = Selection.Resize(Selection.Rows.Count, 1)

'
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add2 Key:=mycol, _
         SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveSheet.Sort
        .SetRange myRange
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Muy agradecido

Se puede cerrar el hilo

Gladiador



Imprimir página | Cerrar ventana