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