我想在Word中对所选内容的文本中嵌入的数字进行四舍五入。与网上四舍五入的许多解决方案不同,这些值不是孤立在表格单元格等中,而是可能在文本中,并且在它们周围有额外的字符。
例如:0.0044***,(0.0040-0.0047)+/-0.0012。
我改编了this post中的以下代码,该代码旨在舍入为整数:
Sub RoundNumbers()
Dim OrigRng As Range
Dim WorkRng As Range
Dim FindPattern As String
Dim FoundVal As String
Dim decplace as Integer
Set OrigRng = Selection.Range
Set WorkRng = Selection.Range
FindPattern = "([0-9]){1,}.[0-9]{1,}"
decplace = 3
Do
With WorkRng
.SetRange OrigRng.Start, OrigRng.End ' using "set WorkRng = OrigRng" would cause them to point to the same object (OrigRng is also changed when WorkRng is changed)
If .Find.Execute(findtext:=FindPattern, Forward:=True, _
MatchWildcards:=True) Then
.Expand wdWord ' I couldn't find a reliable way for greedy matching with Word regex, so I expand found range to word
.Text = FormatNumber(Round(CDbl(.Text) + 0.000001, decplace), decplace, vbTrue)
End If
End With
Loop While WorkRng.Find.Found
End Sub
我想我可以扩展Round函数以舍入到指定的小数位数,例如.Text = round(CDbl(.Text) + 0.000001, 3)
。
这样做的问题是,宏继续查找选择中的第一个值,而不移动到后续数字。这可能是因为,与整数不同,舍入后的值仍然与正则表达式匹配。
建议的解决方案是将一个或多个{1,}的小数点后位数替换为固定值,例如{4}。如果要舍入的所有值具有相同的格式,但没有我所需的灵活性,则此方法有效。
那么我如何让它移动到下一个值呢?或者,有没有人有更好的解决方案?
3条答案
按热度按时间jv4diomz1#
例如,要处理整个文档:
或者仅处理所选范围:
xu3bshqb2#
我认为你的问题是你没有改变范围来反映要搜索的文本。你似乎每次都重置到范围的开始。
下面的代码可能会有所帮助
izkcnapc3#
你的代码中最根本的问题是你把循环放在了错误的位置,并且你在每个循环中都把
WordRng
设置回了开头。在没有任何示例文本的情况下,我用你的问题中的文本来测试。下面的代码应该可以工作: