2016-03-15 45 views
6

Ho una domanda semplice, ma ho cercato per questo e non abbiamo trovato nessuna argomenti utili ..Aprire un file di Excel in modalità esclusiva utilizzando VBScript

Sto lavorando a un VBScript che si apre un Excel archiviare e modificare un paio di cose in esso .. così sto usando questo codice:

Set objXLApp = CreateObject("Excel.Application") 

    objXLApp.Visible = False 
    objXLApp.DisplayAlerts = False 

    Set objXLWb = objXLApp.Workbooks.Open(FilePath) 

Ora, quello che voglio fare è quello di aprire il file di Excel utilizzando un modo che blocca il file e impedisce all'utente di aprendolo mentre è aperto dalla sceneggiatura (finché non viene chiuso).

Aggiornamento:

Credo che il problema è in qualche modo legato alle istanze di Excel, ho cercato di fare quanto segue (mentre il file è aperto dallo script):

  • Quando ho manualmente apre il file (mentre è aperto dallo script) entrambi diventano una singola istanza.
  • Quando apro qualsiasi altro file di Excel sono entrambi anche diventano un'unica istanza !!! E il file originale (aperto dallo script) diventa visibile!

Ora questo è strano perché sto utilizzando CreateObject("Excel.Application") e non GetObject(, "Excel.Application")

+2

Spostare temporaneamente il file Excel in una cartella speciale, aprirlo, modificarne alcune parti, quindi salvare, chiudere e tornare indietro :) – omegastripes

+0

Ho pensato di farlo come soluzione alternativa, ma mi chiedo se non ci sia un modo diretto per aprire il file esclusivamente –

+0

Se il file è aperto dallo script, sarà solo in lettura e in lettura per qualsiasi altro tentativo di aprirlo. Vuoi ancora limitare questo? – brettdj

risposta

2

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

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

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:

  1. 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.
  2. Creare un'istanza di destinazione.
  3. Chiudere l'istanza fittizia.
  4. Aprire la cartella di lavoro di destinazione, modificarla e salvarla.
  5. 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

e la notifica al termine della sceneggiatura:

open read-write

+0

L''istanza fittizia' è davvero una grande idea. Questo è perfetto, è esattamente quello che stavo cercando. Grazie mille :) –

2

Questo è strano che non si ottiene un messaggio come di seguito:

enter image description here

Un metodo possibile sarebbe be

  • per modificare gli attributi del file all'inizio e alla fine del co de, la versione in basso rende il file sola lettura e nascosto
  • apportare le modifiche
  • salvare il file con un nome diverso
  • modificare gli attributi posteriori
  • rinominare il file modificato con il nome originale

codice

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objXLApp = CreateObject("Excel.Application") 

filePath = "C:\Temp\MyFile.xlsm" 
filePath2 = "C:\Temp\MyFile1.xlsm" 

set objFile = objFSO.GetFile(filePath) 
objFile.Attributes = 3 

objXLApp.Visible = False 
objXLApp.DisplayAlerts = False 

Set objxlWB = objXLApp.Workbooks.Open(filePath) 
'do stuff 
objxlWB.saveas filePath2 
objxlWB.Close 
objXLApp.Quit 
set objXLApp = Nothing 

objFile.Attributes = 32 
objFile.Delete 
objFSO.MoveFile filePath2, filePath 
+0

Poiché il file è di sola lettura, non sarà in grado di cambiarne il contenuto tramite lo script (l'ho appena testato btw) Ho anche provato a impostare gli attributi del file = 32 ** prima ** salvando il file. . ma le modifiche non verranno salvate! –

+0

@GeniuSBraiN aggiornato data la necessità di modificare il file. Ancora sorpreso la protezione di sola lettura predefinita non si applica. – brettdj

+0

Questo non è quello che voglio (non voglio salvare come) .. Comunque ho fatto un po 'di debug, e mi è venuto in mente qualcosa .. si prega di controllare l'aggiornamento nella mia domanda –