Ordenar lineas

Quisiera saber si puedo ordenar dentro de una linea varios registros con letra y numero en función de la letra, y de que manera.
Ej:
L Y100 Z200 X300 deberia aparecer como:
L X300 Y100 Z200
GRACIAS DE ANTEMANO ... Marcas
Respuesta
1
Si quieres que te eche una mano necesito más detalles. ¿Dónde quieres hacer eso?, ¿En Access, en Excel, en un programa en Visual Basic?.
¿Podría hacerse en word?
Tengo una mala noticia y una buena:
La mala noticia es que se puede hacer, pero requiere de programación de macros mediante Word Basic y es bastante complejo realizar dicha ordenación.
La buena noticia es que he hecho el código por ti :). Tienes que hacer lo siguiente:
1º En tu documento Word selecciona 'Herramientas', 'Macro', 'Macros...'.
2º Como nombre de la macro pon 'Ordenar' y pulsa en 'Crear'
3º En la ventana de código de Visual Basic que se abre y donde te aparezca el cursor pon el siguiente código:
'
' Macro grabada el 28/05/02 por Simón Hernández Dalmau
'
Dim Matriz(30), Aux1, Aux2 As String, i, j, k, l As Integer
Aux1 = ""
For i = 1 To Selection.Sentences.Count
' Comprueba si es una línea a ordenar (que empiece por 'L')
If Selection.Sentences(i).Words(1) = "L " Then
Aux1 = Aux1 + "L"
' Recupera elementos de la línea en una matriz
l = 0
For j = 2 To Selection.Sentences(i).Words.Count
' Quita espacios y retornos de carro del final
Aux2 = Selection.Sentences(i).Words(j).Text
k = 0
While k <> Len(Aux2)
k = Len(Aux2)
If Len(Aux2) <> 0 Then
If Right(Aux2, 1) = " " Or Asc(Right(Aux2, 1)) = 13 Then
Aux2 = Left(Aux2, Len(Aux2) - 1)
End If
End If
Wend
' Añade elemento si no es una cadena vacía
If Len(Aux2) <> 0 Then
l = l + 1
Matriz(l) = Aux2
End If
Next j
' Ordena la matriz de elementos
For j = 1 To l - 1
For k = j + 1 To l
If Matriz(j) > Matriz(k) Then
Aux2 = Matriz(j)
Matriz(j) = Matriz(k)
Matriz(k) = Aux2
End If
Next k
Next j
' Reconstruye la línea
For j = 1 To l
Aux1 = Aux1 + " " + Matriz(j)
Next j
' Añade retorno de carro
Aux1 = Aux1 + Chr(13)
Else
' Añade una línea que no hay que ordenar
Aux1 = Aux1 + Selection.Sentences(i)
End If
Next i
' Sustituye el texto
Selection.Text = Aux1
4º Cierra la ventana de Visual Basic
5º ¡Ya está!
A partir del momento en que hagas todo esto tienes una macro llamada 'Ordenar' que hace lo siguiente:
Sobre un texto que hayas seleccionado, las líneas que empiecen por 'L ' son ordenadas por orden creciente, y las demás no son tocadas. Las líneas deben estar separadas entre sí mediante <intro>, y los elementos dentro de la línea mediante un espacio, hasta un máximo de 30 (este límite es muy fácil de cambiar).
Si quieres hacer una prueba utiliza el siguiente texto:
Esto es una prueba
L Y200 Z300 X100
L X100 Y200 Z300
Si incorporamos cosas en medio
L Z300 Y200 X100
L X100 Z300 Y200
L Z300 X100 Y200
L Y200 X100 Z300
L esta rutina no sólo ordena números sino también palabras por orden alfabético
L 14 14 25 25 36 36 45 55 58 63 65 74 85 96 96
Lo metes en un documento Word vacío, seleccionas todo y ejecutas la macro 'Ordenar'.
Con ese código tienes bastante para aprender sobre macros, por lo que modifícalo a tu antojo para hacer las pruebas que consideres necesarias.
Ante todo agradecerte la ayuda, y te comento que me da dos errores:
EN " AÑADE RETORNO DE CARRO" ME DICE QUE HAY UN ELSE SIN IF
Y EN " AÑADE UNA LINEA QUE NO HAY QUE ORDENAR" ME DICE QUE HAY UN END IF SIN BLOQUE IF
Si los elimino no funciona
¿Cómo lo ves? GRACIAS
Debes haber cometido algún error al transcribir la función. Yo la copie del Word Basic y la pegué directamente en el mensaje. Si no lo has hecho así puedes haberte dejado algo atrás. En concreto, los dos errores que comentas tienen el mismo origen, y es la omisión del primer IF, el que aparece después de " Comprueba si es una línea a ordenar (que empiece por 'L')"
De todas maneras, al copiar se perdieron los tabuladores de la indentación, por lo que para clarificar el código es conveniente que los pongas. Por si no sabes lo que es indentación te lo explico. Consiste en añadir un tabulador (o varios espacios) a cada línea de código que esté comprendida dentro de un bloque lógico (IF - ENDIF, WHILE - WEND). Por ejemplo:
If DIVISOR<>0 Then
COCIENTE=DIVIDENDO/DIVISOR
Else
MsgBox("No se puede dividir por cero")
End If
Revisa el código y si aún así no funciona me lo comentas.
Saludos:
Entendido, y corregido.
Verás que ando muy pez, y por eso te agradezco más si cabe la ayuda.
He comprobado que funciona, cosa que en un principio no sabía si lo iba a conseguir.
Aplicándolo a los textos que me interesan, he comprobado que encuentro algunos errores:
Me interesaría que sólo afectara, dentro de cada línea, a las variables que van con POR, Y, Z y que afecte a todas las líneas, no sólo a las que comienzan por una letra específica ( en este caso la L )
Ej:
L Y200 Z300 X100 R0 F MAX M5
G0 G40 Y500 Z600 X400 F500 M13
Debería quedar:
L X100 Y200 Z300 R0 F MAX M5
G0 G40 X400 Y500 Z600 F500 M13
Y con esto creo que me quedaría el tema resuelto.
No se si se complica mucho la cosa, pero te agradecería estudiaras éstos últimos cambios ... un saludo
No abuses de tu suerte :). Bueno, tampoco costó tanto (la primera vez sí porque iba sobre nuevo, pero esta vez ha ido rodado). Coge todo el código que te mandé la 1ª vez, y sustitúyelo por lo siguiente:
'
' Macro creada el 04/06/02 por Simón Hernández Dalmau
'
Dim Matriz(30), Aux1, Aux2 As String, i, j, k, l As Integer
Aux1 = ""
i = 1
' Bucle por cada elemento (palabra)
While i <= Selection.Words.Count
' Comprueba si es un elemento a ordenar (que empiece por 'X', 'Y' o 'Z')
Aux2 = Left(Selection.Words(i).Text, 1)
If Aux2 = "X" Or Aux2 = "Y" Or Aux2 = "Z" Then
' Recupera elementos a ordenar en una matriz
l = 0
While (Aux2 = "X" Or Aux2 = "Y" Or Aux2 = "Z")
' Añade elemento
l = l + 1
Matriz(l) = Selection.Words(i).Text
' Recupera siguiente elemento para comprobar si hay que ordenar
i = i + 1
Aux2 = Left(Selection.Words(i).Text, 1)
Wend
' Ordena la matriz de elementos
For j = 1 To l - 1
For k = j + 1 To l
If Matriz(j) > Matriz(k) Then
Aux2 = Matriz(j)
Matriz(j) = Matriz(k)
Matriz(k) = Aux2
End If
Next k
Next j
' Reconstruye la línea con la matriz ordenada
For j = 1 To l
Aux1 = Aux1 + Matriz(j)
Next j
Else
' Añade un elemento que no hay que ordenar
Aux1 = Aux1 + Selection.Words(i)
i = i + 1
End If
Wend
' Sustituye el texto seleccionado
Selection.Text = Aux1
Y este código hace exactamente lo que necesitas. Sólo hace algo raro en un caso, y es cuando una línea termina en uno de los elementos que hay que ordenar, que se soluciona añadiendo un espacio antes del salto de línea.
Si tienes cualquier problema me avisas, pero te aconsejo que trastees con el código para que así aprendas más cosas sobre la programación de macros.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas