• VBA处理文件,发现打开的word文档分布在出现多个实例下,无法全部遍历


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 PengPengLoveNiuNiu 2024-04-18 21:58 采纳率: 0% 浏览 4 首页/ 微软技术 / VBA处理文件,发现打开的word文档分布在出现多个实例下,无法全部遍历 windowsmicrosoft自动化 现在电脑打开了11个word文档,打开任务管理器看到“应用”里有两个“Microsoft Word”实例,有一个word实例下有10个文件,另外一个word实例下有1个word文档。用VBA处理文件,想把打开着的这些word文档里如果名字里有特定关键词“ABC”的word文档关闭,可是我用GetObject(,"word.application")只能取得其中一个word实例,也就是说不能把所有的word文档都遍历到,不知道怎样才能遍历到所有打开着的word文档,并判断其名字里是否包含“ABC”关键词,如果包含“ABC”,则关闭这个文档,否则不关闭。另外,为什么这11个打开了的word文档会分在两个word实例里呢?按照什么分配的?请教!谢谢 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 21:58
      关注

      引自免费微信小程序:皆我百晓生

      为了遍历并操作所有打开的Word文档,你需要使用GetActiveObject函数而不是GetObjectGetObject只返回一个指定类的单个对象,而GetActiveObject可以获取当前活动的应用程序实例。这里是一个详细的步骤和VBA代码示例:

      首先,确保你已经引用了Microsoft Word Object Library。可以通过以下步骤添加引用:

      1. 在VBA编辑器中,点击“工具”菜单。
      2. 选择“引用”选项。
      3. 在弹出的窗口中找到 "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实例。

      展开全部

      评论 编辑记录
      PengPengLoveNiuNiu 2024-04-19 01:26

      谢谢您的回答,不过,GetActiveObject报“编译错误”子过程或函数未定义,16.0的库我已经引用了

      回复
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-18 21:58
      关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      首先,一个Word实例下可以打开多个文档,这取决于打开文档的方式。如果你通过“文件”->“打开”或者直接双击文档来打开,这些文档就会在一个实例下。如果你通过VBA代码使用Documents.Open方法打开文档,每次调用都会创建一个新的实例。

      要处理所有打开的Word文档,并根据特定关键词关闭相应的文档,需要遍历所有的Word实例和文档。以下是一种方法来实现这个目标:

      1. 获取所有Word实例和文档:
      Dim wordApp As Object
      Dim wordDoc As Object
      
      For Each wordApp In GetObject(, "Word.Application").Documents
          For Each wordDoc In wordApp.Documents
              '...在这里添加你的处理代码
          Next wordDoc
      Next wordApp
      
      1. 根据特定关键词判断文档:
      If InStr(1, wordDoc.Name, "ABC") > 0 Then
          wordDoc.Close
      End If
      

      完整的代码如下:

      Dim wordApp As Object
      Dim wordDoc As Object
      
      For Each wordApp In GetObject(, "Word.Application").Documents
          For Each wordDoc In wordApp.Documents
              If InStr(1, wordDoc.Name, "ABC") > 0 Then
                  wordDoc.Close
              End If
          Next wordDoc
      Next wordApp
      

      请注意,这段代码只能关闭名字中包含特定关键词"ABC"的文档,如果需要对其他条件进行判断,请根据你的需要进行修改。

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Filebeat 采集 k8s Pod 和 Events 日志实战操作
    【我不熟悉的javascript】JSON.stringify和JSON.parse方法详解
    Java8的 lambda Stream的 map 和 flatmap 方法区别 map和flatMap方法的用法
    Python日期时间差的计算(天/小时/分钟)及timedelta函数的使用(附python代码)
    程序地址空间
    Java中的类和对象(Java系列4)
    NVIDIA的jetson平台进行can通讯学习,最终实现can收发详细教程(精五)
    人工智能基础_机器学习046_OVR模型多分类器的使用_逻辑回归OVR建模与概率预测---人工智能工作笔记0086
    性能优化:JIT即时编译与AOT提前编译
    注解&反射学习笔记
  • 原文地址:https://ask.csdn.net/questions/8090929