Seleccionar mediante VBA sólo las cifras de un string que tiene cifras y texto

Anónimas
2011-10-25T20:53:09+00:00

¿Cómo se puede seleccionar mediante VBA sólo las cifras de un string que tiene cifras y texto?

Por ejemplo si tengo el siguiente string:

" En el año 1997 se escribió un libro de 781 páginas que se vendía en 39 dólares"

Quiero seleccionar primero la cifra 1994, después seleccionar 781 y luego seleccionar 39.

Todo ello por código.

¿Será posible?

Saludos

Francesca

Microsoft 365 y Office | Excel | Para la casa | Windows

Pregunta bloqueada. Esta pregunta se migró desde la Comunidad de Soporte técnico de Microsoft. Puede votar si es útil, pero no puede agregar comentarios o respuestas ni seguir la pregunta.

0 comentarios No hay comentarios

43 respuestas

Ordenar por: Muy útil
  1. Anónimas
    2011-11-28T20:17:06+00:00

    Hola Héctor,

    Estuve ocupadísima, por eso no posteé antes.

    Mira, tu nuevo código aún me devuelve errores.

    Hay muchas líneas de tu código que no entiendo, así que busqué por otro lado la solución y ... la encontré.

    No me hacía mucha ilusión usar un código que no entiendo, ya que más adelante puede ser necesario que me pidan alguna modificación y no iba a poder hacerla, así que volví al último código que te envié (que por lo demás gran parte de él está hecho con tu ayuda) y me concentré hasta casi sacar humo de mi cabeza hasta que finalmente dí con la respuesta a mi pregunta clave: "No logro entender por qué si tengo una selección, el código me procesa cifras que NO ESTÁN EN LA SELECCIÓN."

    En la línea 48 cambié With Selection.Find por With Selection.Range.Find

    y en la línea 58 cambié .Execute Replace:=wdReplaceAll por .Execute Replace:=wdReplaceOne

    Con eso he logrado que los reemplazos se efectúen número por número y sólo en la selección y no en todo el documento.

    Ahora estoy tranquila y contenta, y si tengo que modificar el código más adelante creo que sabré hacerlo, ya que lo entiendo perfectamente.

    En todo caso, debes saber héctor que sin tu desinteresada ayuda no lo habría logrado.

    Muchas, pero muchas gracias por tu tiempo y por no dejarme desfallecer.

    Saludos

    Francesca

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  2. Héctor Miguel 71,595 Puntos de reputación
    2011-11-19T01:00:43+00:00

    hola, Fran !

    1. el siguiente codigo me ha servido para procesar solo en el texto seleccionado (varios parrafos o solo parte de alguno), por lo que te recalco algunos cambios "clave" mencionados en correo anterior:

        a) cambiar los wdReplaceAll <=> por wdReplaceOne (no te preocupes, el wdReplaceAll lo almacena la colecion de patrones encontrados por las expresiones regulares)

        b) cambiar los Selection.Text <=> por Selection.Range.Text (el Selection.Text podria cambiar si algun patron es "localizado" -en error- por el .Find de word ?)

    1. el metodo sigue siendo en tres partes:

        a) revisar los RUT's que deben ser de 7 u 8 digitos, un guion, y una K o un mumero (lo que no cumpla estos criterios sera "reportado" al final en un cuadro de mensaje)

            el RUT lo he separado en dos partes: antes del guion (7 a 8 digitos) y despues del guion (una K o un digito), pero falta incorporar TU funcion de verificacion del digito del RUT    b) revisar los "formatos" (comas, puntos, ...) que no se procesaran y reportarlos al final del proceso en el mismo cuadro de mensaje

        c) procesar los numeros "enteros" (cambiando el patron a las expresiones regulares y siguiendo las reglas del juego del .Find de word)

    1. por los cambios en el patron de enteros, cifras al inicio de palabra NO se procesan, tampoco "periodos" al estilo: 2010-2012

        analiza el patron => (\s|(|-)\d+(\s|.|,)(?!\d) <= y comenta si algo no es claro (?)

    por lo pronto, te recomiendo NO hacer adaptaciones a la propuesta SIN ANTES comprobar que funciona tal como te he dicho anteriormente

    saludos,

    hector.

    Sub Reemplazar_Enteros_x_Letras_en_Seleccion()

      Dim Serie As Object, Msj As String, n As Byte, x As Byte, _

             Rut As String, dv As String, preFijo As String, suFijo As String, Valor As Long

      Msj = "Los siguientes elementos NO fueron procesados:"

      With CreateObject("vbscript.regexp")

        .Global = True

        ' primero validamos los RUT's '

        .Pattern = "\d+-\w+"

        Set Serie = .Execute(Selection.Range.Text)

        x = Serie.Count

        If x Then

          For n = 0 To x - 1

            Rut = Left(Serie(n), InStr(Serie(n), "-") - 1)

            dv = Mid(Serie(n), InStr(Serie(n), "-") + 1)

            If Len(Rut) < 7 Or Len(Rut) > 8 Or Len(dv) > 1 Then ' <= AGREGA aqui la verificacion del digito del RUT '

              Msj = Msj & IIf(InStr(Msj, "RUT"), "", vbCr & vbCr & "RUT(s) INVALIDO(s) ...") & vbCr & Serie(n)

            Else

              With Selection.Range.Find

                .Text = CStr(Serie(n))

                .MatchWholeWord = True

                .Replacement.Text = CStr(NumLetras(Val(Rut), 2)) & " guión " & _

                  IIf(dv = "K", "K", CStr(NumLetras(Val(dv), 2)))

                .Execute MatchWholeWord:=True, Replace:=wdReplaceOne

              End With

            End If

          Next

        End If

        ' despues EVITAMOS formatos (puntos o comas) '

        .Pattern = "\d{1,3}([,.]\d{3})*[,.]\d+"

        Set Serie = .Execute(Selection.Range.Text)

        x = Serie.Count

        If x Then

          For n = 0 To x - 1

            Msj = Msj & IIf(InStr(Msj, "Formato"), "", vbCr & vbCr & "Formato(s) INVALIDO(s) ...") & vbCr & Serie(n)

          Next

        End If

        ' ahora procesamos solo numeros enteros '

        .Pattern = "(\s|(|-)\d+(\s|.|,)(?!\d)"

        Set Serie = .Execute(Selection.Range.Text)

        x = Serie.Count

        If x Then

          For n = 0 To x - 1

            preFijo = ""

            If Left(Serie(n), 1) = "(" Then preFijo = "("

            If Left(Serie(n), 1) = "-" Then preFijo = "-"

            If preFijo = "" Then preFijo = " "

            suFijo = ""

            If InStr(Serie(n), ",") Then suFijo = Mid(Serie(n), InStr(Serie(n), ","))

            If InStr(Serie(n), ".") Then suFijo = Mid(Serie(n), InStr(Serie(n), "."))

            If suFijo = "" Then suFijo = " "

            Valor = Trim(Replace(Replace(Serie(n), preFijo, ""), suFijo, ""))

            With Selection.Range.Find

              .MatchWholeWord = True

              .Text = CStr(Serie(n))

              .Replacement.Text = preFijo & CStr(NumLetras(Valor, 2)) & suFijo

              .Execute MatchWholeWord:=True, Replace:=wdReplaceOne

            End With

          Next

        End If

      End With

      Set Serie = Nothing

      If InStr(Msj, vbCr) Then MsgBox Msj & vbCr & vbCr & _

        "Modifica estos elementos y (si procede) ejecuta de nuevo", , "AVISO IMPORTANTE !!!"

    End Sub

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  3. Anónimas
    2011-11-18T02:03:11+00:00

    hola hector,

    Gracias por tu "frenazo" a mi locura.

    Bueno, seguimos intentandolo.

    Pero si al buscar 28 me encuentra y procesa 28.656 como veintiocho.656 no me sirve porque me queda todo mal. Y no me sirve que se procesen cifras que no están en la selección, porque entonces para qué seleccionar si el código va a actuar en todo el documento o en parte de él que no está seleccionada.

    ¿No se puede buscar y reemplazar cada cifra una por una y no que busque y reemplace todas las que son iguales al final del código? O sea que si encuentra "28 de mayo" reemplace el 28 por veintiocho y siga buscando y si despues encuentra "28 dólares" que cambie el 28 por veintiocho, y no como ahora que cuando encuentra el "28 de mayo" reemplaza ese 28 y también el 28 de "28 dólares" que está más adelante y que podría no estar en la selección.

    ¿Se entiende?

    Yo siempre tan complicada para decir las cosas.

    Saludos

    Fran

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  4. Héctor Miguel 71,595 Puntos de reputación
    2011-11-18T01:28:50+00:00

    Esto me tiene loca. Todavía tengo problemas.

    Con tu código y con el mío adaptando parte del último que me enviaste (uno de los .Pattern).

    Creo que voy a renunciar y que lo haga otro. Estoy colapsada.

    No logro entender por qué si tengo una selección, el código me procesa cifras que NO ESTÁN EN LA SELECCIÓN.

    No lo entiendo...

    hola, Fran !

    tranquila !!!... sabia que encontrarias algunos quebrantos de cabeza, pero tambien se que estas "escudriñando" cada parte de codigo que utilizas, y yo tambien encontre algunas "respuestas" a comportamientos diferentes en aplicaciones diferentes, es decir, excel "tiene su forma", word la suya y asi cada aplicacion "sabe" que y como reconocer en que partes ejecuta sus acciones (p.e.)

    cuando "buscas" el numero 28 (una sola vez), word podria encontrarlo en la expresion "28 de mayo"... o en la expresion "28,656"... o en cualquiera "parecida" que se encuentre PRIMERO, considerando que (word) reconoce y SEPARA las palabras por espacio o signos de puntuacion (coma, punto, guion, parentesis, etc. etc. etc.), por lo que no encontraba la causa de algunos "por que's" (???)

    de hecho, para "trabajar" solo con numeros "enteros" (ahora que entendemos el metodo .Find de word), es mejor "anticipar" a cualquier forma "prevenible" en que word VA A ENCONTRAR cada secuencia de numeros "enteros" (casi enteros o "como enteros") atendiendo a la puntuacion previa y posterior en los patrones de busqueda ;)

    le seguimos ?... (o "ahi la dejamos" ?)

    saludos,

    hector.

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  5. Anónimas
    2011-11-18T00:09:00+00:00

    Hola héctor,

    Esto me tiene loca.

    Todavía tengo problemas.

    Con tu código y con el mío adaptando parte del último que me enviaste (uno de los .Pattern).

    Creo que voy a renunciar y que lo haga otro.

    Estoy colapsada.

    No logro entender por qué si tengo una selección, el código me procesa cifras que NO ESTÁN EN LA SELECCIÓN.

    No lo entiendo.

    Saludos

    Fran

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios