Jump to content
  • 34 ¿Te resultaría interesante una carpeta sobre Python para Excelen el foro?

    1. 1. ¿Te resultaría interesante una carpeta sobre Python para Excel en el foro?


      • Sí! Me interesa
      • No me interesa.
      • Otros (Escribe tu respuesta en el tema)

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • Crear macros Excel

  • Posts

    • Buenos días, muchas gracias por tu respuesta pero me da un error al crearla que dice lo siguiente: ERROR - Se ha detectado una dependencia circular. Para resolver mediante cálculos iterativos, ve a Archivo> Configuración de la hoja de cálculo.
    • Hola Antoni, la macro es perfecta pero las imágenes las vincula yo lo que busco es que las deje incrustadas es decir que aunque se elimine la carpeta imágenes la imagen permanezca en el libro. Gracias saludos.
    • Mira, no se acaba de entender lo que quieres, sube tu archivo y pon un ejemplo de lo que tienes y de lo que quieres.
    • Ponte en contacto con el administrador del foro: Sugerencias - Reclamaciones Mientras aclaras el tema, coloca este código en un módulo o en la hoja y ejecuta la macro RecorrerImágenes: Sub RecorrerImágenes() Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(ThisWorkbook.Path & "\imagenes") '<----- Carpeta de imágenes For Each oFile In oFolder.Files: InsertarImagen oFile.Name: Next Range("A1").Select End Sub Private Sub InsertarImagen(Imagen As String): On Error Resume Next Application.ScreenUpdating = False For x = 1 To Range("A" & Rows.Count).End(xlUp).Row If Trim(Range("A" & x)) = "" Then Range("A" & x).Select ActiveCell = Imagen ActiveSheet.Shapes(Imagen).Delete ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\imagenes\" & Imagen).Select With Selection.ShapeRange .Name = Imagen .LockAspectRatio = False .Height = ActiveCell.Height .Width = ActiveCell.Width End With Exit Sub End If Next End Sub  
    • Hola Antoni, no me deja descargar el archivo porque no tengo nivel suficiente en el foro. Gracias.  
  • Recently Browsing

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Privacy Policy