Как подавить предупреждение о ссылках на обновления?

110

Я пытаюсь написать сценарий, который открывает много файлов 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 = False

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 = False

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: = False

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

Наконец, это однострочное решение (первоначально предложенное @brettdj) работает так же, как Double False: НИКАКИХ ПРЕДУПРЕЖДЕНИЙ не отображаются!

Выводы

За исключением хорошей практики тестирования и очень важного решенного случая (я могу сталкиваться с такими проблемами каждый день, отправляя свои книги третьим лицам, и теперь я подготовлен), я узнал еще 2 вещи:

  1. Параметры Excel ДЕЙСТВУЮТ независимо от версии, особенно когда речь идет о решениях VBA.
  2. У каждой проблемы есть короткое и изящное решение - вместе с неочевидным и сложным. Еще одно тому доказательство!)

Большое спасибо всем, кто внес свой вклад в решение, и особенно OP, который поднял вопрос. Надеюсь, мои исследования и подробное описание шагов тестирования были полезны не только для меня)

Общий доступ к файлу с примерами кода выше (многие строки намеренно прокомментированы): 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 Сид Клянусь, я их не вижу: у меня есть файл с такими ссылками, и я вижу предупреждение при открытии его вручную. С приведенным выше скриптом - без предупреждений) Могу поделиться видео для вас))) Excel 2007 - на всякий случай.
Питер Л.
Хорошо, попробуйте это :) Откройте две новые книги. Сохраните их как book1.xlsx и book2.xlsx. В ячейке A1 книги book1 введите «=» и укажите им на ячейку A1 книги 2. Введите что-нибудь в ячейку A1 книги 2, если хотите, а затем закройте обе книги. Теперь откройте book1, используя свой код, и вы увидите, что все еще получаете приглашение :)
Siddharth Rout
Также перед тем, как запустить вышеупомянутое упражнение, проверьте ?Application.AskToUpdateLinksокно немедленного выполнения. Это уже установлено на false или это правда ...
Siddharth Rout
2
+1 к brettdj. Ваши клиенты должны быть счастливы, если все ваши отчеты будут одинаковыми)
Ксения
23

Откройте редактор VBA в Excel и введите это в непосредственном окне (см. Снимок экрана)

Application.AskToUpdateLinks = False 

Закройте Excel, а затем откройте свой файл. Больше не будет. Не забудьте сбросить его при закрытии книги, иначе он не будет работать и для других книг.

Скриншот :

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

РЕДАКТИРОВАТЬ

Итак, применив его к вашему коду, ваш код будет выглядеть так

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

СЛЕДОВАТЬ ЗА

Sigil, приведенный ниже код работает и с файлами с битыми ссылками. Вот мой тестовый код.

Условия испытаний

  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
Этот код работал у меня, Сид ( в xl2010 ), потому что он отключил сообщение, но обновил ссылку в фоновом режиме. Использование `Set getWorkbook = Workbooks.Open (bkPath, False)` подавляет предупреждение, а не запускает обновление. На тестирование xl03 и xl10
brettdj
1
Спасибо, Дэйв. :) Кстати, я думаю, вы имели в виду xl03 и xl2007: P Также я отредактировал сообщение выше, чтобы отразить ваше предложение.
Siddharth Rout
1
@brettdj большое спасибо! В то утро мы провели с Сидом добрый час, пытаясь разобраться в этом деле. Итак, будет ли приведенный выше код подавлять все предупреждения для любой версии Excel и автоматически обновлять ссылки ? И как мне изменить код, чтобы ИЗБЕГАТЬ обновления? Извините, я немного потерялся в вариантах, но надеюсь, что я все правильно объяснил)
Питер Л.
@brettdj, а что будет, если тоже добавят Application.DisplayAlerts = False?
Питер Л.
1
@sigil: Я не смогу комментировать дальше, не увидев вашу книгу. Я протестировал свой код в разных условиях, и он работает безупречно. Фактически, это правильный способ подавить эти предупреждения ...
Сиддхарт Роут
6

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

Перейдите в DATA -> Edit Link -> Startup Prompt (внизу), затем выберите лучший вариант для вас.

user2060451
источник
3
Это лучшее решение. Это влияет только на книгу, для которой сделан этот выбор, и не требует никакого VBA.
Gaia
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 = False, вероятно, не то, что вам нужно.

Если установлено значение False, MS Excel будет пытаться автоматически обновить ссылки он просто не предложит пользователю заранее, Сорта нелогичным.

Правильное решение, если вы хотите открыть файл без обновления ссылок, должно быть:

Workbook.Open (UpdateLinks: = 0)

Связанная ссылка: Разница в AskToUpdateLinks = False и 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), связанный с этим, и сводные таблицы заставляют меня открыть файл, Aчтобы можно было загрузить модель данных. Поскольку я хочу открыть Aфайл в фоновом режиме, я просто использую строку, которую написал выше, с символом Windows("A.xlsx").visible = false, и, помимо большего времени загрузки, я открываю Aфайл из Bфайла без проблем или предупреждений и полностью обновляю .

JDF
источник