【发布时间】: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