Separar datos de una columna

Hola
Mi nombre es Walter y tengo la siguiente consulta:
Estoy trabajando con una planilla de excel y en una de las columnas tengo códigos de mercadería, algo así para darte una idea:
12345
BS12346AB
12347
12348X
A 12349
Lo que preciso es ordenar esa tabla por número, tal como en el ejemplo anterior pero al tener letras me hace cualquier cosa.
Mi idea era separar los números de las letras en distintas columnas y ordenar todo por la que tiene el número pero son cerca de 1000 registros, ¿habrá posibilidad de hacerlo mediante código VBA o tienes alguna otra sugerencia?
Muchas gracias.
Walter
Respuesta
1
Se puede hacer una macro que te separe automáticamente los datos en varias columnas, pero tendrías que decirme como debe ser el formato final.
Basándome en tu ejemplo, mi idea es hacer 3 nuevas columnas donde la primera seria para letras (si las hay al principio), la segunda de números y la tercera de letras (si las hay al final)
Si mi idea es correcta, te escribiré el código y sino corrígeme.
Hola Ramón
Ante todo muchas gracias por responder tan rápido.
Justamente mi idea era lo que vos me estás sugiriendo, separar la columna en tres, si se puede lograr me ayudarías mucho.
Hasta pronto y gracias nuevamente.
Walter
Prueba esta macro:
Sub DividirEnColumnas()
Dim sValor As String
Dim i As Integer
Range("A1").Select
sValor = ActiveCell.Value
While sValor <> ""
ActiveCell.Offset(0, 1).Value = ""
ActiveCell.Offset(0, 2).Value = ""
ActiveCell.Offset(0, 3).Value = ""
i = 1
While i <= Len(sValor) And Asc(Mid(sValor, i, 1)) > 57
ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(0, 1).Value & Mid(sValor, i, 1)
i = i + 1
If i > Len(sValor) Then GoTo Siguiente
Wend
While i <= Len(sValor) And Asc(Mid(sValor, i, 1)) <= 57
ActiveCell.Offset(0, 2).Value = ActiveCell.Offset(0, 2).Value & Mid(sValor, i, 1)
i = i + 1
If i > Len(sValor) Then GoTo Siguiente
Wend
While i <= Len(sValor) And Asc(Mid(sValor, i, 1)) > 57
ActiveCell.Offset(0, 3).Value = ActiveCell.Offset(0, 3).Value & Mid(sValor, i, 1)
i = i + 1
If i > Len(sValor) Then GoTo Siguiente
Wend
Siguiente:
ActiveCell.Offset(1, 0).Select
sValor = ActiveCell.Value
Wend
End Sub
Solo tienes que cambiar la casilla A1 (en la tercera fila de código) por la primera donde tienes los datos
Si no sabes como ni donde poner la macro me lo preguntas y te lo explicare paso a paso.
Hola Ramón,
El código que me enviaste está perfecto, no tuve problemas en colocar la macro ni nada, anduvo muy bien pero lo que si necesito, si no es mucha molestia, es que me describas brevemente el funcionamiento de las líneas del programa porque me gustaría entenderlo mejor, más que nada de la línea 8 hasta la 17 ya que hay instrucciones que nunca vi, tipo offset, asc, mid y wend.
Muchas gracias.
Hasta pronto.
Walter
Otra vez yo,
Tengo códigos en donde intercala las letras y los números varias veces, por ejemplo: 60TB026B02
Y solo separa el 60 TB, el resto lo elimina, ¿se puede cambiar eso?, por ahí después de que me expliques un poco el funcionamiento y con un poco de tu ayuda lo haga yo.
Gracias y disculpame.
Atentamente.
Walter
Bien, voy a poner comentarios en las lineas a ver si te ayudo un poco...
Sub DividirEnColumnas()
'declaro un par de variables que luego utilizare
Dim sValor As String
Dim i As Integer
'ir a la primera casilla
Range("A1").Select
poner el valor de la primera casilla en la variable sValor
sValor = ActiveCell.Value
'Inicio del bucle hasta encontrar una casilla vacia, que sera el final
While sValor <> ""
'Offset sirve para desplazar y aqui limpio las casillas de las 3 columnas de la derecha por si habia algo
ActiveCell.Offset(0, 1).Value = ""
ActiveCell.Offset(0, 2).Value = ""
ActiveCell.Offset(0, 3).Value = ""
'inicilalizo la variable que me servira para recorrer el codigo alfanumerico sValor
i = 1
'comienzo a recorrer el codigo hasta que no llegue al final o encuentre un numero, ya que el primer trozo tiene que ser de letras
'la funcion Asc devuelve el codigo ascii de un caracter, y los numeros tienen el valor inferior o igual a 57, por eso compruebo que sea mayor
'la funcion Mid devuelve una parte intermedia de una cadena de texto. En este caso, la parte intermedia empieza en la posicion i y tiene una longitud de 1 caracter.
While i <= Len(sValor) And Asc(Mid(sValor, i, 1)) > 57
'Si cumple el requisito anterior, se añade la letra en la columna de la derecha
ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(0, 1).Value & Mid(sValor, i, 1)
'incremento i para analizar el siguiente caracter
i = i + 1
'Si estoy en el ultimo caracter, ya se termina
If i > Len(sValor) Then GoTo Siguiente
'La instruccion Wend cierra el bucle (que empieza por While)
Wend
While i <= Len(sValor) And Asc(Mid(sValor, i, 1)) <= 57
ActiveCell.Offset(0, 2).Value = ActiveCell.Offset(0, 2).Value & Mid(sValor, i, 1)
i = i + 1
If i > Len(sValor) Then GoTo Siguiente
Wend
While i <= Len(sValor) And Asc(Mid(sValor, i, 1)) > 57
ActiveCell.Offset(0, 3).Value = ActiveCell.Offset(0, 3).Value & Mid(sValor, i, 1)
i = i + 1
If i > Len(sValor) Then GoTo Siguiente
Wend
Siguiente:
ActiveCell.Offset(1, 0).Select
sValor = ActiveCell.Value
Wend
End Sub
Si hay alguna otra linea que no entiendas me lo dices.
Para hacer el caso especial que dices, tendrías que decirme en que columna tendriasn que ir los datos exactamente, porque si solo hay 3 columnas, representa que la primera es de texto, la segunda de números y la tercera de texto. Tal y como esta hecho, claro
Hasta pronto,
Ramon
Ramón,
Ante todo muchas gracias, tu solución era exactamente lo que necesitaba. Las aclaraciones son perfectamente entendibles. Por lo otro que te había preguntado no te preocupes porque no es de tanta importancia, con que separe esas 3 columnas es más que suficiente.
Muchas gracias nuevamente y lamentablemente te tengo que dar la valoración de Excelente (5 estellas) porque no existe mayor que esa.
Saludos.
Atentamente.
Walter

1 respuesta más de otro experto

Respuesta
1
Si, al ordenar tal cual, realmente NO te hace cualquier cosa, sino que te ordena primero los números y después los textos, cualquier valor que combine numero y textos pasa a ser texto...
Para lograr lo que quieres puedes: crear una macro que te separe numero y letras en otras columnas o crear una función que te devuelva solo los números de cada código, con cualquiera de las dos opciones te ayudo, solo aclarare cual te gusta más y si el único criterio para separar es números de texto.
Hola, gracias por responder.
Me inclino más por la primer opción, que todo lo que no sea número lo envíe a otras columnas por separado, lo intenté pero la verdad es que en VBA no tengo mucha experiencia y realmente no se bien como encarar el código.
Te agradeceré mucho que me des una mano con esto.
Muchas gracias.
Walter
La siguiente macro hace lo que quieres, también hice la función para que veas las diferencias, puedes solicitar le archivo de las pruebas a mi correo, si esto resuelve tu duda te agradeceré finalices la pregunta...
Mauricio
MbsARROBAinboxPUNTOnet
Option Explicit
'Esta es la macro, solo tienes que poner el cursor en
'cualquier codigo
Public Sub SoloNumeros()
Dim Datos As Range
Dim c As Range
Dim Valor As String
Dim Largo As Integer
Dim co1 As Integer
Dim Caracter As String
Dim sNum As String, sStr As String
Set Datos = ActiveCell.CurrentRegion
For Each c In Datos
Valor = Trim(c.Value)
Largo = Len(Valor)
For co1 = 1 To Largo
Caracter = Mid(Valor, co1, 1)
If IsNumeric(Caracter) Then
sNum = sNum & Caracter
Else
sStr = sStr & Caracter
End If
Next co1
c.Offset(0, 1).Value = sNum
c.Offset(0, 2).Value = sStr
sNum = ""
sStr = ""
Next c
Set Datos = Nothing
End Sub
'Esta es una función, solo le tienes que pasar UNA celda donde
'este el valor de donde quieras extraer los numeros, en caso
'de no contener numeros te devolvera 0 (cero)
Public Function Solo_Numeros(ByVal Valor As String) As Long
Dim Numero As Long
Dim Largo As Integer
Dim co1 As Integer
Dim Salir As Boolean
Dim Caracter As String
Dim sNum As String
Valor = Trim(Valor)
If IsNumeric(Valor) Or (Val(Valor) > 0) Then
'Este caso es para cuando el valor es un número o
'los primeros caracteres son números, por ejemplo
'12345 o 123AB
Numero = Val(Valor)
Else
'Este caso es para cuando es combinado, ejemplo
'AB123456 o AB123CD
'OJO para casos como AB12CD34 te devolvera 1234
Largo = Len(Valor)
For co1 = 1 To Largo
Caracter = Mid(Valor, co1, 1)
If IsNumeric(Caracter) Then
sNum = sNum & Caracter
End If
Next co1
Numero = Val(sNum)
End If
Solo_Numeros = Numero
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas