vba - 遍历 MS Word 中的段落和修剪空格
问题描述
我需要创建一个宏来删除活动 MS Word 文档中所有段落之前的空格和缩进。我试过以下:
For Each p In ActiveDocument.Paragraphs
p.Range.Text = Trim(p.range.Text)
Next p
它将宏设置为永恒循环。如果我尝试将字符串文字分配给段落,vba 总是只创建 1 个段落:
For Each p In ActiveDocument.Paragraphs
p.Range.Text = "test"
Next p
我想我对段落对象有一个普遍的误解。我将不胜感激有关该主题的任何启示。
解决方案
问题中的代码循环的原因是用已处理(修剪)的文本替换一个段落正在更改段落集合。所以代码会在某个时候不断地处理同一个段落。
这是在“幕后”被删除和重新创建的对象的正常行为。解决它的方法是将集合从末端循环到前面:
For i = ActiveDocument.Paragraphs.Count To 1 Step -1
Set p = ActiveDocument.Paragraphs(i)
p.Range.Text = Trim(p.Range.Text)
Next
也就是说,如果文档中的段落包含任何格式,这将丢失。字符串处理不保留格式。
另一种方法是检查每个段落的第一个字符是否有您认为是“空白”的字符类型。如果存在,则扩大范围,直到不再检测到这些字符,然后删除。这将使格式保持不变。(因为这不会改变整个段落,所以“正常”循环有效。)
Sub TestTrimParas()
Dim p As Word.Paragraph
Dim i As Long
Dim rng As Word.Range
For Each p In ActiveDocument.Paragraphs
Set rng = p.Range.Characters.First
'Test for a space or TAB character
If rng.Text = " " Or rng.Text = Chr(9) Then
i = rng.MoveEndWhile(" " + Chr(9))
Debug.Print i
rng.Delete
End If
Next p
End Sub
推荐阅读
- javascript - 单击后,jquery 将按钮的此实例作为目标
- webpack - app.UseStaticFiles() 不工作。Index.cshtml 加载多次
- eclipse-plugin - Launchpad.exe 在 Websphere V7 上不起作用
- python - 有没有办法将 np.where() 与列列表一起使用?
- javascript - 如果我们使用 vue-cli 用 webpack-simple 初始化一个 vue 项目,我们在编码时使用 ES5 还是 ES6?
- sql - 从管道分隔的文本文件中提取列并使用 powershell 输出
- r - 值列表的渐变颜色插值
- css - 仅使用伪元素创建 CSS 徽章
- oauth-2.0 - 哪些 Google OAuth2 范围被视为“敏感”的列表在哪里?
- chronicle - Chronicle Queue Proxy Method Value is Same Object Instance Each Time