【问题标题】:How stop macro on the end document?如何在结束文件上停止宏?
【发布时间】:2022-11-01 16:23:06
【问题描述】:

我只是在学习,还不太了解。 我写了错误的代码

Sub sierotkiTXT_select()

    Do
 
        Selection.EndKey Unit:=wdLine
        Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend:=wdExtend

        If Selection.Text Like "* [aAwWzZiIoOuUVQ] *" Or Selection.Text Like "*[A-Z]. *" Or Selection.Text Like "* [a-z]. *" Or Selection.Text Like "*z. *" Or Selection.Text Like "*:] *" Then

            Result = MsgBox("OK?", vbYesNoCancel + vbQuestion)

            If Result = vbYes Then

                Selection.MoveRight Unit:=wdCharacter, Count:=1
                Selection.MoveLeft Unit:=wdCharacter, Count:=1
                Selection.Delete
                Selection.InsertAfter Text:=ChrW(160)
                
            End If
            
            If Result = vbCancel Then
            
                Exit Sub
 
            End If
            
        End If
    
        Selection.MoveRight Unit:=wdCharacter, Count:=3
      
    Loop Until Selection.Text = ActiveDocument.Range.Characters.Last

End Sub

并且不知道如何在文档末尾停止这样的宏(打破循环)而不使用

Loop Until Selection.Text = ActiveDocument.Range.Characters.Last

这不是问题,但宏有时会停在段落结尾字符处,将它们解释为文档的结尾。 [编辑] Ok-ActiveDocument.Range.Characters.Last 仍然返回空 - 这就是它停止的原因。我不应该使用这个。

示例(正文): before

运行宏后: after

示例(尾注): before after

【问题讨论】:

  • 试图用你的代码实现什么。
  • 我正在尝试在每行末尾的某些字符中添加不间断空格。我不想在整个文本中这样做,因为它破坏了文本的正当性。所以使用宏我移动了一些字符,但只在行尾。
  • 就像在您的上一篇文章中一样:使用 .Find-Object 等内置工具或其他工具。如果您使用 Selection 和 Loop/For,您必须自己检查,何时停止。在这种情况下,您必须定义一个最大值(就像所有可能检查的字符一样)并设置一个为每个循环实例增加的计数器。
  • 这就是您的解决方案,添加不间断空格。您想通过添加不间断空格来做什么。
  • 通过将元音(和其他符号)移动到下一行来改善文档的外观。在 2 个地方——正文和尾注。

标签: vba loops ms-word exit


【解决方案1】:

你甚至不需要宏!你只需要两个通配符查找/替换操作,其中之一:

Find = (<[A-Za-z])^32
Replace = ^s

和一个:

Find = (<[a-z].)^32
Replace = ^s

另请参阅:https://www.msofficeforums.com/word-vba/48717-how-i-find-character-line.html

【讨论】:

  • 不,不,再次:我正在尝试在每行末尾的某些字符中添加不间断空格。我不想在整个文本中这样做,因为它破坏了文本的正当性。所以使用宏我移动了一些字符,但只在行尾。
  • 鉴于不间断空格与所有现代版本的 Word 中的普通空格具有相同的可变宽度特征,您的“它破坏了文本的正当性”的反对意见是没有根据的。
  • 我通读了这个帖子,终于找到了答案:“如果您在 Word 2016 中遇到固定宽度的不间断空格,则很可能是您正在处理旧文档(在兼容模式下)。”在我的情况下确实如此,因为我正在处理用 WORD 2007 编写的旧文档(未安装补丁 - 这也导致了其他问题,例如在 WORD 2019 中打开后将单词粘在一起)。
【解决方案2】:

我更正了我的代码并且它有效。

Sub sierotkiTXT_select()

'szukaj sierotek

    Dim NumLines As Long
        Application.ScreenUpdating = True
       Selection.EndKey Unit:=wdStory, Extend:=wdExtend  
NumLines = Selection.Range.ComputeStatistics(wdStatisticLines)
  MsgBox "Lines to check " & (NumLines)
  Selection.Collapse
For i = 1 To NumLines
    Selection.EndKey Unit:=wdLine
    Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend:=wdExtend
   If Selection.Text Like "* [aAwWzZiIoOuUVQ] *" Or Selection.Text Like "*[A-Z]. *" Or Selection.Text Like "* [a-z]. *" Or Selection.Text Like "*z. *" Or Selection.Text Like "*:] *" Then
      Result = MsgBox("Akceptujesz?", vbYesNoCancel + vbQuestion)
 If Result = vbYes Then
      Selection.MoveRight Unit:=wdCharacter, Count:=1
      Selection.MoveLeft Unit:=wdCharacter, Count:=1
      Selection.Delete
      Selection.InsertAfter Text:=ChrW(160)
 End If
          If Result = vbCancel Then
    Exit Sub
 End If
    End If
   Selection.MoveRight Unit:=wdCharacter, Count:=3
Next

End Sub

【讨论】:

  • 使用选择是一种糟糕的、低效的做事方式。我包含一个链接,显示如何在没有它的情况下处理文档。此外,您的代码不会处理整个文档 - 例如,如果在文档正文中运行,它将不会处理脚注或尾注。
  • 你是对的,选择方法很慢,但是这样你可以看到检查了哪些字符,脚本是否有效,宏在哪些字符上崩溃。是的,宏不适用于整个文档——这不是问题,您始终可以手动单击脚注并运行。此外,对于脚注,我有一个稍微修改的宏来寻找其他字符。当然它可以在 1 个脚本中完成,但我只是在学习。
【解决方案3】:

就我而言,我发现我可以使用 Search/Replace 函数而不是宏 BUT 而不是在 a、i、o、u、w、z 之后插入每个硬空格(在我的情况下,这会使对齐的文本看起来很糟糕并且不必要地移动所有文本),我可以使用: 搜索:

空间一个空间

用。。。来代替:

空间一个零宽度连接器空间

其中 ZERO WIDTH JOINER 是 Unicode 字符 U+200D。 如何在 Microsoft Windows 中键入:Alt +(在 NumPad 键盘上)08205

ZERO WIDTH JOINER 在 WORD 中看起来像这样(启用“显示隐藏字符”选项): ZERO WIDTH JOINER image

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多