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:
Wie auch immer Schreibzugriff für den Benutzer gegeben. Danach, wenn das Skript die Datei speichert, wird eine weitere Warnmeldung:
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:
- 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.
- Zielinstanz erstellen.
- Quit Dummy-Instanz.
- Öffnen Sie die Zielarbeitsmappe, ändern und speichern Sie sie.
- 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:
Und die Benachrichtigung nachdem das Skript endet:
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
Ich dachte, dies als Workaround zu tun, aber ich frage mich, ob es gibt eine direkte Möglichkeit, die Datei exklusiv zu öffnen –
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