用于用空白替换特定间隔的单词的单词宏

用于用空白替换特定间隔的单词的单词宏

我对 Word 中的宏还很陌生,但我想自动化一个过程,想知道是否有人可以帮助我。

我是一名语言老师。我想选取我班上创作的一个故事,选择每 8 个(或第 n 个)单词并将其从文档中剪下来。然后我想用“空白”(即学生将在上面书写的 8 个下划线)替换提取的单词,然后将提取的单词粘贴到其他地方。

我对此感到很困惑,并得出了以下结论:

Sub Blankify8()

 Blankify8 Macro


    Selection.MoveRight Unit:=wdWord, Count:=8
    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
    Selection.Cut
    Selection.TypeText Text:="____________ "
    Windows("Document4").Activate
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    Selection.TypeParagraph
    Windows("Document3").Activate
End Sub

这样做有几个问题。首先,我宁愿将单词粘贴到同一文档中的文本框或表格中,而不是粘贴到另一个文档中。我不知道该怎么做。当然,如果在运行宏时没有打开“文档 4”,它也不会起作用。

第二个问题是,只需按住控制键并跳过 8 次光标键,有时会切掉标点符号或回车符,这会弄乱原始文档。我只想提取单词。

另外,我希望能够循环该命令以便它重复执行直到文档结束。

最后,有没有办法让宏询问用户他们想要使用什么间隔来跳过步骤数?


回复者:

确实非常感谢。

将选择限制为 3 个字符以上更好,但我希望宏可以不加区分地从文本中剪切单词(目的是用于语言教学,而且在这样的活动中通常需要强调的是较小的单词)。

我发现其他人编写的一些代码可能会有用,但我不明白如何使用其余命令在我的宏中实现它:

    Function IsLetter(strValue As String) As Boolean

Dim intPos As Integer
For intPos = 1 To Len(strValue)
    Select Case Asc(Mid(strValue, intPos, 1))
        Case 65 To 90, 97 To 122
            IsLetter = True
        Case Else
            IsLetter = False
            Exit For
    End Select
Next

End Function

    Sub Blank()

Dim OriginalStory As Document
Set OriginalStory = ActiveDocument
Dim WordListDoc As Document
Set WordListDoc = Application.Documents.Add

Windows(OriginalStory).Activate

sPrompt = "How many spaces would you like between each removed word?"
sTitle = "Choose Blank Interval"
sDefault = "8"
sInterval = InputBox(sPrompt, sTitle, sDefault)

Selection.HomeKey Unit:=wdStory

Do Until Selection.Bookmarks.Exists("\EndOfDoc") = True

Selection.MoveRight Unit:=wdWord, Count:=sInterval, Extend:=wdMove
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend

    If IsLetter = True Then

    Selection.Cut
    Selection.TypeText Text:="__________ "
    Windows(WordListDoc).Activate
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    Selection.TypeParagraph
    Windows(OriginalStory).Activate

    Else

    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdMove
    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend

    Loop

Loop

End Sub

该函数应该位于其余代码的“上方”,对吗?但是当我运行它时,我收到错误“参数不是可选的”。我想突出显示每个第 n 个选择,检查它是否是一个实际的单词,是否将其剪切并粘贴到其他文档中,如果不是,则转到下一个选择并检查,直到找到一个单词。

答案1

首先,我宁愿将单词粘贴到同一个文档的文本框或表格中,而不是粘贴到另一个文档中。

宏完成后,您只需添加几行即可将新文档的全部内容复制到旧文档中

当然,如果在运行宏时没有打开“文档 4”,它也不会起作用。

不要引用现有文档,启动宏时创建一个新文档

Dim NewDoc as Document
Set NewDoc = Application.Documents.Add

按住控制键并跳过 8 次光标键有时会切掉标点符号或回车符,这会弄乱原始文档。我只想提取单词。

虽然这不是最优雅的解决方案,但您可以例如寻找长度超过 3 个字符的单词,这将排除大多数问题。

...
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Do until len(Selection) > 3 OR Selection.Bookmarks.Exists("\EndOfDoc")
    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Loop
If Not Selection.Bookmarks.Exists("\EndOfDoc") Then
    Selection.Cut
...

另外,我希望能够循环该命令以便它重复执行直到文档结束。

在循环周围添加一个循环:

Do 
    ...
Loop While Selection.Bookmarks.Exists("\EndOfDoc")

有什么方法可以让宏询问用户他们想要使用什么间隔来跳过步骤数?

您可以使用InputBox来请求用户输入:

Dim SkipWordCount as Integer

SkipWordCount = CInt(InputBox("Enter number of words to be skipped"))

Loop
    Selection.MoveRight Unit:=wdWord, Count:= SkipWordCount
    ...

相关内容