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 Update
każ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 updated
wiadomości, ponieważ ustawiłem DisplayAlerts
na 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.
Odpowiedzi:
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 :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):Warunki wstępne
Przygotowałem i umieściłem
C:\
w skoroszycie dokładnie zgodnie z@Siddharth Rout
sugestiami 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
Po kliknięciu
Update
spodziewałem się kolejnego:OSTRZEŻENIE 2
Tak więc, przypuszczam, że moje środowisko testowe jest teraz bardzo podobne do
OP
). Jak dotąd dobrze, w końcu przechodzimy doOtwarcie 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
Nic dziwnego - to generuje OBA ostrzeżenia, jak przy ręcznym otwieraniu powyżej.
2. Application.DisplayAlerts = False
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 = False
Pomija OSTRZEŻENIE # 2 .3. Application.AskToUpdateLinks = False
W przeciwieństwie do
DisplayAlerts
tego kod kończy się tylko OSTRZEŻENIEM # 2 , tj.Application.AskToUpdateLinks = False
Pomija OSTRZEŻENIE # 1 .4. Podwójne fałsz
Najwyraźniej ten kod kończy się pomijaniem OBU OSTRZEŻEŃ .
5. 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:
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
: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
źródło
Application.DisplayAlerts = False
nie wyłączy tych ostrzeżeń :)?Application.AskToUpdateLinks
w oknie bezpośrednim. Czy to już ustawione na fałsz, czy to prawda ...Otwórz edytor VBA programu Excel i wpisz to w okienku bezpośrednim (patrz zrzut ekranu)
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 :
EDYTOWAĆ
Więc stosując go do swojego kodu, twój kod będzie wyglądał następująco
FOLLOWUP
Sigil, Poniższy kod działa również na plikach z uszkodzonymi linkami. Oto mój kod testowy.
Test kondycji
Sample1.xlsx
iSample2.xlsx
i zapisać je naC:\
A1
zSample1.xlsx
wpisać ten wzór='C:\[Sample2.xlsx]Sheet1'!$A$1
Sample
. Zauważysz, że nie otrzymasz monitu.Kod
źródło
Application.DisplayAlerts = False
zostanie również dodany?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ę.
źródło
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 = False
jako pierwszą linię w moimAuto_Open()
makrze, ale to nie zadziałało. Odkryłem jednak, że jeśli umieścisz go zamiast tego wWorkbook_Open()
funkcji wThisWorkbook
module, działa świetnie - okno dialogowe jest wygaszone, ale aktualizacja nadal odbywa się cicho w tle.źródło
Workbook_Open()
zdarzenia dla każdego skoroszytu w moim zestawie docelowym.(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
źródło
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:
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ę.
źródło
Mam nadzieję, że wniosę dodatkowy wkład w rozwiązanie tego pytania (lub jego części).
To zadziała przy otwieraniu
Excel
pliku z innego. Linia kodu od pana Petera L. , dla zmiany, użyj następującego: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 doMS EXCEL 2010
i2013
. Myślę, żeMS EXCEL 2016
to też obejmuje.Mam
MS EXCEL 2013
i mam sytuację mniej więcej taką samą jak w tym temacie. Mam więc plik (nazwij goA
) zWorkbook_Open
kodem zdarzenia, który zawsze blokuje się w monicie o łącze aktualizacji . Mam inny plik (nazwij toB
) połączony z tym, a tabele przestawne zmuszają mnie do otwarcia pliku,A
aby można było załadować model danych. Ponieważ chcęA
cicho otwierać plik w tle, po prostu używam linii, którą napisałem powyżej, z aWindows("A.xlsx").visible = false
, i oprócz dłuższego czasu ładowania otwieramA
plik zB
pliku bez problemów i ostrzeżeń, w pełni zaktualizowany .źródło