請教各位大俠專家!
用正則運算式替換段尾空格時,如果文欄位落之后緊跟著表格,則被替換的文字所在段落會跑到表格中去,除此之外其他情況卻是正常的。百思不得其解,煩請各位老師指點。
Sub 洗掉段尾空格()
Dim i As Paragraph, mt, oRang As Range, n%, m%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True: .IgnoreCase = False: .MultiLine = True
.Pattern = "\s+(\r)" '洗掉段落尾部的空格,如果沒有\r,將會將回車符一并作為空格處理了。
For Each i In ActiveDocument.Paragraphs '在遍歷各個段落
For Each mt In .Execute(i.Range.Text) '遍歷所匹配的各個文本
m = mt.FirstIndex: n = mt.Length - 1 '查找的起始位置(從0開始計數)、長度
Set oRang = ActiveDocument.Range(i.Range.Start + m, i.Range.Start + m + n) '定位查找到的文本在整個文章中的起始位置、終止位置
i.Range.Text = .Replace(i.Range.Text, "$1")
Next
Next
End With
End Sub
運行之前的檔案

運行之后的檔案

uj5u.com熱心網友回復:
Sub 洗掉段尾空格()
Dim i As Paragraph, mt, oRang As Range, n%, m%, mRange As Range
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True: .IgnoreCase = False: .MultiLine = True
.Pattern = "\s+$" '洗掉 段落尾部的空格,如果沒有\r,將會將回車符一并作為空格處理了。
For Each i In ActiveDocument.Paragraphs '在遍歷各個段落
Set mRange = ActiveDocument.Range(i.Range.Start, i.Range.End - 1)
For Each mt In .Execute(mRange.Text) '遍歷所匹配的各個文本
m = mt.FirstIndex: n = mt.Length '查找的起始位置(從0開始計數)、長度
Set oRang = ActiveDocument.Range(mRange.Start + m, mRange.Start + m + n) '定位查找到的文本在整個文章中的起始位置、終止位置
oRang.Text = .Replace(oRang.Text, "")
Next
Next
End With
End Sub
uj5u.com熱心網友回復:
我這里可以重現你說的奇怪現象.不使用正則運算式,而是直接將原來的Text賦值給Text的話,也同樣會有這個問題.
我試了很久,只找到一個能基本代替正則運算式替換的方法,你可以試試:
Sub 洗掉段尾空格()
Dim objFind As Find
Set objFind = ActiveDocument.Content.Find
objFind.Execute FindText:="^w^13", ReplaceWith:="^13", Replace:=wdReplaceAll
End Sub
這段代碼執行后同樣有問題,就是表格上邊的一行不能去掉空格,表格內部不能去掉空格.
其他的地方大概沒有問題.
uj5u.com熱心網友回復:
但是,為什么在WORD界面“查找替換”空格卻不會出現這種奇怪的現象。我是菜鳥,在此提出此問題,主要是想大神們幫助解決這個問題。用VBA的正則表達式,怎樣才能避免這種奇怪的現象發生
uj5u.com熱心網友回復:
我的WORD界面"查找替換"^w^13"同樣會有這個問題啊.
"^w"相當于正則運算式里的"\s+";
"^13"就相當于正則運算式里的"\r";
你直接搜索/替換空格或者"^w"確實是沒問題的,但加上結束標志"^13"就不行了,僅有部分被搜索/替換.
所以這個應該是Word這個軟體設計的問題.
uj5u.com熱心網友回復:
請問大神,能否在上面提問代碼的基礎上,通過判斷下一段落是否為表格,以決定本段尾的空格是否洗掉?如果這個思路可行,煩請大神幫助完善一下代碼。
衷心感謝!!
uj5u.com熱心網友回復:
i.Range.Tables.Count等于0的話應該就不在表格中.
uj5u.com熱心網友回復:
mypara.Range.Information(wdWithInTable)uj5u.com熱心網友回復:
可以用Select避開段落和表格之間的換行符
Sub 洗掉段尾空格()
Dim i As Paragraph, mt, oRang As Range, n%, m%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True: .IgnoreCase = False: .MultiLine = True
.Pattern = "\s+(\r)" '洗掉段落尾部的空格,如果沒有\r,將會將回車符一并作為空格處理了。
For Each i In ActiveDocument.Paragraphs '在遍歷各個段落
For Each mt In .Execute(i.Range.Text) '遍歷所匹配的各個文本
m = mt.FirstIndex: n = mt.Length - 1 '查找的起始位置(從0開始計數)、長度
Set oRang = ActiveDocument.Range(i.Range.Start + m, i.Range.Start + m + n) '定位查找到的文本在整個文章中的起始位置、終止位置
i.Range.Select
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.Range.Text=Left(.Replace(i.Range.Text, "$1"),Len(.Replace(i.Range.Text, "$1"))-1)
'避免洗掉段尾換行符
Next
Next
End With
End Sub
uj5u.com熱心網友回復:
也可以用下面代碼避開段落和表格之間的換行符
Sub 洗掉段尾空格()
Dim i As Paragraph, mt, oRang As Range, n%, m%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True: .IgnoreCase = False: .MultiLine = True
.Pattern = "\s+(\r)" '洗掉段落尾部的空格,如果沒有\r,將會將回車符一并作為空格處理了。
For Each i In ActiveDocument.Paragraphs '在遍歷各個段落
For Each mt In .Execute(i.Range.Text) '遍歷所匹配的各個文本
m = mt.FirstIndex: n = mt.Length - 1 '查找的起始位置(從0開始計數)、長度
Set oRang = ActiveDocument.Range(i.Range.Start + m, i.Range.Start + m + n) '定位查找到的文本在整個文章中的起始位置、終止位置
Set myRange = i.Range
myRange.End = myRange.End - 1
myRange.Text = Left(formativetext, Len(formativetext) - 1)
'避免洗掉段尾換行符
Next
Next
End With
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/26913.html
標籤:VBA
