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
  • 96 ¿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

    • Hi Trate de ver que hacían las fórmulas en cuestión pero a su libro le falta o le faltan hojas, por lo que solo podría participar con un par de ideas en general. Lo que entiendo es que según el valor de B3 en C3 debe poner una fórmula u otra, así que es posible que si combina DIRECCION() con INDIRECTO() pueda intercambiar de una fórmula a otra. =SI(B3="Xl",INDIRECTO(DIRECCION(3,5)),SI(O(B3=1,B3=2,B3=3),INDIRECTO(DIRECCION(4,5)),"")) Otra forma sería poner nombre a esas fórmulas en el cuadro de nombres para que las pueda mandar llamar a una o a la otra según el resultado de B3. Por favor tome en cuenta, es solo una idea.
    • Buenas tardes! Tengo el siguiente código: Private Sub btnCargaBancos_Click() Dim TasaCompra, TasaVenta As Double Dim InvBanesco, InvVzla, MontoBanesco, MontoVzla As Double Dim TasaDiaBan, TasaDiaVzla, TasaActual As Double 'Inversion = Val(txtInversion.Text) InvBanesco = Val(CDbl(txtInverBanesco.Text)) InvVzla = Val(CDbl(txtInverVzla.Text)) TasaCompra = Val(CDbl(txtTasaCompra.Text)) TasaVenta = Val(CDbl(txtTasaVenta.Text)) MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055)      TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then     TasaActual = TasaDiaBan Else     TasaActual = TasaDiaVzla End If MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco.Value = MontoBanesco txtBcoVenezuela.Value = MontoVzla txtTasaDiaria.Value = TasaActual End Sub   Como se puede apreciar InvBanesco ,  InvVzla , TasaCompra y TasaVenta, son valores que introduce el usuario a través de los respectivos cuadros de texto. Tengo los siguientes problemas: a. Las fórmulas no se ejecutan correctamente (pareciese que no reconociese los números entrados vía cuadros de texto). b. Al darle valor cero (0) a cualquiera de los valores de InvBanesco o  InvVzla, me genera un error en TasaDiaBan o TasaDiaVzla (según sea el caso), aunque, como se puede apreciar, debería generar un valor cero (0). Como dije en mi presentación estoy empezando en esto de la codificación...y quiero aprender de Uds! Agradezco su ayuda! Nota: lamentablemente el fichero es mas grande de lo permitido y no pude anexarlo.  
    • Hola buenas tardes. En una hoja plantilla donde realizo diferentes consultas de datos. tengo ya establecido dos formulas diferentes con función SI y buscar. estos buscan diferentes rangos de datos y recibendiferentes resultados. Cada formula varia según una palabra o numero  ejemplo si pongo Xl pone la formula 1 y si pongo cualquier numero entre 1 y 3 pone la segunda formula. Lo que necesito hacer es que si en una celda de la columna B3 pongo XL debería de considerar la formula 1 y si pusiera el numero 1 me pondría la segunda formula, dentro de la misma formula. Ya agregue la función SI($C3="Xl",Formula1.. Pero no me funciona, espero me puedan ayudar.   Muchas gracias Mariano   Formula doble si en celda existe.xlsx
    • Sub control2558() Application.ScreenUpdating = False Dim I As Integer I = 4 While Sheets("FT-ADF-2558").Cells(I, 102) <> "" Sheets("FT-ADF-2558").Cells(6, 82) = Sheets("FT-ADF-2558").Cells(I, 102) Dim NombreArchivo, RutaArchivo As String NombreArchivo = "Hoja Control " & Sheets("FT-ADF-2558").Cells(I, 102) RutaArchivo = ActiveWorkbook.Path & "\" & NombreArchivo & ".xlsm" Dim NuevoLibro As Workbook Set NuevoLibro = Workbooks.Add Sheets("FT-ADF-2558").Copy Before:=NuevoLibro.Sheets(1) NuevoLibro.SaveAs Filename:=RutaArchivo NuevoLibro.Close I = I + 1 Wend MsgBox ("Proceso generado con éxito") Application.ScreenUpdating = True End Sub  
    • Ese error es porque no existe la hoja 10 con ese nombre, entonces cámbialo por FT-ADF-2558
  • 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.