Macro que extraiga números que están como texto

31/05/2016 - 17:49 por Pol | Informe spam
Hola, a todos, a ver si me pueden echar una mano con la siguiente macro.

Tras convertir una factura en PDF a EXCEL el resultado es que me quedan los datos similares a estos pero con mucho texto y números variados de cifras entre los grupos de códigos que se muestran a continuación, colocados de este modo:

COLUMNA:A B C D E F G
FILA1 Producto1 0,95 18 0,78 21 08410435051001
2 Producto2 1,69 18 1,39 21 08411660170212
3 Producto3 1,99 18 1,63 21 08411660170303
4 Producto4 1,69 18 1,39 21 08411660170234
5 Producto5 1,27 18 1,04 21 08410469200355
6
7 ENTRE GRUPO Y GRUPO HAY UNA SEPARACIÓN CON TEXTO Y NÚMEROS
8
9 Producto6 0,95 18 0,78 21 08410435051006
10 Producto7 1,69 18 1,39 21 08411660170217
11 Producto8 1,99 18 1,63 21 08411660170308
12 Producto9 1,69 18 1,39 21 08411660170239
13 Producto10 1,27 18 1,04 21 08410469200310
14
15 TEXTO... VARIADO
16
17 Producto11 0,95 18 0,78 21 08410435051011
18 Producto12 1,69 18 1,39 21 08411660170212
19 Producto13 1,99 18 1,63 21 08411660170313
20 Producto14 1,69 18 1,39 21 08411660170214
21 Producto15 1,27 18 1,04 21 08410469200315

La intención es que mediante una macro conseguir el modo que me vaya recorriendo la columna "G" que vienen siendo los códigos de los productos, y por cada código que localice (que sea un número de más de 10 cifras) copie toda la fila entera y la traslade a la hoja2 del mismo libro de modo que elimine todo el resto de datos que no sean las filas que contienen los códigos.

Está la complicación de que los números están grabados en excel como texto y por código VBA no consigo que se
conviertan en números.

He probado grabando macros para eliminar todo lo que no sean filas con códigos, pero como las facturas no son
siempre iguales, el resultado no es válido.

La cuestión es que tengo que extraer todas las filas y que me queden de este modo.

EN LA HOJA2

COLUMNA:A B C D E F G
FILA1 Producto1 0,95 18 0,78 21 08410435051001
2 Producto2 1,69 18 1,39 21 08411660170212
3 Producto3 1,99 18 1,63 21 08411660170303
4 Producto4 1,69 18 1,39 21 08411660170234
5 Producto5 1,27 18 1,04 21 08410469200355
9 Producto6 0,95 18 0,78 21 08410435051006
10 Producto7 1,69 18 1,39 21 08411660170217
11 Producto8 1,99 18 1,63 21 08411660170308
12 Producto9 1,69 18 1,39 21 08411660170239
13 Producto10 1,27 18 1,04 21 08410469200310
17 Producto11 0,95 18 0,78 21 08410435051011
18 Producto12 1,69 18 1,39 21 08411660170212
19 Producto13 1,99 18 1,63 21 08411660170313
20 Producto14 1,69 18 1,39 21 08411660170214
21 Producto15 1,27 18 1,04 21 08410469200315

He pensado utilizar el método For-Next, pero no doy con la forma de pedirle al método For que recorra la columna G, y cuando localice un número que tenga más de 10 cifras copie la fila entera y la pase a la hoja 2 situándola al final de cada fila.

Agradecería cualquier ayuda.

Muchas gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Emilio
31/05/2016 - 19:41 | Informe spam
-
¡Importante!: Colabora con el grupo.Contesta a este mensaje
y dinos si te sirvió o no la respuesta dada. Muchas gracias
-
Hola!
para convertir esos números en número (valga la redundancia), solo tienes
que seleccionarlos y hacer, ya sea en un procedimiento o simplemente en la
ventana inmediato:
Selection.value=Selection.value

Otro método puede ser sumarles un cero mediante pegado especial > Sumar.

Saludos a todos desde Huelva

Emilio [MS-MVP Access 2006/11]
http://www.mvp-access.com/foro
http://www.mvp-access.es/emilio
"Pol" escribió en el mensaje de
noticias:

Hola, a todos, a ver si me pueden echar una mano con la siguiente macro.

Tras convertir una factura en PDF a EXCEL el resultado es que me quedan los
datos similares a estos pero con mucho texto y números variados de cifras
entre los grupos de códigos que se muestran a continuación, colocados de
este modo:

COLUMNA:A B C D E F G
FILA1 Producto1 0,95 18 0,78 21 08410435051001
2 Producto2 1,69 18 1,39 21 08411660170212
3 Producto3 1,99 18 1,63 21 08411660170303
4 Producto4 1,69 18 1,39 21 08411660170234
5 Producto5 1,27 18 1,04 21 08410469200355
6
7 ENTRE GRUPO Y GRUPO HAY UNA SEPARACIÓN CON TEXTO Y NÚMEROS
8
9 Producto6 0,95 18 0,78 21 08410435051006
10 Producto7 1,69 18 1,39 21 08411660170217
11 Producto8 1,99 18 1,63 21 08411660170308
12 Producto9 1,69 18 1,39 21 08411660170239
13 Producto10 1,27 18 1,04 21 08410469200310
14
15 TEXTO... VARIADO
16
17 Producto11 0,95 18 0,78 21 08410435051011
18 Producto12 1,69 18 1,39 21 08411660170212
19 Producto13 1,99 18 1,63 21 08411660170313
20 Producto14 1,69 18 1,39 21 08411660170214
21 Producto15 1,27 18 1,04 21 08410469200315

La intención es que mediante una macro conseguir el modo que me vaya
recorriendo la columna "G" que vienen siendo los códigos de los productos, y
por cada código que localice (que sea un número de más de 10 cifras) copie
toda la fila entera y la traslade a la hoja2 del mismo libro de modo que
elimine todo el resto de datos que no sean las filas que contienen los
códigos.

Está la complicación de que los números están grabados en excel como texto y
por código VBA no consigo que se
conviertan en números.

He probado grabando macros para eliminar todo lo que no sean filas con
códigos, pero como las facturas no son
siempre iguales, el resultado no es válido.

La cuestión es que tengo que extraer todas las filas y que me queden de este
modo.

EN LA HOJA2

COLUMNA:A B C D E F G
FILA1 Producto1 0,95 18 0,78 21 08410435051001
2 Producto2 1,69 18 1,39 21 08411660170212
3 Producto3 1,99 18 1,63 21 08411660170303
4 Producto4 1,69 18 1,39 21 08411660170234
5 Producto5 1,27 18 1,04 21 08410469200355
9 Producto6 0,95 18 0,78 21 08410435051006
10 Producto7 1,69 18 1,39 21 08411660170217
11 Producto8 1,99 18 1,63 21 08411660170308
12 Producto9 1,69 18 1,39 21 08411660170239
13 Producto10 1,27 18 1,04 21 08410469200310
17 Producto11 0,95 18 0,78 21 08410435051011
18 Producto12 1,69 18 1,39 21 08411660170212
19 Producto13 1,99 18 1,63 21 08411660170313
20 Producto14 1,69 18 1,39 21 08411660170214
21 Producto15 1,27 18 1,04 21 08410469200315

He pensado utilizar el método For-Next, pero no doy con la forma de pedirle
al método For que recorra la columna G, y cuando localice un número que
tenga más de 10 cifras copie la fila entera y la pase a la hoja 2 situándola
al final de cada fila.

Agradecería cualquier ayuda.

Muchas gracias de antemano.
Respuesta Responder a este mensaje
#2 Pol
31/05/2016 - 20:28 | Informe spam
Ok, muchas gracias por el aporte, esa era una de las complicaciones porque al conseguir que sea número ahora sería que analice si tiene más de 10 cifras el valor de la celda, y de ser true, que copie la fila entera y la lleve a la última fila de la hoja 2.

Voy a intentarlo a ver que problema me vuelve a surgir...

Muchas gracias.
Respuesta Responder a este mensaje
#3 David_erh
03/06/2016 - 01:12 | Informe spam
Hola, en tu macro puedes utilizar la propiedad Len(valor) que cuenta cuantos caracteres hay en esa celda.

celda = ActiveCell.Value 'valor de la celda actual
largo = Len(celda)

If largo > 10 Then
MsgBox "la celda tiene mas de 10 caractéres"
Else
MsgBox "la celda tiene menos de 10 caractéres"
End If

Espero te ayude.

Saludos

El martes, 31 de mayo de 2016, 13:28:06 (UTC-5), Pol escribió:
Ok, muchas gracias por el aporte, esa era una de las complicaciones porque al conseguir que sea número ahora sería que analice si tiene más de 10 cifras el valor de la celda, y de ser true, que copie la fila entera y la lleve a la última fila de la hoja 2.

Voy a intentarlo a ver que problema me vuelve a surgir...

Muchas gracias.
Respuesta Responder a este mensaje
#4 Pol
07/06/2016 - 23:59 | Informe spam
Gracias por la aportación David, por ahora he conseguido lo que necesito, he conseguido borrar todas las celdas sobrantes y que las filas queden todas juntas, y luego le doy formato colocándolas como necesito, pero me queda una cuestión, que es conseguir que los números de código, los que están en la última columna del tipo:

08410435051011

Necesito que analice si el primer carácter (es número que está como texto), si es igual a 0 que lo borre, pero el problema es que a veces hay más de un cero, puede ser el número del siguiente modo:

00084104350510

En este caso habría que eliminar 3 ceros, como pueden ser de 1 a 6 ceros, por lo que el código siguiente que es el que utilizo no sirve.


Por ahora estoy haciendo lo siguiente:

For i = 1 To Counter
' comprueba que la celda activa esté en vacía.
If ActiveCell = "" Or ActiveCell.Offset(0, 3).Value = "" Then
Selection.EntireRow.Delete
' Decrementa el contador por cada fila eliminada
Counter = Counter - 1
Else

Valor = ActiveCell.Value
resultado = Trim(Right(Valor, Len(Valor) - 1))
ActiveCell.Value = resultado
' selecciona la siguiente fila.
ActiveCell.Offset(1, 0).Select
End If

Next i


Agradecería si alguien me puede echar una mano a construir algún método que analice si los números que están a la izquierda son ceros, que los elimine.

Gracias de antemano.
Respuesta Responder a este mensaje
#5 Emilio
08/06/2016 - 20:41 | Informe spam
-
¡Importante!: Colabora con el grupo.Contesta a este mensaje
y dinos si te sirvió o no la respuesta dada. Muchas gracias
-
Hola!
escribo al vuelo

Dim i As Long, strLaCadena As String

strLaCadena = "00084104350510"
For i = 1 To Len(strLaCadena)
If Not Mid(strLaCadena, i, 1) = 0 Then Exit For
Next i
strLaCadena = Mid(strLaCadena, i)

Saludos a todos desde Huelva

Emilio [MS-MVP Access 2006/11]
http://www.mvp-access.com/foro
http://www.mvp-access.es/emilio
"Pol" escribió en el mensaje de
noticias:

Gracias por la aportación David, por ahora he conseguido lo que necesito, he
conseguido borrar todas las celdas sobrantes y que las filas queden todas
juntas, y luego le doy formato colocándolas como necesito, pero me queda una
cuestión, que es conseguir que los números de código, los que están en la
última columna del tipo:

08410435051011

Necesito que analice si el primer carácter (es número que está como texto),
si es igual a 0 que lo borre, pero el problema es que a veces hay más de un
cero, puede ser el número del siguiente modo:

00084104350510

En este caso habría que eliminar 3 ceros, como pueden ser de 1 a 6 ceros,
por lo que el código siguiente que es el que utilizo no sirve.


Por ahora estoy haciendo lo siguiente:

For i = 1 To Counter
' comprueba que la celda activa esté en vacía.
If ActiveCell = "" Or ActiveCell.Offset(0, 3).Value = "" Then
Selection.EntireRow.Delete
' Decrementa el contador por cada fila eliminada
Counter = Counter - 1
Else

Valor = ActiveCell.Value
resultado = Trim(Right(Valor, Len(Valor) - 1))
ActiveCell.Value = resultado
' selecciona la siguiente fila.
ActiveCell.Offset(1, 0).Select
End If

Next i


Agradecería si alguien me puede echar una mano a construir algún método que
analice si los números que están a la izquierda son ceros, que los elimine.

Gracias de antemano.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida