Ordenar textos en Excel

14/01/2009 - 15:48 por Mónica | Informe spam
Hola a todos,

Tengo una duda respecto a la ordenación de strings en Excel.

Mi problema es el siguiente:

Tengo una lista de strings que quiero ordenar en VBA para luego ir
comparando con otra lista. Para ello utilizo la siguiente función:

Range("A:J").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Esto me ordena mis filas de la siguiente manera:

"Texto bla bla"
& Texto
( Texto
* Texto
. Texto
¡ Texto
¿ Texto
+ Texto
014 Texto
100 Texto
Texto

Es decir, primero todos los caracteres especiales, después los números (como
texto) y luego los textos normales.
Esto está bien.

Por otro lado, tengo otra lista de la que voy sacando textos y debo
insertarlos en el lugar que le corresponda para que la lista siga ordenada.
Para ello hago lo siguiente:

While Sheets(1).Cells(fila, 1).Value <> "" And Not Encontrado And
UCase(CStr(Sheets(1).Cells(filaConso, 1).Value)) <= Mi_Nuevo_Texto

If UCase(Sheets(1).Cells(filaConso, 1).Value) = Mi_Nuevo_Texto
Then
Encontrado = True
Else
fila = fila + 1
End If

Wend

If Not Encontrado Then
'Insertar fila con el nuevo medio
Rows(fila + 1 & ":" & fila + 1).Select
Selection.Insert Shift:=xlUp
Range("A" & filaConso).Select
Cells(filaConso, 1).Value = Mi_Nuevo_Texto

TotalNuevos = TotalNuevos + 1
End If

Esto funciona perfecto si mi lista no tiene caracteres especiales pero, en
el caso anterior, si por ejemplo quiero insertar en la lista anterior el
texto 014 Texto2, lo lógico sería que me lo insertara después de 014 Texto,
pero no lo hace. Cuando compara Mi_Nuevo_Texto con lo que hay en la lista,
me sale que

?"¡ Texto" <= "014 Texto2"
falso

Es decir, me lo coloca antes que ¡ Texto.

Entonces,

¿Por qué las ordenaciones son distintas? ¿qué método debo utilizar para
comparar dos cadenas de caracteres y que lo haga correctamente?
(He probado también strComp y tampoco funciona bien).

¿Alguna idea? No me importa cambiar el método.

Había pensando también en si se podría hacer algo como una sentencia SQL
tipo "Insert into lista1 (select texto from lista2 where texto not in
(select texto from lista1)"
¿hay alguna forma de hacer esto de manera sencilla?

Muchas gracias por la ayuda.

Mónica
 

Leer las respuestas

#1 Héctor Miguel
14/01/2009 - 22:09 | Informe spam
hola, Mónica !

(hasta donde se) existen incluso diferencias en el criterio y evaluacion de los "sorts" en distintas versiones de excel
(probablemente) lo que podria evitar busquedas "inconsistentes" (por las diferencias anteriores) es:
- dar entrada (siempre ?) en la siguiente fila libre de tu listado
- repetir la macro del "sort" para que cada (nueva) entrada "tome el lugar que le corresponde"

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ OP __
Tengo una duda respecto a la ordenacion de strings en Excel.
Mi problema es el siguiente: Tengo una lista de strings que quiero ordenar en VBA
para luego ir comparando con otra lista. Para ello utilizo la siguiente funcion:

Range("A:J").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Esto me ordena mis filas de la siguiente manera: (...)
Es decir, primero todos los caracteres especiales, después los números (como texto) y luego los textos normales.
Esto esta bien.
Por otro lado, tengo otra lista de la que voy sacando textos y debo insertarlos en el lugar que le corresponda
para que la lista siga ordenada. Para ello hago lo siguiente:

While Sheets(1).Cells(fila, 1).Value <> "" And Not Encontrado And UCase(CStr(Sheets(1).Cells(filaConso, 1).Value)) <= Mi_Nuevo_Texto
If UCase(Sheets(1).Cells(filaConso, 1).Value) = Mi_Nuevo_Texto Then
Encontrado = True
Else
fila = fila + 1
End If
Wend
If Not Encontrado Then
'Insertar fila con el nuevo medio
Rows(fila + 1 & ":" & fila + 1).Select
Selection.Insert Shift:=xlUp
Range("A" & filaConso).Select
Cells(filaConso, 1).Value = Mi_Nuevo_Texto
TotalNuevos = TotalNuevos + 1
End If

Esto funciona perfecto si mi lista no tiene caracteres especiales pero, en el caso anterior
si por ejemplo quiero insertar en la lista anterior el texto 014 Texto2, lo lógico sería que me lo insertara después de 014 Texto
pero no lo hace. Cuando compara Mi_Nuevo_Texto con lo que hay en la lista, me sale que ?"¡ Texto" <= "014 Texto2" falso
Es decir, me lo coloca antes que ¡ Texto. Entonces,
Por que las ordenaciones son distintas? que metodo debo utilizar para comparar dos cadenas de caracteres y que lo haga correctamente?
(He probado también strComp y tampoco funciona bien).
Alguna idea? No me importa cambiar el metodo.
Había pensando también en si se podría hacer algo como una sentencia SQL tipo "Insert into lista1
(select texto from lista2 where texto not in (select texto from lista1)"
hay alguna forma de hacer esto de manera sencilla?

Preguntas similares