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 行长约束的主要内容,如果未能解决你的问题,请参考以下文章

这个 SQL 表创建的约束有啥问题?

存储引擎数据类型约束条件

oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决

数据库的存储引擎,数据类型,约束条件

word vba宏语言循环

vba如何写word