Як придушити попередження про оновлення посилань?


109

Я намагаюся написати сценарій, який відкриває багато файлів Excel. Я продовжую отримувати підказку:

This workbook contains links to other data sources.

Я хочу, щоб це повідомлення не з’являлося, щоб мій сценарій міг автоматично переходити через усі робочі зошити, не потребуючи натискання Don't Updateна кожне. В даний час я використовую наступне:

function getWorkbook(bkPath as string) as workbook

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

end function

Однак повідомлення все ще з’являється. Як я можу це придушити?

РЕДАКТУВАННЯ: Схоже, це повідомлення підходить для робочих зошитів, у яких порушені зв’язки; Я не бачив This workbook contains one or more links that cannot be updatedповідомлення, тому що встановив DisplayAlertsзначення false. Робочі книги пов’язані з еквівалентними файлами в папці на нашому сервері Windows, тому, коли відповідний файл буде видалений із цієї папки (що відбувається як частина нашого бізнес-потоку), посилання розривається. Чи можливо придушити попередження, коли посилання розірвано?

Також я використовую Excel 2010.


1
З обговорення з @SiddharthRout ми бачимо, що зараз причина в різних налаштуваннях для різних версій Excel: швидше за все, ви використовуєте Excel 2010 або новішу версію (також у Siddharth Rout є 2010), тоді як я використовую 2007 і не бачу жодних попереджень, якщо посилання в порядку. Ми проведемо ще кілька розслідувань і повернемося до робочого рішення - сподіваюся, що так) Тепер спробуйте відповідь Сіддхарта Рута.
Пітер Л.

2
Моя заява за дуже цікавий випадок!
Пітер Л.

@PeterL. оскільки ви не отримуєте посилання на оновлення, навіть коли ви відкриваєте файл вручну, я думаю, є налаштування, яке я десь відсутній. Дозвольте перевірити його в Excel 2007, перш ніж я можу підтвердити. :)
Siddharth Rout

Чи можете ви опублікувати зразок файлу проблеми? Було б добре побачити природу посилань
brettdj

@brettdj, це власниця, тому я не можу опублікувати весь файл. Я досліджую посилання, щоб побачити, чи є з ними якась проблема.
sigil

Відповіді:


139

ОНОВЛЕННЯ:

Після того як всі деталі були узагальнені та обговорені, я витратив 2 справедливі години на перевірку параметрів, і це оновлення має розставити крапки i.

Підготовка

Перш за все, я здійснив чисту установку Office 2010 x86 на віртуальну машину Clean Win7 SP1 Ultimate x64, що працює на VMWare (це звичайна рутина для моїх щоденних тестових завдань, тому у мене багато з них розгорнуто).

Потім я змінив лише наступні параметри Excel (тобто всі інші залишилися як після встановлення):

  • Advanced > General > Ask to update automatic links перевірено :

Попросіть оновити автоматичні посилання

  • Trust Center > Trust Center Settings... > External Content > Enable All... (хоча той, який стосується підключення до даних, швидше за все, не важливий для випадку):

Зовнішній зміст

Передумови

Я підготував та розмістив у C:\робочій книжці точно відповідно до @Siddharth Routпропозицій у його оновленій відповіді (поділився для вашої зручності): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Пов’язану книгу потім видалили, щоб посилання було поділено книга недоступна (точно).

Ручне відкриття

Вищезазначений загальнодоступний файл показує при відкритті (маючи вищеперелічені параметри Excel) 2 попередження - у порядку появи:

ПОПЕРЕДЖЕННЯ №1

Цей робочий зошит містить посилання на інші джерела даних

Після натискання на кнопку Updateя очікував ще одного:

ПОПЕРЕДЖЕННЯ №2

Ця робоча книга містить одне або більше посилань, які неможливо оновити

Отже, я гадаю, що моє тестувальне середовище зараз майже схоже на OP's) Поки що так добре, ми нарешті переходимо

Відкриття VBA

Тепер я спробую всі можливі варіанти крок за кроком, щоб зробити картинку зрозумілою. Я поділюся лише відповідними рядками коду для простоти (в кінці буде надано загальний зразок з кодом).

1. Просте додаток. Робочі книги. Відкрийте

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

Не дивно - це створює НАДІБНІ застереження, як для ручного відкриття вище.

2. Application.DisplayAlerts = Неправильно

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

Цей код закінчується ПОПЕРЕДЖЕННЯ # 1 , і будь-який варіант клацнув ( Update/ Don't Update) не виробляє додаткові попередження, тобто Application.DisplayAlerts = Falseпригнічує ПОПЕРЕДЖЕННЯ # 2 .

3. Application.AskToUpdateLinks = Неправильно

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

Навпаки DisplayAlerts, цей код закінчується лише ПОПЕРЕДЖЕННЯм №2 , тобто Application.AskToUpdateLinks = Falseпригнічує ПОПЕРЕДЖЕННЯ №1 .

4. Подвійний помилковий

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

Мабуть, цей код закінчується придушенням БОТИХ ПОПЕРЕДЖЕНЬ .

5. UpdateLinks: = Неправдиво

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

Нарешті, це однорядкове рішення (спочатку запропоноване @brettdj) працює так само, як і подвійне помилкове: НЕ відображаються ПОПЕРЕДЖЕННЯ !

Висновки

Окрім належної практики тестування та дуже важливого вирішеного випадку (я можу щодня стикатися з такими проблемами під час надсилання своїх робочих зошитів третій стороні, і тепер я готовий), ще 2 речі вивчені:

  1. Параметри Excel НЕ мають значення, незалежно від версії - особливо, коли ми підходимо до рішень VBA.
  2. Кожна неприємність має коротке та елегантне рішення - разом із не очевидним та складним. Ще один доказ цього!)

Дуже дякую всім, хто сприяв вирішенню, і особливо ОП, які порушили питання. Сподіваюсь, мої дослідження та детально описані кроки тестування були корисними не лише для мене)

Зразковий файл із наведеними вище зразками коду надається спільним (багато рядків коментується навмисно): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Оригінальна відповідь (перевірена для Excel 2007 з певними параметрами):

Цей код добре працює для мене - він проходить через ВСІ файли Excel, вказані за допомогою підстановок у 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

Я спробував це з книгами з недоступними зовнішніми посиланнями - без попереджень.

Приклад файлу: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm


6
Application.DisplayAlerts = Falseне вимкне ці попередження :)
Siddharth Rout

@SiddharthRout Sid Клянусь, я їх не бачу: у мене є файл із такими посиланнями і під час відкриття його вручну відкриваю попередження. З вищевказаним сценарієм - без попереджень) Може поділитися відео для вас))) Excel 2007 - про всяк випадок.
Пітер Л.

Ок, спробуйте це :) Відкрийте дві нові робочі зошити. Збережіть їх як book1.xlsx та book2.xlsx. У комірці A1 книги1 введіть "=" і вкажіть її на клітинку A1 книги Book2. Введіть щось у комірку А1 Book2, якщо бажаєте, а потім закрийте обидві робочі зошити. Тепер відкрийте book1, використовуючи свій код, і ви побачите, що ви все одно отримаєте підказку :)
Siddharth Rout

Також перед тим, як запустити вищевказану вправу, перевірте ?Application.AskToUpdateLinksу вікні Негайне. Це вже встановлено на false або це правда ...
Siddharth Rout

2
+1 до brettdj. Ваші клієнти повинні бути задоволені, якщо всі ваші звіти схожі)
Ксенія,

22

Відкрийте редактор VBA в Excel і введіть його у негайне вікно (див. Знімок екрана)

Application.AskToUpdateLinks = False 

Закрийте Excel і відкрийте файл. Це не підкаже вас знову. Не забудьте скинути його, коли закриєте робочу книжку, інакше вона не працюватиме й для інших робочих книжок.

Екран екрану :

введіть тут опис зображення

EDIT

Тож застосувавши його до свого коду, ваш код буде виглядати приблизно так

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

СЛІДУВАТИ

Сигіл. Код нижче працює і для файлів із зламаними посиланнями. Ось мій тестовий код.

Умови випробувань

  1. Створіть 2 нових файли. Назвіть їх Sample1.xlsxі Sample2.xlsxі зберегти їх наC:\
  2. В осередку A1з Sample1.xlsx, введіть цю формулу='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Збережіть і закрийте обидва файли
  4. Видалити Sample2.xlsx !!!
  5. Відкрийте нову робочу книжку, і модуль вставте цей код і запустіть Sample. Ви помітите, що не отримаєте підказку.

Код

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

3
Цей код працював для мене Sid ( у xl2010 ) тим, що він відключив повідомлення, але оновив посилання у фоновому режимі. Використання "Set getWorkbook = Workbooks.Open (bkPath, False)" буде придушувати попередження, а не запускати оновлення. На тестування xl03 та xl10
brettdj

1
Дякую, Дейв. :) До речі, я думаю, ви мали на увазі xl03 та xl2007: P Також я редагував вищезгаданий пост, щоб відобразити вашу пропозицію.
Siddharth Rout

1
@brettdj дуже дякую! Ми провели добру годину з Сідом того ранку, намагаючись з'ясувати випадок. Отже, чи приведений вище код придушить усі попередження для будь-якої версії Excel і зробить посилання тихо оновленими ? І як я можу змінити код на оновлення AVOID? Вибачте, я трохи розгубився у варіантах, але сподіваюся, що я все правильно пояснив)
Пітер Л.

@brettdj, а що буде, якщо Application.DisplayAlerts = Falseбуде додано також?
Пітер Л.

1
@sigil: Без перегляду вашої робочої книги я не зможу коментувати далі. Я перевірив свій код в різних умовах, і він працює бездоганно. Насправді це правильний спосіб придушити ці сповіщення ...
Siddharth Rout

6

У Excel 2016 у мене була подібна проблема, коли я створив робочу книгу / файл, а потім змінив імена, але якось збереглося старе ім'я робочої книги. Після багатьох гуглів ... ну, я не знайшов жодної остаточної відповіді ...

Перейдіть до DATA -> Edit Link -> Підказка запуску (внизу). Потім виберіть найкращий варіант для вас.


3
Це найкраще рішення. Це впливає лише на робочу книжку, для якої зроблено цей вибір, і вона не вимагає ніякої VBA.
Гая

5

Я хотів придушити підказку, яка запитує, чи бажаєте ви оновити посилання на іншу робочу книжку, коли моя робоча книга відкривається в Excel вручну (на відміну від відкриття програмно через VBA). Я спробував включити: Application.AskToUpdateLinks = Falseяк перший рядок у Auto_Open()макросі, але це не спрацювало. Однак я виявив, що якщо ви поставите його замість Workbook_Open()функції у ThisWorkbookмодулі, він працює блискуче - діалогове вікно пригнічується, але оновлення все ще відбувається безшумно на задньому плані.

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub

Гарна ідея; на жаль, цей проект вимагав, щоб я відкрив набір робочих зошитів, зміст яких я не зміг змінити. Тож не було б способу встановити Workbook_Open()подію для кожної з робочих книжок у моєму цільовому наборі.
сігіл

3

(У мене недостатньо точок повторень, щоб додати коментар, але я хочу додати трохи ясності у відповідях тут)

Application.AskToUpdateLinks = Невірно, мабуть, не те, що потрібно.

Якщо значення БРЕХНЯ, то MS Excel буде намагатися автоматично відновити посилання він просто не запропонує користувачеві заздалегідь, Сорти нелогічним.

Правильне рішення, якщо ви хочете відкрити файл без оновлення посилань, має бути:

Робоча книга. Відкрийте (UpdateLinks: = 0)

Пов'язане посилання: Різниця в AskToUpdateLinks = Неправдиві та UpdateLinks: = 0


2

Я знайшов тимчасове рішення, яке хоча б дозволить мені обробити цю роботу. Я написав короткий сценарій AutoIt, який чекає появи вікна "Оновити посилання", після чого натискає кнопку "Не оновлювати". Код такий:

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

Поки це, здається, працює. Я дуже хотів би знайти рішення, яке повністю VBA, щоб я міг зробити це окремим додатком.


2

Сподіваюся дати додатковий внесок у вирішення цього питання (або його частини).

Це буде працювати для відкриття Excelфайлу з іншого. Рядок коду від пана Петра Л. для зміни використовуйте наступне:

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

Це в MSDS. Ефект полягає в тому, що він просто оновлює все (так, все) без попередження. Це також можна перевірити, якщо ви записуєте макрос.

В MSDS, це посилається на це MS EXCEL 2010і 2013. Я думаю, що MS EXCEL 2016це також охоплювало.

У мене є MS EXCEL 2013, і у мене ситуація майже така ж, як у цій темі. Тож у мене є файл (зателефонуйте A) з Workbook_Openкодом події, який завжди застрягає у запиті на посилання оновлення . У мене з цим Bпідключений ще один файл (називайте його ), і Pivot Tables змушує мене відкрити файл, Aщоб модель даних могла бути завантажена. Оскільки я хочу відкрити Aфайл безшумно у фоновому режимі, я просто використовую рядок, який я написав вище, з a Windows("A.xlsx").visible = false, і, крім більшого часу завантаження, відкриваю Aфайл із Bфайлу без проблем і попереджень, і повністю оновлюю .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.