Vba 仅在项目符号列表中查找缺少的句点

Vba 仅在项目符号列表中查找缺少的句点,vba,ms-word,Vba,Ms Word,我正在寻找一个宏,它将搜索Word文档,只查找项目符号列表,然后查找任何不以句点(^$^p)结尾的行 我在网上找到了搜索项目符号列表的宏(例如),但它一次只搜索一个项目符号,我无法获取我的 With Selection.Find .Text = "^$^p" 以适应此处提供的代码示例 有什么想法吗? 10倍 这是一个有趣的问题,我通常都会以视觉方式解决这个问题(这没关系,因为它迫使我回顾我所有的工作)。但这里有一个宏可以做到这一点: 编辑以在表中包含项目符号,并使用范围参数调用。还添加了一些代

我正在寻找一个宏,它将搜索Word文档,只查找项目符号列表,然后查找任何不以句点(^$^p)结尾的行

我在网上找到了搜索项目符号列表的宏(例如),但它一次只搜索一个项目符号,我无法获取我的

With Selection.Find
.Text = "^$^p"
以适应此处提供的代码示例

有什么想法吗?
10倍

这是一个有趣的问题,我通常都会以视觉方式解决这个问题(这没关系,因为它迫使我回顾我所有的工作)。但这里有一个宏可以做到这一点:

编辑以在表中包含项目符号,并使用范围参数调用。还添加了一些代码来显示如何处理文本框中的项目符号


这是一个有趣的问题,一个我通常最终都希望以视觉方式解决的问题(这没关系,因为它迫使我回顾我所有的工作)。但这里有一个宏可以做到这一点:

编辑以在表中包含项目符号,并使用范围参数调用。还添加了一些代码来显示如何处理文本框中的项目符号


你说它一次只寻找一颗子弹是什么意思?您仍然可以执行循环并应用所需的操作,不是吗?您也可以编写宏(我有一个)来逐个查找以普通字符
(^$^p)
结尾的项目符号项。在()中运行宏时,它只查找第一个项目符号实例。要查找下一个宏,需要再次运行宏,依此类推。我试了一会儿。。。“循环”,但它不起作用。我需要的是一个宏,该宏将查找第一个项目符号实例,检查它是否缺少句点“^$^p”,然后对其进行注释“Selection.Comments.Add Range:=Selection.Range Selection.TypeText:=”如果这是一个完整的句子,它必须以句点结尾。”我很想看看你的宏:)只要在谷歌上搜索一下以下术语,你就会发现很多代码示例:Word FindLoop@CindyMeister-我知道如何编写循环和查找单词的宏;我的问题是,我不知道如何让它只在某些情况下寻找词语。如果所有带项目符号的列表都是(正确的)BullList样式,那么就很容易了——但是我审阅的文档的编写人员似乎不喜欢使用正确的样式(或者任何样式):)你说的一次只查找一个项目符号是什么意思?您仍然可以执行循环并应用所需的操作,不是吗?您也可以编写宏(我有一个)来逐个查找以普通字符
(^$^p)
结尾的项目符号项。在()中运行宏时,它只查找第一个项目符号实例。要查找下一个宏,需要再次运行宏,依此类推。我试了一会儿。。。“循环”,但它不起作用。我需要的是一个宏,该宏将查找第一个项目符号实例,检查它是否缺少句点“^$^p”,然后对其进行注释“Selection.Comments.Add Range:=Selection.Range Selection.TypeText:=”如果这是一个完整的句子,它必须以句点结尾。”我很想看看你的宏:)只要在谷歌上搜索一下以下术语,你就会发现很多代码示例:Word FindLoop@CindyMeister-我知道如何编写循环和查找单词的宏;我的问题是,我不知道如何让它只在某些情况下寻找词语。如果所有带项目符号的列表都是(正确的)BullList样式,那么就很容易了——但是我审阅的文档的作者似乎不喜欢使用正确的样式(或者任何样式):)谢谢——这很有魅力!我没有想到选择。。。案例条款。唯一的问题是它在表格中找不到子弹——我该如何添加它呢?嗯。我刚刚注意到另一件事。仅当它是独立宏时才起作用。当我在另一个宏中包含对它的调用时,什么也不会发生。@Yoel:在第二个问题中(从另一个宏调用)尝试使用ActiveDocument代替ThisDocument。此文档将始终引用保存宏的文档。或者更好:将noteMissingPeriods列表更改为接受一个参数—一个Word.Document对象—这样您就可以传递正在处理的文档,而不必担心用户在代码执行过程中是否更改文档。我正在编辑Peter的答案,并对表进行更正,因为他做了真正的工作—他应该得到回答。代码遇到的问题是表单元格的结束标记包含段落标记和Chr(7)。因此,宏开始循环,并不会离开第一个表单元格。检查范围是否在表中,并缩小范围以省去单元格结尾和段落字符,这样循环就可以继续。(注意:编辑只有在审核后才会显示。)感谢您的编辑和对表格中范围的检查。我没想到的一个特例,谢谢!谢谢-这真是一种魅力!我没有想到选择。。。案例条款。唯一的问题是它在表格中找不到子弹——我该如何添加它呢?嗯。我刚刚注意到另一件事。仅当它是独立宏时才起作用。当我在另一个宏中包含对它的调用时,什么也不会发生。@Yoel:在第二个问题中(从另一个宏调用)尝试使用ActiveDocument代替ThisDocument。此文档将始终引用保存宏的文档。或者更好:将noteMissingPeriods列表更改为接受一个参数—一个Word.Document对象—这样您就可以传递正在处理的文档,而不必担心用户在代码执行过程中是否更改文档。我正在编辑Peter的答案,并对表进行更正,因为他做了真正的工作—他应该得到回答。代码遇到的问题是表单元格的结束标记包含段落标记和Chr(7)。因此,宏开始循环,并没有离开该fir
Option Explicit

Sub Test()
    Dim txtShape As Shape

    '--- checks the whole document
    NoteMissingPeriodsInLists ActiveDocument.Range

    '--- loops through any/all textboxes
    For Each txtShape In ActiveDocument.Shapes
        NoteMissingPeriodsInLists txtShape.TextFrame.TextRange
    Next txtShape
End Sub

Sub NoteMissingPeriodsInLists(checkRange As Word.Range)
    Dim doc As Word.Document
    Dim para As Word.Paragraph
    Dim bulletText As String
    Dim i As Long
    Dim done As Boolean
    Dim warning As String

    warning = "If this is a full sentence, end it with a period."
    For Each para In checkRange.Paragraphs
        If (para.Range.ListFormat.ListType = wdListBullet) Or _
            (para.Range.ListFormat.ListType = wdListSimpleNumbering) Then
            bulletText = para.Range.Text
            i = Len(bulletText)
            done = False
            Do While Not done
                Select Case Asc(Mid(bulletText, i, 1))
                    Case 33, 46   'exclamation, period
                        '--- the bullet correctly ends, so get out
                        done = True
                    Case 34 To 45, 47 To 126
                        '--- the bullet does NOT end with a period, so make a note
                        If para.Range.StoryType = wdMainTextStory Then
                            '--- add note as a comment to the bullet in the main
                            '    text of the document
                            para.Range.Comments.Add para.Range, warning
                        Else
                            '--- finding bullets in other parts of the document
                            '    may be valid, but adding comments may be
                            '    problematic, e.g. textboxes. You'll have to
                            '    decide how to handle those situations.
                            MsgBox "Bulleted list item in textbox does not " & _
                                   "end with a period."
                        End If
                        done = True
                    Case 7, 10, 13, 32
                        '--- ends with a BEL (end of table cell marker), CR,
                        '    LF, or SP, so go backwards
                        i = i - 1
                End Select
            Loop
        End If
    Next para
End Sub