2

我在使用 VBA(来自 Access 2002)创建新的 excel 2007 实例时遇到问题。

起初我误解了这个问题,它比我想象的要复杂。

Set myXL = CreateObject("Excel.Application")

创建新进程(我以为没有),但仍然发生奇怪的事情。我使用 OLE 将 Excel 文件存储在 SQL Server 数据库中。

这是将 excel 文件绑定到表单的函数:

Public Function OpenExcelObjFrame() As BoundObjectFrame
    Dim myXL As Object

    Set myXL = CreateObject("Excel.Application") '#1

    Set gTempWorkbook = myXL.Workbooks.Add
    myXL.Visible = True               '#2

    DoCmd.OpenForm "Excel_OBJ"
    Forms("Excel_OBJ").Visible = False
    Forms("Excel_OBJ").RecordSource = "SELECT Excel_File FROM Excel_File_Obj;"
    Set OpenExcelObjFrame = Forms("Excel_OBJ").Excel_File
End Function

上下文:

Dim tExcelObjFrame As BoundObjectFrame
Set tExcelObjFrame = OpenExcelObjFrame()

tExcelObjFrame.Verb = acOLEVerbOpen
tExcelObjFrame.Action = acOLEActivate '#3

ad 1第二个进程 excel.exe 启动

ad 2添加了这一行来检查第二个过程发生了什么

ad 3 OLE 将文件绑定到现有的 excel 实例,第二个进程在这里被杀死:/

所以问题是:

  1. 为什么 tExcelObjFrame.Action = acOLEActivate 会杀死第二个进程

  2. 如何在第二个过程中强制对象框架激活 excel 文件

编辑

我在这里找到了部分解释(没有明确的解决方案):

http://www.xtremevbtalk.com/showthread.php?t=292170

  1. 如果没有正在运行的 Excel 实例,OLE 会在您直接或通过编程访问该对象时创建一个 Excel 实例。
  2. 如果 Excel 的实例已在运行,则这是 OLE 对象使用的实例。

问题是 OLE 对象选择了错误的 excel 实例。问题是是否有办法将 OLE 指向特定实例。

此处描述的相同问题(未给出解决方案):

http://groups.google.com/group/microsoft.public.win32.programmer.ole/browse_thread/thread/9c4cde2a79453037

4

3 回答 3

1

更新:
我一直在我的工作站上尝试您现有的代码,并且:

Set myXL = CreateObject("Excel.Application")

似乎按您的要求工作。
我打开了一个进程,然后运行该行并创建另一个进程。

我一直在进一步调查,结果发现这是 Excel 2007 的一个怪癖。
我一直在查看的所有内容都让我回到 Windows文件类型(向右滚动到底部)或注册表黑客,这在这种情况下基本上都在改变同样的事情。

我知道在 VBA 中,您可以使用 CreateNewKey 和 SetKeyValue 来处理注册表项,但我不确定您是否愿意这样做。

于 2009-05-08T10:45:43.637 回答
1
Sub New_Excel()

'Create a Microsoft Excel instance via code using late binding. (No references required)

Dim xlApp As Object

Dim wbExcel As Object

'Create a new instance of Excel

Set xlApp = CreateObject("Excel.Application")

'Open workbook

Set wbExcel = xlApp.Workbooks.Open("Book1")  'or you may place here the complete name and path of the file you want to open upon the creation of the new instance

'Set the instance of Excel visible. (It's been hiding until now)

xlApp.visible = True

'Release the workbook and application objects to free up memory

Set wbExcel = Nothing

Set xlApp = Nothing

End Sub
于 2011-06-16T20:45:50.657 回答
0

尝试在单个 Excel 2007 实例中打开多个工作簿时,我遇到了类似的问题 - 在 Excel 2003 中这工作正常,但现在它们都在同一个实例中打开。

我不知道这是否也能解决您的问题,但我通过告诉 Excel 不要使用 DDE(选项、高级、常规、忽略使用 DDE 的其他应用程序)来修复它(或让它按我想要的方式工作!)。请注意,如果您这样做,您需要更改资源管理器中所有启动 Excel 的文件类型,因为它们默认使用 DDE - 编辑文件选项,取消选中“使用 DDE”并在末尾添加“%1”命令行。

(实际上,我认为这可能会回答安迪的回答中的评论,其中只创建了一个 Excel 实例,但不一定有助于解决打开多个实例的原始问题

于 2009-05-08T12:25:57.427 回答