hola, Fran !
- 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 ?)
- 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)
- 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