Ich versuche, ein Skript zu schreiben, das viele Excel-Dateien öffnet. Ich bekomme immer die Aufforderung:
This workbook contains links to other data sources.
Ich möchte, dass diese Nachricht nicht angezeigt wird, so dass mein Skript automatisch alle Arbeitsmappen durchgehen kann, ohne dass ich für jeden auf Don't Update
klicken muss. Derzeit verwende ich Folgendes:
function getWorkbook(bkPath as string) as workbook
Application.EnableEvents=False
Application.DisplayAlerts=False
getWorkbook=Workbooks.Open(bkPath,updatelinks:=0,readonly:=false)
end function
Die Nachricht wird jedoch weiterhin angezeigt. Wie kann ich es unterdrücken?
BEARBEITEN: Es scheint, dass diese Nachricht für Arbeitsmappen erscheint, die Links unterbrochen haben. Ich habe die This workbook contains one or more links that cannot be updated
-Nachricht nicht angezeigt, weil ich DisplayAlerts
auf false gesetzt habe. Die Arbeitsmappen sind mit entsprechenden Dateien in einem Ordner auf unserem Windows-Server verknüpft. Wenn die entsprechende Datei aus diesem Ordner gelöscht wird (was im Rahmen unseres Geschäftsflusses geschieht), bricht der Link. Kann die Warnung unterdrückt werden, wenn die Verbindung unterbrochen wird?
Außerdem verwende ich Excel 2010.
Ich habe eine temporäre Lösung gefunden, mit der ich diesen Job zumindest bearbeiten kann. Ich habe ein kurzes AutoIt-Skript geschrieben, das darauf wartet, dass das Fenster "Update-Links" angezeigt wird, und dann auf die Schaltfläche "Nicht aktualisieren" klickt. Code lautet wie folgt:
while 1
if winexists("Microsoft Excel","This workbook contains links to other data sources.") Then
controlclick("Microsoft Excel","This workbook contains links to other data sources.",2)
EndIf
WEnd
Bisher scheint das zu funktionieren. Ich würde wirklich gerne eine Lösung finden, die ausschließlich VBA ist, damit ich diese eigenständige Anwendung erstellen kann.
UPDATE:
Nachdem alle Details zusammengefasst und besprochen worden waren, habe ich zwei gute Stunden damit verbracht, die Optionen zu überprüfen, und dieses Update enthält alle i
s.
Zunächst führte ich eine saubere Installation von Office 2010 x86 auf der von VMWare betriebenen virtuellen Maschine mit Clean Win7 SP1 Ultimate x64 durch (dies ist eine übliche Routine für meine täglichen Testaufgaben, daher habe ich viele davon bereitgestellt).
Dann habe ich nur die folgenden Excel-Optionen geändert (d. H. Alle anderen Optionen bleiben nach der Installation erhalten):
Advanced > General > Ask to update automatic links
checked:Trust Center > Trust Center Settings... > External Content > Enable All...
(obwohl derjenige, der sich auf Datenverbindungen bezieht, für den Fall höchstwahrscheinlich nicht wichtig ist):Ich habe eine Arbeitsmappe nach C:\
-Vorschlägen in ihrer aktualisierten Antwort (die für Ihre Bequemlichkeit zur Verfügung gestellt wurde) erstellt und @Siddharth Rout
gestellt: https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Das verknüpfte Buch war dann delete, so dass der Link in der freigegebenen Mappe (sicher) nicht verfügbar ist.
Die oben genannte freigegebene Datei zeigt beim Öffnen (mit den oben aufgeführten Excel-Optionen) 2 Warnungen an - in der Reihenfolge des Erscheinens:
WARNUNG # 1
Nachdem ich auf Update
geklickt habe, bekam ich erwartungsgemäß einen weiteren:
WARNUNG # 2
Ich denke also, meine Testumgebung ist __variable (OP
s) ziemlich ähnlich. So weit, so gut, gehen wir endlich weiter
Jetzt versuche ich Schritt für Schritt alle möglichen Optionen, um das Bild klarer zu machen. Ich werde zur Vereinfachung nur relevante Codezeilen freigeben (vollständige Beispieldatei mit Code wird am Ende freigegeben).
1. Simple Application.Workbooks.Open
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Kein Wunder - dies erzeugt BEIDE Warnungen, wie beim manuellen Öffnen oben.
2. Application.DisplayAlerts = False
Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Dieser Code endet mit WARNING # 1, und eine Option (Update
Don't Update
), die angeklickt wird, erzeugt KEINE weiteren Warnungen, d. H. Application.DisplayAlerts = False
unterdrückt _/WARNING # 2.
3. Application.AskToUpdateLinks = False
Application.AskToUpdateLinks = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.AskToUpdateLinks = True
Im Gegensatz zu DisplayAlerts
endet dieser Code nur mit WARNING # 2, d. H. Application.AskToUpdateLinks = False
unterdrückt WARNING # 1.
4. Doppelt falsch
Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True
Anscheinend endet dieser Code mit der Unterdrückung von BEIDE WARNUNGEN.
5. UpdateLinks: = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False
Schließlich funktioniert diese 1-Zeilen-Lösung (ursprünglich von @brettdj
vorgeschlagen) auf dieselbe Weise wie Double False: NO WARNINGS werden angezeigt!
Abgesehen von einer guten Testpraxis und einem sehr wichtigen gelösten Fall (Ich kann mich jeden Tag mit solchen Problemen beschäftigen, wenn ich meine Arbeitsmappen an Dritte schicke, und jetzt bin ich vorbereitet), 2 weitere Dinge gelernt:
Vielen Dank an alle, die zur Lösung beigetragen haben, insbesondere OP, die die Frage gestellt haben. Hoffe, meine Untersuchungen und ausführlich beschriebenen Testschritte waren nicht nur für mich hilfreich.)
Beispieldatei mit den obigen Codebeispielen wird gemeinsam genutzt (viele Zeilen werden absichtlich kommentiert): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm
Originalantwort (getestet mit Excel 2007 mit bestimmten Optionen):
Dieser Code funktioniert gut für mich - er durchläuft ALLE Excel-Dateien, die mithilfe von Platzhaltern in der Variablen InputFolder
angegeben wurden:
Sub WorkbookOpening2007()
Dim InputFolder As String
Dim LoopFileNameExt As String
InputFolder = "D:\DOCUMENTS\" 'Trailing "\" is required!
LoopFileNameExt = Dir(InputFolder & "*.xls?")
Do While LoopFileNameExt <> ""
Application.DisplayAlerts = False
Application.Workbooks.Open (InputFolder & LoopFileNameExt)
Application.DisplayAlerts = True
LoopFileNameExt = Dir
Loop
End Sub
Ich habe es mit Büchern mit nicht verfügbaren externen Links versucht - keine Warnungen.
Beispieldatei: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm
Öffnen Sie den VBA-Editor von Excel und geben Sie diesen in das Direktfenster ein (siehe Screenshot).
Application.AskToUpdateLinks = False
Schließen Sie Excel und öffnen Sie Ihre Datei. Es wird Sie nicht erneut auffordern. Denken Sie daran, es zurückzusetzen, wenn Sie die Arbeitsmappe schließen. Andernfalls funktioniert es nicht für andere Arbeitsmappen.
Bildschirmfoto :
EDIT
Wenn Sie ihn also auf Ihren Code anwenden, wird Ihr Code so aussehen
Function getWorkbook(bkPath As String) As Workbook
Application.AskToUpdateLinks = False
Set getWorkbook = Workbooks.Open(bkPath, False)
Application.AskToUpdateLinks = True
End Function
NACHVERFOLGEN
Sigil, Der folgende Code funktioniert auch für Dateien mit fehlerhaften Links. Hier ist mein Testcode.
Test-Bedingungen
Sample1.xlsx
und Sample2.xlsx
und speichern Sie sie unter C:\
.A1
von Sample1.xlsx
diese Formel ='C:\[Sample2.xlsx]Sheet1'!$A$1
ein.Sample
aus. Sie werden feststellen, dass Sie keine Aufforderung erhalten.Code
Option Explicit
Sub Sample()
getWorkbook "c:\Sample1.xlsx"
End Sub
Function getWorkbook(bkPath As String) As Workbook
Application.AskToUpdateLinks = False
Set getWorkbook = Workbooks.Open(bkPath, False)
Application.AskToUpdateLinks = True
End Function
Excel 2016 Ich hatte ein ähnliches Problem, als ich eine Arbeitsmappe/Datei erstellte, und dann änderte ich die Namen, aber irgendwie wurde der alte Arbeitsmappenname beibehalten ... __ letzte Antwort dort ...
Gehen Sie zu DATA -> Edit Link -> Startup Prompt (unten). Wählen Sie dann die für Sie beste Option.
Ich wollte die Eingabeaufforderung unterdrücken, in der Sie gefragt werden, ob Sie Verknüpfungen zu einer anderen Arbeitsmappe aktualisieren möchten, wenn meine Arbeitsmappe manuell in Excel geöffnet wird (anstatt sie programmgesteuert über VBA zu öffnen). Ich habe versucht, Folgendes hinzuzufügen: Application.AskToUpdateLinks = False
als erste Zeile in meinem Auto_Open()
-Makro, aber das hat nicht funktioniert. Ich entdeckte jedoch, dass, wenn Sie es stattdessen in die Workbook_Open()
-Funktion im ThisWorkbook
-Modul einfügen, es hervorragend funktioniert - der Dialog wird unterdrückt, das Update wird jedoch immer noch im Hintergrund ausgeführt.
Private Sub Workbook_Open()
' Suppress dialog & update automatically without asking
Application.AskToUpdateLinks = False
End Sub
(Ich habe nicht genug Punkte, um einen Kommentar hinzuzufügen, aber ich möchte den Antworten hier etwas Klarheit verleihen.)
Application.AskToUpdateLinks = False ist wahrscheinlich nicht das, was Sie wollen.
Wenn der Wert auf False gesetzt ist, versucht MS Excel wird, die Verknüpfungen automatisch zu aktualisieren.
Die richtige Lösung, wenn Sie eine Datei öffnen möchten ohne, die Verknüpfungen zum Aktualisieren, sollte folgendermaßen lauten:
Workbook.Open (UpdateLinks: = 0)
Zugehöriger Link: Unterschied in AskToUpdateLinks = False und UpdateLinks: = 0
Hoffen Sie, etwas zusätzlichen Beitrag zur Lösung dieser Frage (oder eines Teils davon) zu leisten.
Dies funktioniert zum Öffnen einer Excel
-Datei von einer anderen. Eine Codezeile von Mr. Peter L. verwendet zur Änderung Folgendes:
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3
Dies ist in MSDS
. Der Effekt ist, dass einfach alles (ja, alles) ohne Warnung aktualisiert wird. Dies kann auch überprüft werden, wenn Sie ein Makro aufzeichnen.
In MSDS
verweist es auf MS Excel 2010
und 2013
. Ich denke, dass MS Excel 2016
auch dies abdeckt.
Ich habe MS Excel 2013
und habe eine ähnliche Situation wie dieses Thema. Ich habe also eine Datei (nennen Sie es A
) mit Workbook_Open
Ereigniscode, die immer auf der update links Prompt hängen bleibt. Ich habe eine andere Datei (nennen Sie es B
), die mit dieser verbunden ist, und Pivot Tables zwinge mich, die Datei A
zu öffnen, damit das Datenmodell geladen werden kann. Da ich die A
-Datei unbemerkt im Hintergrund öffnen möchte, verwende ich einfach die oben geschriebene Zeile mit einer Windows("A.xlsx").visible = false
und öffne, abgesehen von einer längeren Ladezeit, die A
-Datei aus der B
-Datei ohne Probleme oder Warnungen und vollständig aktualisiert.