Problema durante l'apertura di Excel 2007 in una nuova istanza utilizzando VBA (utilizzando OLE e frame oggetto associato)

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

  •  22-07-2019
  •  | 
  •  

Domanda

Ho problemi a creare una nuova istanza di Excel 2007 usando VBA (da Access 2002).

Inizialmente ho capito male il problema ed è più complicato di quanto pensassi.

Set myXL = CreateObject("Excel.Application")

Crea nuovi processi (pensavo non lo fosse), ma sta ancora succedendo qualcosa di strano. Uso OLE per archiviare i file Excel nel database di SQL Server.

Questa è la funzione che lega il file Excel a un modulo:

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

Il contesto:

Dim tExcelObjFrame As BoundObjectFrame
Set tExcelObjFrame = OpenExcelObjFrame()

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

annuncio 1 viene avviato il secondo processo excel.exe

annuncio 2 aggiunta questa riga per verificare cosa sta succedendo al secondo processo

annuncio 3 OLE limita il file all'istanza di Excel esistente, il secondo processo viene terminato qui: /

Quindi il problema è:

  1. Perché tExcelObjFrame.Action = acOLEActivate termina il secondo processo

  2. Come forzare Object Frame per attivare il file Excel nel secondo processo

Modifica

Ho trovato una spiegazione parziale qui (senza soluzione chiara):

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

  
      
  1. Se nessuna istanza di Excel è in esecuzione, OLE crea un'istanza di Excel quando si accede all'oggetto, direttamente o tramite la programmazione.
  2.   
  3. Se un'istanza di Excel è già in esecuzione, questa è l'istanza utilizzata dall'oggetto OLE.
  4.   

Il problema è che l'oggetto OLE sceglie un'istanza di Excel errata. La domanda è se esiste un modo per indicare OLE a un'istanza specifica.

Stesso problema descritto qui (nessuna soluzione fornita):

http://groups.google com / gruppo / microsoft.public.win32.programmer.ole / browse_thread / filetto / 9c4cde2a79453037

È stato utile?

Soluzione

Aggiornamento:
Ho provato il tuo codice esistente sulla mia workstation e sul:

Set myXL = CreateObject("Excel.Application")

sembra funzionare come richiesto.
Ho aperto un processo, quindi eseguo quella linea e crea un altro processo.

Ho studiato un po 'di più e si scopre che questo è un po' una stranezza di Excel 2007.
Tutto quello che ho visto mi riporta a Windows tipo di file (scorrere verso il basso fino in fondo) o Registry hack, che sono fondamentalmente cambiando la stessa cosa in questa situazione.

So che in VBA puoi giocare con le chiavi di registro con CreateNewKey e SetKeyValue, ma non sono sicuro che vorrai farlo.

Altri suggerimenti

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

Ho avuto problemi simili proprio quando ho provato ad aprire più cartelle di lavoro in singole istanze di Excel 2007: in Excel 2003 funzionava bene, ma ora si aprono tutte nella stessa istanza.

Non so se questo risolverà anche il tuo problema, ma l'ho risolto (o fatto funzionare come volevo!) dicendo a Excel di non usare DDE (Opzioni, Avanzate, Generale, Ignora altre applicazioni che usano DDE). Nota: in questo caso dovrai cambiare tutti i tipi di file in Explorer che avviano Excel quando usano DDE per impostazione predefinita: modifica le opzioni del file, deseleziona " Usa DDE " e aggiungi "% 1 " alla fine della riga di comando.

(in realtà, penso che potrebbe rispondere a un commento dalla risposta di Andy, in cui è stata creata solo un'istanza di Excel, ma non necessariamente aiuta con la domanda originale, in cui vengono aperte più istanze )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top