Word VBA 行长约束
Posted
技术标签:
【中文标题】Word VBA 行长约束【英文标题】:Word VBA line length constraint 【发布时间】:2013-09-20 17:59:46 【问题描述】:目标: 在 Word 中使用 VBA,我希望能够将文本键入或粘贴到 Word 文档中,然后确保每行单词以一定数量的字符换行(通常为 50,尽管这可能会改变)。我宁愿不使用文档顶部的标尺手动调整,尤其是当字体不是等宽时!
尝试失败: 我尝试使用以下内容,导致错误“值超出范围”:
Public Sub setWordsPerLine()
ActiveDocument.PageSetup.CharsLine = 50
End Sub
我还尝试在段落中每 50 个字符插入一个返回字符。但是,这会导致类型不匹配错误:
For Each pg In ActiveDocument.Paragraphs
b = pg.Range.Characters.Count
c = 50
If b > c Then
For atch = c To pg.Range.Characters.Count Step c
ActiveDocument.Range(pg.Range.Characters(atch)).InsertBefore (Chr(13))
Next
End If
Next
需要帮助:
我应该使用其他方法、属性或函数来执行此操作吗? Paragraphs.RightIndent = x
是基于点,而不是字符。
【问题讨论】:
还需要帮助吗?如果第 50 个字符在任何单词的中间怎么办——这个单词应该被拆分还是应该在这个单词之后开始新行? @KazJaw 是的,还在寻求这方面的帮助,谢谢!如果在单词中间,则应在该单词之前开始新行。单词不应拆分,但总行长也不应超过 50 个字符。 【参考方案1】:我已经改进了您的第二个解决方案,现在工作正常。 (我用简单的lorem ipsum
文档做了一些测试)。
Sub qTest_line()
Dim PG As Paragraph
Dim B, C, ATCH, S
For Each PG In ActiveDocument.Paragraphs
B = PG.Range.Characters.Count
S = PG.Range.Start
C = 50
If B > C Then
For ATCH = (S + C) To (S + B) Step C
'check the position
If Len(Trim(ActiveDocument.Range(ATCH - 1, ATCH + 1).Text)) < 2 Then
'just insert new line mark
ActiveDocument.Range(ATCH, ATCH).InsertAfter Chr(11)
Else
'move to the beginnng of word
ActiveDocument.Range(ATCH, ATCH).Select
Selection.MoveLeft wdWord
Selection.InsertBefore Chr(11)
ATCH = Selection.Start
End If
Next
End If
Next
End Sub
【讨论】:
效果很好 - 看起来我只是没有很好地掌握插入方法。非常感谢您的帮助!【参考方案2】:KazJaw 的 other answer here 运行良好,但我进行了修改以包含一些改进,并希望发布修改以防其他人遇到此问题。
改进包括:
-
更好地记录每个步骤。
使用更好的ASCII control character 以便更好地识别段落。
使用更优雅的方法来判断单词是否在中间,通过替换
If Len(Trim(ActiveDocument.Range(char_index - 1, char_index + 1).Text)) < 2 Then
与
If ActiveDocument.Range(char_index).Text = " " Or _
ActiveDocument.Range(char_index).Text = "-" Then
现在可以跨行正确拆分带连字符的单词。例如,“servo-valve”现在可以在一行中使用“servo-”,在下一行的开头使用“valve”。
这是修改后的代码,再次感谢 KazJaw 的原始解决方案。
Public Sub wrap_words()
'adapted from ***
'https://***.com/a/19109049/2658159
Dim para_index As Paragraph
Dim para_index_numchars, char_index, para_index_start As Long
'set the max line length constraint
Const line_max As Byte = 50
'loop through each paragraph
For Each para_index In ActiveDocument.Paragraphs
'find number of characters
para_index_numchars = para_index.Range.Characters.Count
'find the paragraph starting point
para_index_start = para_index.Range.Start
'if the paragraph has more than the predetermined amount of characters,
If para_index_numchars > line_max Then
'loop through each character starting with line_max position
'and stepping by line_max position, to the end of the paragraph
For char_index = (para_index_start + line_max) To _
(para_index_start + para_index_numchars) Step line_max
'if there is not a word in this position...
If ActiveDocument.Range(char_index).Text = " " Or _
ActiveDocument.Range(char_index).Text = "-" Then
'...just insert new line mark
ActiveDocument.Range(char_index, char_index).InsertAfter Chr(13)
Else
'... if there is a word, or a hyphenated word that
'can be split, move to the beginnng of word or the
'end of the hyphenated section.
ActiveDocument.Range(char_index, char_index).Select
Selection.MoveLeft unit:=wdWord, Count:=1
'insert newline at the beginning
Selection.InsertBefore Chr(13)
'since a new paragraph created before the word,
'the previous paragraph structure has changed.
'change char_index to reflect that change.
char_index = Selection.Start
End If
Next
End If
Next
End Sub
【讨论】:
以上是关于Word VBA 行长约束的主要内容,如果未能解决你的问题,请参考以下文章