C'è una chiave di registro HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command
su Win 7 Excel 2010 per me con il valore predefinito "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /dde
. Lo switch da riga di comando /dde
abilita DDE (meccanismo di scambio dinamico dei dati, un antico metodo di comunicazione interprocesso di Win 3.0) che forza l'avvio di Excel in una singola istanza. Ho provato a rimuovere quell'interruttore e ho aperto le cartelle di lavoro, ma senza risultato. A proposito, se non si dispone dell'autorizzazione per modificare il registro o se si intende distribuire lo script a qualcuno che non lo fa, non è un modo. Ho anche provato this answer, ma non funziona per Win 7 Office 2010.
Ho testato il file test.xlsm
con DDE abilitato. Quando l'utente apre un file, in realtà viene semplicemente riaperto nell'istanza esistente che lo rende visibile.Se tutte le modifiche è stato già fatto dallo script, quindi Excel avverte:
![changes to be discarded](https://i.stack.imgur.com/UeAo7.png)
Comunque scrittura l'accesso è dato per l'utente. Dopo di che, quando lo script salva il file, viene visualizzato un altro avviso:
![file already exists](https://i.stack.imgur.com/ge1jA.png)
Qualche tempo fa ho creato uno script che ha lavorato con l'applicazione Excel e incontrato lo stesso problema con Win 7 Excel 2010, come si sta descrivendo. Ho notato che se c'erano diverse istanze di applicazioni Excel create con CreateObject()
all'interno dello script, il file Excel aperto dall'utente utilizzava sempre esattamente la prima istanza creata. Ho risolto il problema creando due istanze invisibili di applicazione Excel, ad esempio dummy e target. Di seguito l'algoritmo di uno script è il seguente:
- Creare prima l'istanza fittizia, non è necessario aggiungere una cartella di lavoro. Dopo che l'istanza fittizia viene esposta, un file Excel deve essere aperto dall'utente all'interno di esso.
- Creare un'istanza di destinazione.
- Chiudere l'istanza fittizia.
- Aprire la cartella di lavoro di destinazione, modificarla e salvarla.
- Esci dall'istanza di destinazione.
Si consideri il seguente codice che illustra una possibile via per attuare quello che vi serve:
' target file path
sPath = "C:\Users\DELL\Desktop\test.xlsm"
' create dummy instance
Set oExcelAppDummy = CreateObject("Excel.Application")
' create target instance
Set oExcelApp = CreateObject("Excel.Application")
' quit dummy instance
oExcelAppDummy.Quit
' open target workbook
With oExcelApp
.Visible = False
.DisplayAlerts = False
Set oWB = .Workbooks.Open(sPath)
End With
' make some changes and save
Set oWS = oWB.Sheets(1)
oWS.Cells(1, 1).Value = Now()
oWB.Save
' give additional time for test
MsgBox "Try to open test.xlsm, OK to end the script"
' close target workbook
oWB.Close
' quit target instance
oExcelApp.Quit
Cercando aprire il file otterrete desiderata uscita:
![open read-only and notify](https://i.stack.imgur.com/Zb4NC.png)
e la notifica al termine della sceneggiatura:
![open read-write](https://i.stack.imgur.com/jHVcg.png)
Spostare temporaneamente il file Excel in una cartella speciale, aprirlo, modificarne alcune parti, quindi salvare, chiudere e tornare indietro :) – omegastripes
Ho pensato di farlo come soluzione alternativa, ma mi chiedo se non ci sia un modo diretto per aprire il file esclusivamente –
Se il file è aperto dallo script, sarà solo in lettura e in lettura per qualsiasi altro tentativo di aprirlo. Vuoi ancora limitare questo? – brettdj