Problema al abrir Excel 2007 en una nueva instancia usando VBA (usando OLE y el marco del objeto vinculado)

StackOverflow https://stackoverflow.com/questions/839243

  •  22-07-2019
  •  | 
  •  

Pregunta

Tengo problemas para crear una nueva instancia de Excel 2007 usando VBA (de Access 2002).

Al principio no entendí el problema y es más complicado de lo que pensaba.

Set myXL = CreateObject("Excel.Application")

Crea nuevos procesos (pensé que no), pero aún sucede algo extraño. Uso OLE para almacenar archivos de Excel en la base de datos de SQL Server.

Esta es la función que limita el archivo de Excel a un formulario:

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

El contexto:

Dim tExcelObjFrame As BoundObjectFrame
Set tExcelObjFrame = OpenExcelObjFrame()

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

anuncio 1 segundo proceso excel.exe comienza

anuncio 2 se agregó esta línea para verificar lo que está sucediendo en el segundo proceso

anuncio 3 OLE limita el archivo a la instancia de Excel existente, el segundo proceso se elimina aquí: /

Entonces el problema es:

  1. Por qué tExcelObjFrame.Action = acOLEActivate mata el segundo proceso

  2. Cómo forzar Object Frame para activar el archivo de Excel en el segundo proceso

EDIT

He encontrado una explicación parcial aquí (sin una solución clara):

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

  
      
  1. Si no se está ejecutando ninguna instancia de Excel, OLE crea una instancia de Excel cuando accede al objeto, ya sea directamente o mediante programación.
  2.   
  3. Si ya se está ejecutando una instancia de Excel, esta es la instancia que utiliza el objeto OLE.
  4.   

El problema es que el objeto OLE elige una instancia de Excel incorrecta. La pregunta es si hay una manera de señalar OLE a una instancia específica.

Mismo problema descrito aquí (no se proporciona solución):

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

¿Fue útil?

Solución

Actualización:
He estado probando su código existente en mi estación de trabajo y el:

Set myXL = CreateObject("Excel.Application")

parece funcionar como lo solicita.
He tenido un proceso abierto, luego ejecuto esa línea y crea otro proceso.

He estado investigando un poco más y resulta que esto es un poco peculiar de Excel 2007.
Todo lo que he estado viendo me lleva de vuelta al Windows tipo de archivo (desplácese hacia la derecha hasta la parte inferior) o registro , que son básicamente cambiando lo mismo en esta situación.

Sé que en VBA puedes jugar con claves de registro con CreateNewKey y SetKeyValue, pero no estoy seguro de que quieras hacer eso.

Otros consejos

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

Tuve problemas similares al intentar abrir varios libros de trabajo en instancias individuales de Excel 2007; en Excel 2003 esto funcionó bien, pero ahora todos se abren en la misma instancia.

No sé si esto también resolverá su problema, pero lo arreglé (¡o lo hice funcionar de la manera que quería!) diciéndole a Excel que no use DDE (Opciones, Avanzado, General, Ignorar otras aplicaciones que usan DDE). Tenga en cuenta que si hace esto, deberá cambiar todos los tipos de archivos en el Explorador que inician Excel, ya que usan DDE de forma predeterminada: edite las opciones del archivo, desmarque " Usar DDE " y agregue "% 1 " hasta el final de la línea de comando.

(en realidad, creo que eso podría responder un comentario de la respuesta de Andy, donde solo se creó una instancia de Excel, pero no necesariamente ayuda con la pregunta original, donde se abren varias instancias )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top