Как запретить обновление ссылок?

Я пытаюсь написать script, который открывает много файлов Excel. Я получаю приглашение:

This workbook contains links to other data sources.

Я хочу, чтобы это сообщение не появлялось, поэтому мой script может просто автоматически просматривать все книги без необходимости нажимать 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

Однако сообщение все еще появляется. Как я могу его подавить?

EDIT: Похоже, что это сообщение подходит для книг, которые имеют неработающие ссылки; Я не видел сообщение This workbook contains one or more links that cannot be updated, потому что я установил DisplayAlerts в значение false. Рабочие книги связаны с эквивалентными файлами в папке на нашем сервере Windows, поэтому, когда соответствующий файл удаляется из этой папки (что происходит как часть нашего бизнес-потока), эта ссылка ломается. Можно ли подавить предупреждение при нарушении связи?

Кроме того, я использую Excel 2010.

Ответ 1

Я нашел временное решение, которое, по крайней мере, позволит мне обрабатывать эту работу. Я написал короткий AutoIt script, который ждет появления окна "Обновить ссылки", затем нажимает кнопку "Не обновлять". Код выглядит следующим образом:

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

UPDATE:

После того, как все детали были обобщены и обсуждены, я провела 2 прекрасных часа при проверке параметров, и это обновление должно расставить все i s.

Подготовка

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

Затем я изменил только следующие параметры Excel (т.е. все остальные остались как есть после установки):

  • Advanced > General > Ask to update automatic links отмечен:

Ask to update automatic links

  • Trust Center > Trust Center Settings... > External Content > Enable All... (хотя тот, который относится к Data Connections, скорее всего, не имеет значения для случая):

External Content

Предпосылки

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

Ручное открытие

Вышеупомянутый общий файл отображается при открытии (с указанными выше опциями Excel) 2 предупреждения - в порядке появления:

ПРЕДУПРЕЖДЕНИЕ # 1

This workbook contains links to other data sources

После нажатия на Update я ожидал получить другое:

ПРЕДУПРЕЖДЕНИЕ # 2

This workbook contains one or more links that cannot be updated

Итак, я полагаю, что моя тестовая среда теперь почти похожа на 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. Double False

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 вещи:

  • Параметры Excel имеют значение независимо от версии - особенно, когда мы приходим к решениям VBA.
  • Каждая проблема имеет короткое и элегантное решение - вместе с не очевидным и сложным. Это еще одно доказательство!)

Большое спасибо всем, кто внес свой вклад в решение, и особенно 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

Ответ 3

Откройте редактор VBA Excel и введите его в окне "Немедленное" (см. скриншот)

Application.AskToUpdateLinks = False 

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

ScreenShot

enter image description here

ИЗМЕНИТЬ

Таким образом, применив его к вашему коду, ваш код будет выглядеть следующим образом:

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

Followup

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

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

  • Создайте 2 новых файла. Назовите их Sample1.xlsx и Sample2.xlsx и сохраните их на C:\
  • В ячейке A1 of Sample1.xlsx введите эту формулу ='C:\[Sample2.xlsx]Sheet1'!$A$1
  • Сохранить и закрыть оба файла
  • Удалить Sample2.xlsx!!!
  • Откройте новую книгу и модуль вставьте этот код и запустите 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

Ответ 4

Я хотел бы подавить приглашение, которое спрашивает, хотите ли вы обновлять ссылки на другую книгу, когда моя книга открывается вручную в 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

Ответ 5

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

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

Ответ 6

Надеемся дать дополнительный вклад в решение этого вопроса (или его части).

Это будет работать для открытия файла 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 без проблем или предупреждений и полностью обновлен.

Ответ 7

(У меня недостаточно точек повторения, чтобы добавить комментарий, но я хочу внести ясность в ответы здесь)

Application.AskToUpdateLinks = False, вероятно, не то, что вы хотите.

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

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

Workbook.Open(UpdateLinks: = 0)

Ссылка по теме: Разница в AskToUpdateLinks = False и UpdateLinks: = 0