我对 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
...