【发布时间】:2019-06-24 07:51:57
【问题描述】:
(最低要求:Excel 2010 和 Windows 7) 我已经设法使用了 MSDN 中的 Bill Manville 的答案,并进行了细微的更改。建议的递归代码基本上使用文件的 Workbook_Open 来创建一个单独的实例,并且该实例将文件打开为可编辑,而不提示只读访问。
Private Sub Workbook_Open()
Dim oXcl As Excel.Application
If Workbooks.Count > 1 Then
ThisWorkbook.Saved = True
ThisWorkbook.ChangeFileAccess xlReadOnly
Set oXcl = CreateObject("Excel.Application")
oXcl.ScreenUpdating = False
oXcl.Visible = True
oXcl.Workbooks.Open fileName:=ThisWorkbook.FullName, ReadOnly:=False
AppActivate oXcl.Caption
ThisWorkbook.Close SaveChanges:=False
Else
Call Continue_Open
End If
End Sub
当 Excel 已经在运行时,代码运行良好,因为它创建了一个新的 Excel 实例,如果打开了一个新的 Excel 文件,它会转到另一个 Excel 实例(在它之前运行)。但是,如果带有 Workbook_Open 的文件是启动 Excel 的文件,则通过在该 Excel 实例中双击打开的任何其他 Excel 文件,因为它是最早运行的实例,因此不再是单独的。
我已经能够告诉(Windows)该文件是否通过使用来启动 Excel
Function NumberOfExcelInstances()
strComputer = "."
Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set proc = objWMI.ExecQuery("Select * from Win32_Process Where Name = 'Excel.exe'")
NumberOfExcelInstances = proc.Count
End Function
但我无法找到一种方法来告诉在打开新文件时不要使用该 Excel 实例。任何代码都应与 Worbook_Open 代码捆绑在 Excel 文件中。 我怎么可能在文件中包含 VBA 代码,以便它在单独的 Excel 实例中打开,即使该文件是触发 Excel 的文件?
【问题讨论】:
-
你确定是 2010 年的吗? MDI 接口在 2013 年被删除,从那时起你就不能做你想做的事,因为你不能有一个没有打开文档的 Excel 实例。对于 2010 年,它应该可以工作,但如果没有,请在启动新 Excel 之前尝试从
Workbook_Open返回(为此,您必须使用Application.OnTime来安排该代码在您退出Workbook_Open后运行一秒钟)。 -
非常感谢您的关注。我不知道 Excel 2013 的这些更改。我已经在 Excel 2010 中测试了该文件,并且它的工作原理,顺便说一下,它的行为与应用程序中提到的一样.OnTime:在 Excel 2010 中,它会在 Excel 已经触发时创建一个新实例,但如果该文件触发 Excel,它会在该实例中打开新的 Excel 文件。我现在可以轻松使用 Application.OnTime 但我不确定我是否理解“尝试从工作簿返回。:打开”你能详细说明一下吗?
-
我的意思是您需要将 OnTime 设置为这样的时间,以便到那时您将从
Workbook_Open返回。尝试在Workbook_Open的最后一行将OnTime设置为dateadd("s", 1, Now)。