Saltar al contenido

Extraer numeros de cadena alfanumerica (mejorada)


Gerson Pineda

Recommended Posts

Hola!

Esta vez aportare una formula la cual sirve para extraer solo numeros de una cadena de texto (o sea de una celda), pues bien la he mojorado, ya que con un colega en otro foro, la referenciamos y me pico lo adicto y la mejore para que sea utilizada en diferentes idiomas de Excel (GUANCHE si pasas por aqui dime si resulta con el sueco:cool:)

No estoy seguro que exista en nuestro foro, la busque mas de una vez (o a lo mejor se perdio con el ultimo cambio que sufrio el mismo)

=--EXTRAE(A2,COINCIDIR(1,--ESNUMERO(--EXTRAE(A2,FILA(INDIRECTO(1&":"&LARGO(A2))),1)),),CONTAR(--EXTRAE(A2,FILA(INDIRECTO(1&":"&LARGO(A2))),1)))[/HTML]

Mejoras

1- Modifique esto a =COINCIDIR(VERDADERO... por esto =COINCIDIR(1...

2- Modifique esto = FILA($1:$9)... por esto FILA(INDIRECTO(1&":"&LARGO(A2)))...

3- Modifique esto =1*EXTRAE(... por esto =--EXTRAE(... {en toda la formula}

Espero sea de utilidad y comprension para todos:)

La formula original/fuente se encuentra aqui: [b]Extraer numeros de cadena alfanumerica [/b]

Proporcionado por Microsoft MVP Ashish Mathur

{Antoni sii sii ya se, seguro vendras con una de las tuyas :)}

Saludos desde Honduras

Extraer numeros de cadena con texto.zip

Enlace a comentario
Compartir con otras webs

Otra opción sin importar la posición de los numeros.

Se crea el nombre nFilas que es igual a:

=FILA(INDICE(!$A:$A,1):INDICE(!$A:$A,10))

Ahora la formula matricial para extraer los numeros de la celda A2

=SUMA(EXTRAE(0&A2,K.ESIMO.MAYOR(ESNUMERO(--EXTRAE(A2,nFilas,1))*nFilas,nFilas)+1,1)*10^nFilas/10)

Saludos

Extraer numeros de cadena con texto.zip

Enlace a comentario
Compartir con otras webs

Hola:

Pues después de ver a tanto "monstruo" por aquí, no iba yo a quedarme mudo.

Sub SoloNumeros()
For Each celda In Selection
For x = 1 To Len(celda.Value)
If IsNumeric(Mid(celda.Value, x, 1)) Then cadena = cadena & Mid(celda.Value, x, 1)
Next x
celda.Value = cadena
Next celda
End Sub
[/CODE]

Que los vientos os sean propicios para que vuestras naves lleguen a puerto amigo.

Y si no teneis naves, pues,...........no se,.....ya se me ocurrirá algo.

Saludos.

Enlace a comentario
Compartir con otras webs

Antoni esta excelente! bueno pues el archivo esta quedando muy bien jeje

Adjunto el agrupado de las formulas y macro (para comodidad de todos)

Hay un refrán español que dice:

"La cabra siempre tira al monte",......jajaja

Me la debes jajaja

Saludos

Extraer numeros de cadena alfanumerica.zip

Enlace a comentario
Compartir con otras webs

Hola a todos, muy buena recolilacion de formulas y macros. Desde mi punto de vista la de "tuve" esta sensacional porque es "NO matricial".

Segun yo, no sería practico hacer una supermegaformula en este post porque ya estan hechas todas aqui, se me ocurre irme por otro camino aprovechando las 64 anidadaciones de Excel 2010 y para evitar las formulas matriciales.

Espero les agrade.

Sep.rar

Enlace a comentario
Compartir con otras webs

Hola a todos, muy buena recolilacion de formulas y macros. Desde mi punto de vista la de "tuve" esta sensacional porque es "NO matricial".

Si bien con el añadido de la función INDICE en algunas formulas matriciales se evita la confirmación con Ctrl+Shift+Enter, eso NO mejora (en ocaciones empeora) el tiempo de calculo y efecto en el rendimiento del archivo.

Saludos

Enlace a comentario
Compartir con otras webs

Desde mi punto de vista la de "tuve" esta sensacional porque es "NO matricial".

Gracias por el comentario, pero sólo he aplicado una técnica conocida el uso de indice para evitar los corchetes, todo el mérido de la fórmula es de Gerson

Me ha parecido interesante tu aporte a este tema, un comentario falta nuestra querida "Ñ".

Buena aclaración sailepaty, no sabía que incluso en ocasiones es más lenta.

Enlace a comentario
Compartir con otras webs

Y para no dejar solo a Macro Antonio, aqui va una UDF.

Function SoloNumeros(sTexto As String) As Double
With CreateObject("VBScript.RegExp")
Application.Volatile
.Pattern = "\D"
.Global = True
SoloNumeros = .Replace(sTexto, "")
End With
End Function[/CODE]

Saludos

Enlace a comentario
Compartir con otras webs

Hola sailepaty fíjate que la función es SoloNumeros y su resultado OnlyNumbers lo que seguro que pasa por manejar dos idiomas.

Todas las soluciones aportadas obtienen todos los números juntos de la cadena, por ejemplo para:

A1 = ABCD1234EF567GH

=SoloNumeros(A1) = 1234567

Con lo que aparecen concatenados los dos números.

Function GetNum(ByVal txt As String, ByVal ref As Long) As Double
With CreateObject("VBScript.RegExp")
.Global = True
If ref > 0 Then
.Pattern = "\d+(\.\d+)?"
GetNum = .Execute(txt)(ref - 1)
Else
.Pattern = "\D"
GetNum = .Replace(txt, "")
End If
End With
End Function[/CODE]

Con esta función se obtiene:

=GetNum(A1;1) = [b]1234[/b]

=GetNum(A1;2) = [b]567[/b]

=GetNum(A1;0) = [b]1234567[/b]

El segundo argumento indica qué número se va a separar y si es <=0 no los separa.

Sirve para n números separados por caracteres alfabéticos.

Enlace a comentario
Compartir con otras webs

Gracias Gerson, pero no estaría completo si no explicara que he seguido el patrón de los angloparlantes, siguiendo con la sugerencia de sailepaty, ya que:

.Pattern = "\d+(\.\d+)?"     ' separa números decimales con el signo "." (en inglés)
.Pattern = "\d+(\,\d+)?" ' separa números decimales con el signo "," (en español)
.Pattern = "-?\d+(\,\d+)?" ' separa números decimales positivos y negativos con el signo "," (en español)[/CODE]

Realmente prefiero el último patrón de Regular Expression Syntax (Scripting) ya que si:

A1 = ABCD[b]-12,34[/b]EF[b]5,67[/b]GH

=GetNum(A1;1) = [b]-12,34[/b]

=GetNum(A1;2) = [b]5,67[/b]

Esto me recuerda que se me está olvidando el programa [b]sed (stream editor)[/b] con el que comencé a usar las expresiones regulares en Unix hace unos 30 años: sed (informática) - Wikipedia, la enciclopedia libre

Enlace a comentario
Compartir con otras webs

Buenas Noches, mi nombre es Adrián,

sería mucho pedir la fórmula para excel 2007 a la viceversa??

quiero decir, mi problema es que no consigo entender la lógica de la función ni con la explicación del autor original de la fórmula(en la página de microsoft), y necesito justamente lo contrario, extraer el texto y no los números de una cadena alfanumérica.

Muchasimas Gracias de antemano.

Enlace a comentario
Compartir con otras webs

Adrian bienvenido al foro

Es mejor que abras un nuevo para tu consulta, y de pronto puedes comenzar utilizando algo como esto: =SUSTITUIR(A2,D2,"",1) donde "D2" es uno de los resultados de las formulas, ya expuestas...

Nota: no olvides leer las normas, recomendaciones y anuncios de cada subforo

Saludos

Enlace a comentario
Compartir con otras webs

Crear una cuenta o conéctate para comentar

Necesitas ser usuario para poder dejar un comentario

Crear una cuenta

Registrarse para una nueva cuenta en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectarse

¿Ya tienes una cuenta? Conéctate aquí.

Conéctate ahora
  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola, Ya he podido, reoslverlo. Por favor dar por terminado, este tema. Muchas gracias Mariano
    • Buenas a todos, trato de transponer o pivotar el archivo que adjunto. El archivo tiene 3 columnas ( en este caso, como pueden ser más 😞 Cód.artículo, Cód.características y Valor. El objetivo es dejar como primera columna el Cód.artículo y como fila de encabezado Cód.características, y luego cruzando datos con Valor. No sé si me he explicado bien Gracias de antemano. Libro1.xlsx
    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.