Saltar al contenido

Recommended Posts

publicado

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

publicado

Hola:

Hay un refrán español que dice:

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

Un abrazo amigo Gerson

publicado

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

publicado

La de Gerson sin corchetes:

=--EXTRAE(A2;
COINCIDIR(1;INDICE(--ESNUMERO(--EXTRAE(A2;FILA(INDIRECTO(1&":"&LARGO(A2)));1));;);
CONTAR(INDICE(--EXTRAE(A2;FILA(INDIRECTO(1&":"&LARGO(A2)));1);))[/CODE]

publicado

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.

publicado

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

publicado
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

publicado

Gracias sailepaty, considero muy importante tu anotación. Y por supuesto amigo sailepaty que tu formula tiene ese "toque" de gente grande y conocedora del Excel.

Saludos.

publicado
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.

publicado

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

publicado

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.

publicado
Hola sailepaty fíjate que la función es SoloNumeros y su resultado OnlyNumbers

Gracias por la aclaración Pedro, ya quedo modificado.

Me gusta la opción que le añadiste a la función.

Saludos

publicado

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

publicado

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.

publicado

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

Conéctate para comentar

Podrás dejar un comentario después de conectarte



Conéctate ahora
  • 109 ¿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
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • 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.