2016-03-15 17 views
6

ich eine einfache Frage, aber ich habe für diese gesucht und keine hilfreich Themen finden konnten ..Öffnen Sie eine Excel-Datei in exklusivem Modus mit VBScript

Ich bin auf einem VBScript arbeiten, die eine Excel öffnet Datei und ändert in ihm ein paar Sachen .. also verwende ich diesen Code:

Set objXLApp = CreateObject("Excel.Application") 

    objXLApp.Visible = False 
    objXLApp.DisplayAlerts = False 

    Set objXLWb = objXLApp.Workbooks.Open(FilePath) 

Nun, was soll ich tun, um sie die Excel-Datei mit einer Art und Weise zu öffnen, die Datei sperrt und verhindert, dass der Benutzer von Öffnen Sie es, während es vom Skript geöffnet wird (bis es geschlossen ist).

Update:

Ich denke, das Problem irgendwie zu den Excel-Instanzen verwandt ist, habe ich versucht, folgendes zu tun (während die Datei von dem Skript offen):

  • Als ich manuell öffnen Sie die Datei (während es durch das Skript geöffnet ist) sie beide sind eine einzelne Instanz.
  • Wenn ich eine andere Excel-Datei öffne, sind sie beide auch werden zu einer einzigen Instanz !!! Und die Originaldatei (vom Skript geöffnet) wird sichtbar!

Nun ist dies komisch, weil ich CreateObject("Excel.Application") bin mit und nicht GetObject(, "Excel.Application")

+2

Verschieben Sie vorübergehend die Excel-Datei in einen speziellen Ordner, öffnen Sie es, ändern Sie ein paar Sachen darin, dann speichern, schließen und zurück :) – omegastripes

+0

Ich dachte, dies als Workaround zu tun, aber ich frage mich, ob es gibt eine direkte Möglichkeit, die Datei exklusiv zu öffnen –

+0

Wenn die Datei vom Skript geöffnet wird, wird sie nur zu anderen Versuchen, sie zu öffnen, nur gelesen. Möchten Sie dies noch einschränken? – brettdj

Antwort

2

Es gibt Registrierungsschlüssel HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command auf Win 7 Excel 2010 für mich mit dem Standardwert "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /dde. Die Befehlszeile /dde Switch aktiviert DDE (Dynamic Data Exchange-Mechanismus - eine alte Win 3.0 Interprozess-Kommunikationsmethode), die Excel in einer einzigen Instanz startet. Ich habe versucht, diesen Schalter zu entfernen und Arbeitsmappen geöffnet, aber ohne Erfolg. BTW, wenn Sie keine Berechtigung haben, die Registrierung zu bearbeiten, oder Sie beabsichtigen, Ihr Skript an jemanden zu verteilen, der das nicht tut, ist das kein Weg. Habe auch versucht this answer, aber es funktioniert nicht für Win 7 Office 2010.

Ich habe test.xlsm Datei mit DDE aktiviert getestet. Wenn der Benutzer eine Datei öffnet, wird sie in der vorhandenen Instanz gerade wieder geöffnet, um sie sichtbar zu machen.Bei Änderungen wurden bereits durch das Skript gemacht, dann Excel-Warnungen:

changes to be discarded

Wie auch immer Schreibzugriff für den Benutzer gegeben. Danach, wenn das Skript die Datei speichert, wird eine weitere Warnmeldung:

file already exists

Vor einiger Zeit habe ich ein Skript, das mit Excel-Anwendung gearbeitet, und traf das gleiche Problem mit Win 7 Excel 2010 wie Sie beschreiben. Ich bemerkte, dass wenn mehrere Excel-Anwendungsinstanzen innerhalb von Skript mit CreateObject() erstellt wurden, die vom Benutzer geöffnete Excel-Datei immer genau die zuerst erstellte Instanz verwendete. Ich habe das Problem gelöst, indem ich zwei unsichtbare Instanzen der Excel-Anwendung erstellt habe, sagen wir Dummy und Ziel. Im Überblick ist der Algorithmus für ein Skript wie folgt:

  1. Dummy-Instanz zuerst erstellen, keine Arbeitsmappe hinzufügen. Danach wird die Dummy-Instanz mit einer Excel-Datei belichtet, die vom Benutzer geöffnet werden kann.
  2. Zielinstanz erstellen.
  3. Quit Dummy-Instanz.
  4. Öffnen Sie die Zielarbeitsmappe, ändern und speichern Sie sie.
  5. Zielinstanz beenden.

Betrachten Sie die folgenden Code, der eine Art und Weise veranschaulicht zu implementieren, was Sie brauchen:

' 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 

offen Der Versuch, die Datei, die Sie Ausgang gewünscht wird erhalten:

open read-only and notify

Und die Benachrichtigung nachdem das Skript endet:

open read-write

+0

Die 'Dummy-Instanz' ist wirklich eine großartige Idee. Das ist perfekt, es ist genau das, wonach ich gesucht habe. Ich danke dir sehr :) –

2

Das seltsame ist, dass Sie nicht eine Nachricht wie unten bekommen:

enter image description here

Eine mögliche Methode wäre be

  • , um die Dateiattribute am Anfang und Ende der Co zu ändern de, macht die Version unter die Datei Nur-Lese- und versteckt
  • machen Ihre Änderungen
  • mit einem anderen Namen speichern Sie die Datei
  • Änderung der Attribute zurück
  • benennen Sie die geänderte Datei auf den ursprünglichen Namen

Code

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

Da die Datei schreibgeschützt ist, kann ich den Inhalt nicht durch das Skript ändern (ich habe es gerade getestet btw) Ich habe auch versucht, die Dateiattribute = 32 ** vor ** Speichern der Datei zu setzen. Aber diese Änderungen werden nicht gespeichert! –

+0

@GeniuSBraiN aktualisiert aufgrund Ihrer Notwendigkeit, die Datei zu ändern. Immer noch überrascht, dass der Standard-Readonly-Schutz nicht gilt. – brettdj

+0

Das ist nicht, was ich will (ich möchte nicht speichern als) .. Wie auch immer, ich habe etwas Debugging, und ich kam mit etwas .. bitte überprüfen Sie das Update in meiner Frage –