¿Copiar y ordenar una columna de excel?

Saludos, espero alguien pueda ayudarme, mi problema es el siguiente: tengo una columna de datos (bastante larga por cierto pero no creo que eso sea importante) estos datos vienen de una maquina, y se descargan en excel para realizar unos cálculos pero antes deben estar ordenados, se que ordenarlos es fácil, pero lo que necesito es que lo haga de forma automática, es decir: si los datos se colocan en la columna A estos automáticamente se copien en la columna B pero de manera ordenada, gracias espero me puedan ayudar!!!

1 Respuesta

Respuesta
1

Pega este código en Visual Basic (para abrir presiona Alt+F11) en la Hoja3 de los proyectos (para encontrar esta hoja selecciona en lista de proyectos a la izquierda de la pantalla). Esto es un ejemplo! Para tu caso tendrás que pegar este código en la hoja correspondiente y reemplazar en el código Hoja3 por Hoja(i) donde (i) es el número de tú hoja. Por ejemplo si tu Hoja es Hoja1 pues cambias en el código Hoja3 por Hoja1 y pegas este código en la ventana de proyectos de la Hoja1.

OJO CON EL RANGO! Empieza en A3. Si tu rango empieza en A4 cambia todos los A3 por A4

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$3" Then
NoFilas = WorksheetFunction.Subtotal(3, Range("A3:A1000")) + 3
Range("A3:A" & NoFilas).Copy Range("B3")
Range("B3").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Hoja3").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Hoja3").Sort.SortFields.Add Key:=Range("B3"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Hoja3").Sort
.SetRange Range("B3:B" & NoFilas)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End Sub

Saludos, primero que nada gracias por tu ayuda tu código me funciono de maravilla solo realice los pequeños cambios para adaptarlo y trabaja muy; solo me gustaría saber para concluir si alguna manera de que se ejecute el código con un método abreviado o algo parecido, y es que los datos sin ordenar siempre se van a copiar de un bloc de notas (allí los guarda el aparato que los genera) y se van a pegar en la celda correspondiente y al hacerlo el código no se ejecuta para que se ejecute debo sobrescribir el primer dato, no es algo indispensable pero si se pudiera ejecutar de otra forma control o, o algo asi para no tender que sobrescribir la celda seria perfecto, pero no es mal de morir si es muy engorroso asi esta bien, este es el código que me facilitastes con los detalles de mi hojas:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
NoFilas = WorksheetFunction.Subtotal(3, Range("C2:C2000")) + 3
Range("C2:C" & NoFilas).Copy Range("D2")
Range("D2").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("D2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Hoja1").Sort
.SetRange Range("D2:D" & NoFilas)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End Sub

Gracias de nuevo esta perfecto, si lo otro no se puede me avisas para cerra esta pregunta y calificar!!!

En ocasiones, para cambios automáticos en celda, no se reconoce dicho cambio en la celda puesto que el evento Worksheet_Change sólo detecta cambios manuales.

La verdad es que hay varias opciones para resolver esto:

1. Si el pegado se hace de manera automática mediante una macro lo único que tienes que hacer es pegar el código de la macro Worksheet_Change al final de la macro de pegado.

Para ello copia el código sin la condición IF al final de la macro de pegado. Es decir:

<pre class="prettyprint" style="width: 555px; height: 211px;">NoFilas = WorksheetFunction.Subtotal(3, Range("C2:C2000")) + 3
Range("C2:C" & NoFilas).Copy Range("D2")
Range("D2").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("D2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Hoja1").Sort
.SetRange Range("D2:D" & NoFilas)
.Header = xlNo .MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With</pre>

Para este mismo caso puedes crear una macro con este código y llamarlo desde la otra macro al final escribiendo:

Call Nombre_de_la_macro

donde Nombre_de_la_macro es el nombre que le has puesto, por ejemplo:

Sub Ordenar()

'el código...

End sub

En esta caso la llamada desde la macro de pegado sería:

Sub Pegado()

'Código de pegado desde bloc de notas

Call Ordenar

End Sub

2. Crear un botón para hacer creer al evento WorkSheet_Change que la introducción es manual. En el código de dicho botón lo único que tienes que hacer es hacer un copia_pega de la primera celda.

Para crear el botón vas a la pestaña Programador (en la parte superior) y seleccionas en Controles (subdivisión de Programador) la opción insertar. En la opción insertar le das a la opción Botón.

Desgraciadamente no conozco la forma de que ante un evento automático se detecte el cambio en la celda, llevo tiempo intentando saber cómo hacerlo pero no hay forma... XD

Esto es porque generalmente un evento automático está asociado a una macro por lo que tu código lo podrás ejecutar desde dicha macro (1a opción). Se supone que tiene que existir dicho evento pero por si algún motivo no lo detectas la segunda opción también es válida aunque cutre...

Si tienes alguna duda ya sabes...

Muchas gracias, por tu ayuda y haberle dedicado tiempo a mi problema quedo de lujo, le coloque un botón y el código final me quedo así:

Sub Ordenar()
NoFilas = WorksheetFunction.Subtotal(3, Range("D10:D10000")) + 10
Range("D10:D" & NoFilas).Copy Range("E10")
Range("E10").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("E10"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Hoja1").Sort
.SetRange Range("E10:E" & NoFilas)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

Trabaja perfecto los cambios de columnas se deben a que le he realizados mas cambios a la hoja, es un libro bastante complejo el estoy haciendo y ya estoy a tiro de terminarlo gracias a tus explicaciones!!!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas