引自免费微信小程序:皆我百晓生
为了遍历并操作所有打开的Word文档,你需要使用GetActiveObject函数而不是GetObject。GetObject只返回一个指定类的单个对象,而GetActiveObject可以获取当前活动的应用程序实例。这里是一个详细的步骤和VBA代码示例:
首先,确保你已经引用了Microsoft Word Object Library。可以通过以下步骤添加引用:
- 在VBA编辑器中,点击“工具”菜单。
- 选择“引用”选项。
- 在弹出的窗口中找到 "Microsoft Word XX.0 Object Library" (XX是版本号,例如16.0),勾选它,然后点击确定。
接下来,使用以下VBA代码来遍历所有打开的Word文档并检查文档名是否包含关键词"ABC",如果是,则关闭文档:
Sub CloseDocumentsWithKeyword()
' 引用 Microsoft Word Object Library
' 添加引用: 工具 -> 引用 -> Microsoft Word XX.0 Object Library
Dim wordApp As Object ' 创建 Word 应用程序对象
Dim wordDoc As Object ' 创建 Word 文档对象
Dim docName As String ' 存储文档名称
' 获取所有活动的 Word 实例
Set wordApp = GetActiveObject("Word.Application")
' 检查是否有多个 Word 实例
If wordApp.Windows.Count < 2 Then
MsgBox "只有一个 Word 实例正在运行。"
Exit Sub
End If
' 遍历每个文档
For Each wordDoc In wordApp.Documents
docName = wordDoc.Name ' 获取文档名称
' 检查文档名称是否包含 "ABC"
If InStr(1, docName, "ABC", vbTextCompare) > 0 Then
' 关闭文档
wordDoc.Close SaveChanges:=wdDoNotSaveChanges ' 不保存更改
MsgBox "已关闭文档:" & docName
Else
' 如果没有找到关键词,跳过此文档
Debug.Print "忽略文档:" & docName
End If
Next wordDoc
' 清理变量
Set wordDoc = Nothing
Set wordApp = Nothing
End Sub
关于为何这些Word文档会被分到不同的实例中,这是因为当用户打开新的Word文档时,Windows操作系统可能会决定将新文档放在现有Word实例中,或者创建一个新的实例。具体分配逻辑可能与用户的系统设置、Word的配置以及是否存在资源限制等因素有关。在大多数情况下,如果你在一个Word实例中打开了多个文档,它们通常会被安排在同一实例下,除非你手动或通过某些方式启动了第二个Word实例。
