Ordenando el campo de texto del juego de registros ADO como numérico
Pregunta
Al usar VBA tengo un conjunto de funciones que devuelven un ADODB.Recordset
donde todas las columnas aparecen como adVarChar
. Desafortunadamente, esto significa que los números se ordenan como texto. Así que 1,7,16,22 se convierte en 1,16,22,7
¿Hay algún método que pueda ordenar los valores numéricos como columnas de texto sin tener que cambiar el tipo de columna?
Sub TestSortVarChar()
Dim strBefore, strAfter As String
Dim r As ADODB.RecordSet
Set r = New ADODB.RecordSet
r.Fields.Append "ID", adVarChar, 100
r.Fields.Append "Field1", adVarChar, 100
r.Open
r.AddNew
r.Fields("ID") = "1"
r.Fields("Field1") = "A"
r.AddNew
r.Fields("ID") = "7"
r.Fields("Field1") = "B"
r.AddNew
r.Fields("ID") = "16"
r.Fields("Field1") = "C"
r.AddNew
r.Fields("ID") = "22"
r.Fields("Field1") = "D"
r.MoveFirst
Do Until r.EOF
strBefore = strBefore & r.Fields("ID") & " " & r.Fields("Field1") & vbCrLf
r.MoveNext
Loop
r.Sort = "[ID] ASC"
r.MoveFirst
Do Until r.EOF
strAfter = strAfter & r.Fields("ID") & " " & r.Fields("Field1") & vbCrLf
r.MoveNext
Loop
MsgBox strBefore & vbCrLf & vbCrLf & strAfter
End Sub
NB: Estoy usando Project 2003 y Excel 2003 y estoy haciendo referencia a Microsoft ActiveX DataObject 2.8 Library
Solución
Teclado izquierdo con ceros con al menos tantos como dígitos de número máximo. por ejemplo
0001 0010 0022 1000
Puedes usar Right $ () para lograr esto.
Otros consejos
Use la función Val () para ordenar numéricamente en una columna de texto. Ejemplo:
SELECT ID, Field1
FROM tablename
ORDER BY Val(Field1);