Как подавить обновление ссылки предупреждение?
Я пытаюсь написать скрипт, который открывает много файлов 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 справедливых часа на проверку опций, и это обновление должно поставить все точки
i
s.препараты
прежде всего, я выполнил чистую установку 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
файл без проблем или предупреждений, и полностью обновлен.