Macro para ordenar automáticamente según valores copiados

Les pido ayuda para ordenar automáticamente datos que se copian de una hoja a otra.

Según la siguiente macro, al hacer doble clic en cualquier celda del rango A2:E11 de la hoja "Original", los valores de la fila en donde se haga el doble clic se van copiando en la primera fila vacía de la hoja "Copia", contando a partir del rango B2 de la misma.

En la hoja "Original", los datos que hay en A2:A11 son números, todos diferentes entre sí (ej: 45, 98, 73, 520, etc.). De esta manera, si en la hoja "Original" hago doble clic en la fila 5, todos los datos de dicha fila se copian en hoja "Copia" a partir de B2; y en B2 el dato que queda copiado es el número.

Lo que necesito es que a medida que se van copiando los valores de las filas en la hoja "Copia", los mismos se vayan ordenando automáticamente de menor a mayor según el número que va quedando copiado en la columna B.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim UltimaFila As Long
If Not Intersect(Target, Range("A2:E11")) Is Nothing And Intersect(Target, Range("B2:E11")) <> "" Then
Cancel = True
fila = Target.Row
UltimaFila = 1 + Sheets("Copia").Cells(Rows.Count, "B").End(xlUp).Row
Sheets("Copia").Cells(UltimaFila, 2) = Sheets("Original").Range("A" & fila & ":A" & fila).Value
Sheets("Copia").Cells(UltimaFila, 3) = Sheets("Original").Range("B" & fila & ":B" & fila).Value
Sheets("Copia").Cells(UltimaFila, 4) = Sheets("Original").Range("C" & fila & ":C" & fila).Value
Sheets("Copia").Cells(UltimaFila, 5) = Sheets("Original").Range("D" & fila & ":D" & fila).Value
Sheets("Copia").Cells(UltimaFila, 6) = Sheets("Original").Range("E" & fila & ":E" & fila).Value
Target.Offset(1, 0).Select
Exit Sub
End If
End Sub

2 Respuestas

Respuesta

¿En la hoja "copia" solo hay datos de la columna B a la F?

¿No hay nada en a la columna A? o de la G en adelante? (Alguna fórmula quizás)

Suponiendo que es así...

agrega debajo de        Dim UltimaFila As Long   lo siguiente

Dim Hoja As Worksheet
Dim Data As Range

y después de tu código (antes de End Sub)  lo siguiente:

Set Hoja = Sheets("copia")
Set Data = Hoja.Range("B1").CurrentRegion
Data.Sort _
          Key1:=Hoja.Cells(2, 2), Order1:=xlAscending, _
          Header:=xlYes
Set Hoja = Nothing
Set Data = Nothing

Jaime,

Tienes razón... No es sólo que debe ordenar B:F, éste lo utilicé como ejemplo. Debe ordenar el rango A:S, teniendo en cuenta que el rango B:D, J:S son fórmulas... ¿Puedes ayudarme con esta modificación?

Yo lo he programado asumiendo que en la hoja hay una tabla (y nada más que la tabla con los datos)... así que eso no sería un problema..

Por otro lado, por lo que había entendido de tu pregunta... se debía ordenar en base a la columna B.

En la macro, la instrucción Cells(2, 2) así lo hace... si deseas cambiarla, cambia el segundo 2 por la columna que corresponde (o la letra)

Cells(2, 2) o Cells(2,"B") => ordena en base a la columna B

Cells(2, 1) o Cells(2,"A") => ordena en base a la columna A

Cells(2, 3) o Cells(2,"C") => ordena en base a la columna C... etc.

Si, tiene que ordenar en base a la columna B, es así. Lo que quise decir es que los datos son en el rango B:S y no B:F como había planteado al principio.

Lo que me está pasando es que ordena los datos sólo en el rango B:F. O sea, al hacer doble clic en filas consecutivas, copia todo bien. Pero al hacer doble clic en alguna fila anterior a las que ya había hecho doble clic, en la hoja "copia" ordena bien en relación a B, pero todos los otros datos los ordena bien sólo hasta F; a partir de F es como que mezcla datos o directamente los hace desaparecer. Describo cómo estoy poniendo la macro para que me indiques si hay algo mal. En este caso lo estoy poniendo datos hasta la columna H.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim UltimaFila As Long
Dim Hoja As Worksheet
Dim Data As Range
If Not Intersect(Target, Range("A2:H11")) Is Nothing And Intersect(Target, Range("B2:H11")) <> "" Then
Cancel = True
fila = Target.Row
UltimaFila = 1 + Sheets("Copia").Cells(Rows.Count, "B").End(xlUp).Row
Sheets("Copia").Cells(UltimaFila, 2) = Sheets("Original").Range("A" & fila & ":A" & fila).Value
Sheets("Copia").Cells(UltimaFila, 3) = Sheets("Original").Range("B" & fila & ":B" & fila).Value
Sheets("Copia").Cells(UltimaFila, 4) = Sheets("Original").Range("C" & fila & ":C" & fila).Value
Sheets("Copia").Cells(UltimaFila, 5) = Sheets("Original").Range("D" & fila & ":D" & fila).Value
Sheets("Copia").Cells(UltimaFila, 6) = Sheets("Original").Range("E" & fila & ":E" & fila).Value
Sheets("Copia").Cells(UltimaFila, 7) = Sheets("Original").Range("F" & fila & ":F" & fila).Value
Sheets("Copia").Cells(UltimaFila, 8) = Sheets("Original").Range("G" & fila & ":G" & fila).Value
Sheets("Copia").Cells(UltimaFila, 9) = Sheets("Original").Range("H" & fila & ":H" & fila).Value
Target.Offset(1, 0).Select
Exit Sub
End If
Set Hoja = Sheets("copia")
Set Data = Hoja.Range("B1").CurrentRegion
Data.Sort _
          Key1:=Hoja.Cells(2, 2), Order1:=xlAscending, _
          Header:=xlYes
Set Hoja = Nothing
Set Data = Nothing
End Sub

Respuesta
1

Tu macro tiene un error aquí me marca error 91, variable de objeto o with no establecido, respecto a la ordenación estas son las instrucciones, solo añade estas líneas a después de la línea en negrita.

Target.Offset(1, 0).Select

Set ordena = Sheets("copia").Range("b2").CurrentRegion

With ordena
filas = .Rows.Count
If filas > 1 Then .Sort key1:=Sheets("copia").Range(.Columns(1).Address), order1:=xlAscending
End With
Exit Sub
End If

End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas