Jak pominąć ostrzeżenie o linkach aktualizacji?

110

Próbuję napisać skrypt, który otwiera wiele plików Excela. Ciągle otrzymuję monit:

This workbook contains links to other data sources.

Chcę, aby ta wiadomość nie pojawiała się, aby mój skrypt mógł po prostu automatycznie przeglądać wszystkie skoroszyty bez konieczności klikania Don't Updatekażdego z nich. Obecnie używam następujących:

function getWorkbook(bkPath as string) as workbook

Application.EnableEvents=False
Application.DisplayAlerts=False
getWorkbook=Workbooks.Open(bkPath,updatelinks:=0,readonly:=false)

end function

Jednak komunikat nadal się pojawia. Jak mogę to stłumić?

EDYCJA: Wygląda na to, że ta wiadomość pojawia się w przypadku skoroszytów, które mają uszkodzone łącza; Nie widziałem This workbook contains one or more links that cannot be updatedwiadomości, ponieważ ustawiłem DisplayAlertsna fałsz. Skoroszyty są połączone z równoważnymi plikami w folderze na naszym serwerze Windows, więc gdy pasujący plik zostanie usunięty z tego folderu (co jest częścią naszego przepływu biznesowego), łącze zrywa się. Czy można pominąć ostrzeżenie, gdy łącze jest zerwane?

Używam również programu Excel 2010.

pieczęć
źródło
1
Z dyskusji z @SiddharthRout widzimy teraz, że przyczyną są różne ustawienia dla różnych wersji Excela: najprawdopodobniej używasz Excela 2010 lub nowszego (Siddharth Rout ma również 2010), podczas gdy ja używam 2007 i nie widzę żadnych ostrzeżeń, jeśli linki są OK. Przeprowadzimy więcej dochodzeń i wrócimy z działającym rozwiązaniem - mam taką nadzieję) Teraz wypróbuj odpowiedź Siddhartha Routa.
Peter L.
2
Moje głosy za bardzo ciekawą sprawą!
Peter L.
@PeterL. ponieważ nie otrzymujesz linków do aktualizacji, nawet gdy otwierasz plik ręcznie, myślę, że jest jakieś ustawienie, którego gdzieś mi brakuje. Przetestuję to w programie Excel 2007, zanim będę mógł to potwierdzić. :)
Siddharth Rout
Czy możesz opublikować próbkę pliku powodującego problem? Dobrze byłoby zobaczyć naturę linków
brettdj
@brettdj, to jest zastrzeżone, więc nie mogę opublikować całego pliku. Zbadam linki, aby zobaczyć, czy jest z nimi jakiś problem.
pieczęć

Odpowiedzi:

139

AKTUALIZACJA:

Po podsumowaniu i omówieniu wszystkich szczegółów, spędziłem 2 godziwe godziny na sprawdzaniu opcji, a ta aktualizacja ma dotknąć wszystkich i.

Przygotowania

Przede wszystkim wykonałem czystą instalację pakietu Office 2010 x86 na maszynie wirtualnej Clean Win7 SP1 Ultimate x64 obsługiwanej przez VMWare (jest to normalna procedura dla moich codziennych zadań testowych, więc mam ich wiele wdrożonych).

Następnie zmieniłem tylko następujące opcje programu Excel (tj. Wszystkie pozostałe pozostają bez zmian po instalacji):

  • Advanced > General > Ask to update automatic links sprawdzone :

Poproś o aktualizację automatycznych łączy

  • Trust Center > Trust Center Settings... > External Content > Enable All... (chociaż ten, który odnosi się do połączeń danych, najprawdopodobniej nie jest ważny w tym przypadku):

Treść zewnętrzna

Warunki wstępne

Przygotowałem i umieściłem C:\w skoroszycie dokładnie zgodnie z @Siddharth Routsugestiami zawartymi w jego zaktualizowanej odpowiedzi (udostępnionej dla Twojej wygody): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Powiązana książka została następnie usunięta , aby link w udostępnionym książka jest niedostępna (na pewno).

Otwieranie ręczne

Powyższy udostępniony plik pokazuje przy otwieraniu (mając wyżej wymienione opcje programu Excel) 2 ostrzeżenia - w kolejności ich występowania:

OSTRZEŻENIE # 1

Ten skoroszyt zawiera łącza do innych źródeł danych

Po kliknięciu Updatespodziewałem się kolejnego:

OSTRZEŻENIE 2

Ten skoroszyt zawiera co najmniej jedno łącze, którego nie można zaktualizować

Tak więc, przypuszczam, że moje środowisko testowe jest teraz bardzo podobne do OP). Jak dotąd dobrze, w końcu przechodzimy do

Otwarcie VBA

Teraz spróbuję krok po kroku wszystkich możliwych opcji, aby obraz był jasny. Dla uproszczenia udostępnię tylko odpowiednie wiersze kodu (kompletny przykładowy plik z kodem zostanie udostępniony na końcu).

1. Prosta aplikacja.Workbooks.Open

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"

Nic dziwnego - to generuje OBA ostrzeżenia, jak przy ręcznym otwieraniu powyżej.

2. Application.DisplayAlerts = False

Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True

Ten kod kończy się OSTRZEŻENIEM # 1 i każda kliknięta opcja ( Update/ Don't Update) NIE generuje żadnych dalszych ostrzeżeń, tj. Application.DisplayAlerts = FalsePomija OSTRZEŻENIE # 2 .

3. Application.AskToUpdateLinks = False

Application.AskToUpdateLinks = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.AskToUpdateLinks = True

W przeciwieństwie do DisplayAlertstego kod kończy się tylko OSTRZEŻENIEM # 2 , tj. Application.AskToUpdateLinks = FalsePomija OSTRZEŻENIE # 1 .

4. Podwójne fałsz

Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True

Najwyraźniej ten kod kończy się pomijaniem OBU OSTRZEŻEŃ .

5. UpdateLinks: = False

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False

Wreszcie, to 1-liniowe rozwiązanie (pierwotnie zaproponowane przez @brettdj) działa tak samo jak Double False: NIE są wyświetlane OSTRZEŻENIA !

Wnioski

Oprócz dobrej praktyki testowania i bardzo ważnego rozwiązanego przypadku (mogę napotykać takie problemy codziennie podczas wysyłania moich skoroszytów do innej firmy, a teraz jestem przygotowany), dowiedziałem się jeszcze 2 rzeczy:

  1. Opcje programu Excel MAJĄ znaczenie, niezależnie od wersji - zwłaszcza jeśli chodzi o rozwiązania VBA.
  2. Każdy problem ma krótkie i eleganckie rozwiązanie - razem z nieoczywistym i skomplikowanym. Jeszcze tylko jeden dowód!)

Bardzo dziękuję wszystkim, którzy przyczynili się do rozwiązania, a zwłaszcza OP, który zadał pytanie. Mam nadzieję, że moje badania i dokładnie opisane kroki testowe były pomocne nie tylko dla mnie)

Przykładowy plik z powyższymi przykładami kodu jest udostępniany (wiele linii jest celowo komentowanych): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Oryginalna odpowiedź (testowana pod kątem programu Excel 2007 z pewnymi opcjami):

Ten kod działa dobrze dla mnie - przechodzi przez WSZYSTKIE pliki Excela określone za pomocą symboli wieloznacznych w InputFolder:

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

Wypróbowałem to z książkami z niedostępnymi linkami zewnętrznymi - bez ostrzeżeń.

Przykładowy plik: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Peter L.
źródło
6
Application.DisplayAlerts = Falsenie wyłączy tych ostrzeżeń :)
Siddharth Rout
@SiddharthRout Sid Przysięgam, że ich nie widzę: mam plik z takimi linkami i widzę ostrzeżenie, otwierając go ręcznie. Z powyższym skryptem - bez ostrzeżeń) Może udostępniać wideo))) Excel 2007 - na wszelki wypadek.
Peter L.
Ok, spróbuj :) Otwórz dwa nowe skoroszyty. Zapisz je jako book1.xlsx i book2.xlsx. W komórce A1 księgi1 wpisz „=” i wskaż komórkę A1 książki2. Jeśli chcesz, wpisz coś w komórce A1 książki Book2, a następnie zamknij oba skoroszyty. Teraz otwórz book1 używając swojego kodu, a zobaczysz, że nadal otrzymujesz monit :)
Siddharth Rout
Również zanim wykonasz powyższe ćwiczenie, sprawdź ?Application.AskToUpdateLinksw oknie bezpośrednim. Czy to już ustawione na fałsz, czy to prawda ...
Siddharth Rout
2
+1 do brettdj. Twoi klienci muszą być zadowoleni, jeśli wszystkie Twoje raporty są podobne)
Ksenia
23

Otwórz edytor VBA programu Excel i wpisz to w okienku bezpośrednim (patrz zrzut ekranu)

Application.AskToUpdateLinks = False 

Zamknij program Excel, a następnie otwórz plik. Nie wyświetli się ponownie. Pamiętaj, aby zresetować go po zamknięciu skoroszytu, w przeciwnym razie nie będzie działać również dla innych skoroszytów.

Zrzut ekranu :

wprowadź opis obrazu tutaj

EDYTOWAĆ

Więc stosując go do swojego kodu, twój kod będzie wyglądał następująco

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function

FOLLOWUP

Sigil, Poniższy kod działa również na plikach z uszkodzonymi linkami. Oto mój kod testowy.

Test kondycji

  1. Utwórz 2 nowe pliki. Nazwij je Sample1.xlsxiSample2.xlsx i zapisać je naC:\
  2. W celi A1zSample1.xlsx wpisać ten wzór='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Zapisz i zamknij oba pliki
  4. Usuń Sample2.xlsx !!!
  5. Otwórz nowy skoroszyt, a jego moduł wklej ten kod i uruchom Sample. Zauważysz, że nie otrzymasz monitu.

Kod

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
Siddharth Rout
źródło
3
Ten kod działał dla mnie, Sid ( w XL2010 ), ponieważ wyłączył komunikat, ale zaktualizował łącze w tle. Użycie `Set getWorkbook = Workbooks.Open (bkPath, False)` pominie ostrzeżenie i nie spowoduje aktualizacji. Na testowanie xl03 i xl10
brettdj
1
Dzięki, Dave. :) Przy okazji, myślę, że miałeś na myśli xl03 i xl2007: P Również zredagowałem powyższy post, aby odzwierciedlić twoją sugestię.
Siddharth Rout
1
@brettdj bardzo dziękuję! Tego ranka spędziliśmy z Sidem dobrą godzinę, próbując rozgryźć sprawę. Czy powyższy kod pominie wszystkie ostrzeżenia dla dowolnej wersji programu Excel i sprawi, że linki będą aktualizowane po cichu? Jak mam zmodyfikować kod, aby UNIKAĆ aktualizacji? Przepraszam, jestem trochę zagubiony w opcjach, ale mam nadzieję, że wszystko wyjaśniłem poprawnie)
Peter L.
@brettdj i co będzie, jeśli Application.DisplayAlerts = Falsezostanie również dodany?
Peter L.
1
@sigil: Bez zobaczenia Twojego skoroszytu nie będę mógł komentować dalej. Przetestowałem swój kod w różnych warunkach i działa bezbłędnie. W rzeczywistości jest to właściwy sposób na wyeliminowanie tych alertów ...
Siddharth Rout,
6

Excel 2016 Miałem podobny problem, kiedy tworzyłem skoroszyt / plik, a potem zmieniłem nazwy, ale w jakiś sposób została zachowana stara nazwa skoroszytu. Po wielu googlach ... cóż, nie znalazłem tam żadnej ostatecznej odpowiedzi ...

Przejdź do DANE -> Edytuj łącze -> Monit o uruchomienie (na dole) Następnie wybierz najlepszą dla siebie opcję.

user2060451
źródło
3
To najlepsze rozwiązanie. Wpływa tylko na skoroszyt, dla którego dokonano tego wyboru i nie wymaga języka VBA.
Gaia
5

Chciałem pominąć monit z pytaniem, czy chcesz zaktualizować łącza do innego skoroszytu, gdy mój skoroszyt jest otwierany ręcznie w programie Excel (w przeciwieństwie do otwierania go programowo przez VBA). Próbowałem dodać: Application.AskToUpdateLinks = Falsejako pierwszą linię w moim Auto_Open()makrze, ale to nie zadziałało. Odkryłem jednak, że jeśli umieścisz go zamiast tego w Workbook_Open()funkcji w ThisWorkbookmodule, działa świetnie - okno dialogowe jest wygaszone, ale aktualizacja nadal odbywa się cicho w tle.

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub
Renwick Wright
źródło
Dobry pomysł; Niestety, ten projekt wymagał otwarcia zestawu skoroszytów, których zawartości nie mogłem modyfikować. Nie byłoby więc możliwości ustawienia Workbook_Open()zdarzenia dla każdego skoroszytu w moim zestawie docelowym.
pieczęć
3

(Nie mam wystarczającej liczby punktów rep, aby dodać komentarz, ale chcę tutaj wyjaśnić odpowiedzi)

Application.AskToUpdateLinks = Fałsz prawdopodobnie nie jest tym, czego chcesz.

Jeśli ustawione na Fałsz, MS Excel to zrobi próbować automatycznie aktualizować linki po prostu nie poprosi użytkownika wcześniej, jakoś intuicyjne.

Prawidłowym rozwiązaniem, jeśli chcesz otworzyć plik bez aktualizacji linków, powinno być:

Workbook.Open (UpdateLinks: = 0)

Powiązany odsyłacz: Różnica w AskToUpdateLinks = False i UpdateLinks: = 0

Donaldo Almazan
źródło
2

Znalazłem tymczasowe rozwiązanie, które przynajmniej pozwoli mi wykonać tę pracę. Napisałem krótki skrypt AutoIt, który czeka na pojawienie się okna „Aktualizuj łącza”, a następnie klika przycisk „Nie aktualizuj”. Kod jest następujący:

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

Jak dotąd wydaje się, że to działa. Naprawdę chciałbym jednak znaleźć rozwiązanie, które jest całkowicie VBA, aby móc uczynić z tego samodzielną aplikację.

pieczęć
źródło
2

Mam nadzieję, że wniosę dodatkowy wkład w rozwiązanie tego pytania (lub jego części).

To zadziała przy otwieraniu Excelpliku z innego. Linia kodu od pana Petera L. , dla zmiany, użyj następującego:

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3

To jest w MSDS. Efekt jest taki, że po prostu aktualizuje wszystko (tak, wszystko) bez ostrzeżenia. Można to również sprawdzić, jeśli nagrywasz makro.

W MSDS, odnosi się to do MS EXCEL 2010i 2013. Myślę, że MS EXCEL 2016to też obejmuje.

Mam MS EXCEL 2013i mam sytuację mniej więcej taką samą jak w tym temacie. Mam więc plik (nazwij go A) z Workbook_Openkodem zdarzenia, który zawsze blokuje się w monicie o łącze aktualizacji . Mam inny plik (nazwij to B) połączony z tym, a tabele przestawne zmuszają mnie do otwarcia pliku, Aaby można było załadować model danych. Ponieważ chcę Acicho otwierać plik w tle, po prostu używam linii, którą napisałem powyżej, z a Windows("A.xlsx").visible = false, i oprócz dłuższego czasu ładowania otwieram Aplik z Bpliku bez problemów i ostrzeżeń, w pełni zaktualizowany .

JDF
źródło