Как подавить обновление ссылки предупреждение?
Я пытаюсь написать скрипт, который открывает много файлов 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 ответов:
обновление:
после того, как все детали обобщены и обсуждены, я потратил 2 справедливых часа на проверку опций, и это обновление должно поставить все точки
is.препараты
прежде всего, я выполнил чистую установку Office 2010 x86 на чистую виртуальную машину 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. Приложение.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 вещи узнали:
- параметры Excel имеют значение, независимо от версии-особенно когда мы приходим к решениям VBA.
- каждая проблема имеет короткое и элегантное решение-вместе с не очевидным и сложным. Еще одно доказательство этого!)
большое спасибо всем, кто внес свой вклад в решение, и особенно ОП, кто поднял вопрос. Надеюсь, что мои исследования и тщательно описанные шаги тестирования были полезны не только для меня)
образец файла с приведенными выше примерами кода является общим (многие строки комментируются намеренно):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, а затем откройте файл. Это не подскажет вам снова. Не забудьте сбросить его при закрытии книги иначе он не будет работать для других книг, а также.
скриншот:
EDIT
так что применяя его к вашему коду, ваш код будет выглядеть так это
Function getWorkbook(bkPath As String) As Workbook Application.AskToUpdateLinks = False Set getWorkbook = Workbooks.Open(bkPath, False) Application.AskToUpdateLinks = True End Functionпродолжение
Sigil, приведенный ниже код работает и с файлами со сломанными ссылками. Вот мой тестовый код.
Условия Испытаний
- создать 2 новых файла. Назовите их
Sample1.xlsxиSample2.xlsxи сохранить их наC:\- в ячейке
A1наSample1.xlsxвведите эту формулу='C:\[Sample2.xlsx]Sheet1'!$A- сохраните и закройте оба файла
- Удалить Sample2.XLSX-файл!!!
- открыть 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файл без проблем или предупреждений, и полностью обновлен.




