【问题标题】:External application : loop through open windows from Excel外部应用程序:循环打开 Excel 中的窗口
【发布时间】:2020-07-03 15:33:57
【问题描述】:

我通过 Excel 打开了一个总体规划和一个资源池,但 MSP 随机创建了一个包含其他两个文件的 Project1。

我希望 Excel 检查它是否存在并在不保存的情况下关闭它

Dim ProjApps As new Collection
Dim ProjApp As MSProject.Application
Dim Proj As MSProject.Project

Application.ScreenUpdating = False

Set ProjApp = GetX("MSProject.Application")

ProjApp.Application.AppMaximize
AppActivate ProjApp
SendKeys "{RIGHT}", True
SendKeys "{ENTER}", True

If ProjApp.FileOpenEx(files.MSPRessPool, False, , , , , , , , , , 3) Then
    Set Proj = ProjApp.ActiveProject
    ProjApps.Add Proj
Else
    MsgBox "Fichier non trouvé : " & vbCrLf & files.MSPRessPool
    Exit Sub
End If

If ProjApp.FileOpenEx(files.MasterPlanning, False, , , , , , , , , , 3) Then
    Set Proj = ProjApp.ActiveProject
    ProjApps.Add Proj
Else
    MsgBox "Fichier non trouvé : " & vbCrLf & files.MSPRessPool
    Exit Sub
End If

For each Proj in ProjApps
    Debug.Print Proj.Name
    If Proj.Name = "Project1" then
        Proj.Application.FileCloseEx pjDoNotSave
    End If
Next

Project1 文件未出现在 ProjApps 集合中,因此我无法关闭它

如何检查打开的 MSP 文件?

【问题讨论】:

  • 我不熟悉那个特定的应用程序。您的错误特定于类属性。你没有得到一个属性不存在错误所以我的第一条思路是如果那个 projapp 不是你期望的那样。您是否使用 F8 单步执行您的代码,使用 local 检查属性,在 proj anf projapp 上设置监视,并使用即时窗口来识别您抓取的对象?另外,使用 f2 并确保对象支持这些属性...您可能必须使用 .index(1) 或 .item 或其他一些构造
  • 我同意你的看法。似乎我需要创建一个将通过 for 循环循环的集合(我不熟悉集合)所以我添加了 Dim ProjApps As New Collection 但我只能在创建它们时用 Proj 项目填充它。我通过在For Each proj in ProjApps 循环中添加Debug.Print Proj.Name 进行调试,并且仅在MSP 创建Project1 时获得总体规划和资源池
  • 只是我的两分钱......我非常喜欢字典而不是收藏。但正如许多人指出的那样,我完全忘记了。
  • 我也不熟悉字典。我只在这里和那里读到For Each 循环依赖于集合,所以我尝试了。想不到在其他应用中寻找打开的文件这么难
  • 我绝对推荐尝试字典。它们几乎在所有方面都比收藏品更好。例如,您可以提取键数组或查询以查看特定键是否存在,这意味着您可以检查重复项,而无需像处理集合一样处理错误。另一个例子,键不必是字符串,它可以是除数组以外的任何数据类型......是的,键可以是对象!当然,项目可以是任何数据类型,包括数组。

标签: excel vba ms-project


【解决方案1】:

MS Project 对象模型有一个 Projects object,它是开放项目的集合,因此您无需创建自己的项目。

For Each Proj In ProjApp.Projects
    Debug.Print Proj.Name
    If Proj.Name = "Project1" Then
        Proj.Application.FileCloseEx pjDoNotSave
    End If
Next

【讨论】:

    【解决方案2】:

    根据 Rachel Hettinger 的回答,这段代码运行良好:

        For Each Proj In ProjApp.Projects
           Proj.Activate
           If Proj.Name = "Project1" Then
             Proj.Application.FileCloseEx pjDoNotSave
             Exit For
           End If
        Next
    

    这个也可以

        For ProjNum = 1 To Projects.Count
           Projects(ProjNum).Activate
           If Projects(ProjNum).Name = "Project1" Then
              Proj.Application.FileCloseEx pjDoNotSave
              Exit For
           End If
        Next ProjNum
    

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      相关资源
      最近更新 更多