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


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

6 82

6 ответов:

обновление:

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

препараты

прежде всего, я выполнил чистую установку Office 2010 x86 на чистую виртуальную машину 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... (хотя тот, который относится к подключениям к данным, скорее всего, не важен для случая):

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. Приложение.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. Приложение.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:=Ложь

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

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

выводы

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

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

Application.AskToUpdateLinks = False 

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

скриншот:

enter image description here

EDIT

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

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
  3. сохраните и закройте оба файла
  4. Удалить Sample2.XLSX-файл!!!
  5. открыть a Новая книга и это модуль вставьте этот код и запустите 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

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

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

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

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

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

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

это будет работать для открытия из другого. Строка кода от Мистер Питер Л., для изменения, используйте следующую конструкцию:

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