我有 2 个 Excel 工作簿,其中包含很多基于事件的 VBA 代码。如果它们最终在同一个 Excel 实例(2003 或 2013)下运行,事件会同时触发并导致崩溃。
因此,在 Excel 2003 中,我在单独的 excel 实例中打开工作簿(A 和 B),工作簿 A 有一个链接,可以使用以下格式从工作簿 B 中“拉入”实时更新日期
{=Excel.Sheet.8|'\\server\B.xls'!'!Sheet1!R1C1:R300C8'}
我首先在它自己的实例中打开“B”,然后我也在它自己的实例中打开“A”。 “A”询问我是否要更新外部工作簿中的链接,我选择“更新”
在 Excel 2003 中,这可以完美运行。工作簿在单独的 Excel 实例下运行,因此不共享内存占用,一切都安全稳定,但 A 从 B 获取实时流更新(不是来自保存的文件,而是来自实时运行的实例)。因此,即使它们在内存中的 Excel 2003 的单独实例中运行,它们也能够通过链接进行通信。
在 excel 2013 中,默认行为是在同一个 excel 实例中打开所有工作簿(即使您在打开下一个工作簿之前尝试像 2003 一样打开 Excel.exe)。我知道我可以强制 Excel 2013 通过 Ctrl + 右键单击菜单选项打开一个新的 Excel 实例,但是这些 Excel 实例现在无法像 2003 年那样相互通信。
在 excel 2013 中,当我在 A 和 B 之间创建相同的链接时,A 可以从 B 中提取的唯一数据是已保存到文件服务器的任何数据。 “A”没有“ Hook ”到“B”的“实时”实例中。
这是 Excel 2003 的一个变化。在 2003 中,如果先打开“B”,然后打开“A”,那么“A”会识别“B”已打开,并将 Hook 到“B”的实时运行实例(即使它们不在同一个实例中运行)。
excel 2013 工作簿有什么方法可以在单独的实例中运行(为了稳定性),但是让这些实例“ Hook ”实时进程......这是 Excel 2003 中的功能吗?
最佳答案
在其中一个工作簿(您选择拉出的第一个工作簿)中,您可以使用 VBA 定义 2 个 Excel 实例。然后,您可以引用每个实例并使用 Application.Run 在每个 Excel 程序中执行子例程。
举个例子...
Sub FromBook1()
Dim EApp1 as Excel.Application
Dim EApp2 as Excel.Application
Dim Bk1 as Excel.Workbook
Dim Bk2 as Excel.Workbook
'Set the first object to this instance of Excel (the first book you opened)
Set EApp1 = GetObject(,"Excel.Application")
Set EApp2 = CreateObject("Excel.Application")
Set Bk1 = EApp1.Workbooks("[name of workbook #1]")
Set Bk2 = EApp2.Workbooks.Open("[path for workbook #2]")
'Put your condition/event in here (e.g., an if/then)
'If the condition is triggered
With EApp2
.Run("[Name of subroutine in book 2 to call]")
End With
End Sub
关于vba - Excel 2013 工作簿在单独的 Excel 实例中通过链接进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32892065/