Я пытаюсь написать 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.
Я нашел временное решение, которое, по крайней мере, позволит мне обрабатывать эту работу. Я написал короткий 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, однако, чтобы я мог сделать это автономным приложением.
UPDATE:
После того, как все детали были обобщены и обсуждены, я провела 2 прекрасных часа при проверке параметров, и это обновление должно расставить все i
s.
Прежде всего, я выполнил чистую установку 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...
(хотя тот, который относится к Data Connections, скорее всего, не имеет значения для случая):
Я подготовил и разместил в C:\
книгу в соответствии с предложениями @Siddharth Rout
в своем обновленном ответе (разделяемом для вашего удобства): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Связанная книга была тогда удалена, так что ссылка в общей книге недоступна (наверняка).
Вышеупомянутый общий файл отображается при открытии (с указанными выше опциями Excel) 2 предупреждения - в порядке появления:
ПРЕДУПРЕЖДЕНИЕ # 1
После нажатия на Update
я ожидал получить другое:
ПРЕДУПРЕЖДЕНИЕ # 2
Итак, я полагаю, что моя тестовая среда теперь почти похожа на OP
's). Пока все хорошо, мы наконец-то перейдем к
Теперь я попробую все возможные варианты шаг за шагом, чтобы сделать изображение прозрачным. Для простоты я буду использовать только соответствующие строки кода (полный файл с кодом будет совместно использоваться в конце).
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 вещи:
Большое спасибо всем, кто внес свой вклад в решение, и особенно 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
Application.DisplayAlerts = False
не отключит эти предупреждения :)
Откройте редактор VBA Excel и введите его в окне "Немедленное" (см. скриншот)
Application.AskToUpdateLinks = False
Закройте Excel и откройте файл. Он больше не подскажет вам. Помните reset, когда вы закрываете книгу, иначе она не будет работать и для других книг.
ScreenShot
ИЗМЕНИТЬ
Таким образом, применив его к вашему коду, ваш код будет выглядеть следующим образом:
Function getWorkbook(bkPath As String) As Workbook
Application.AskToUpdateLinks = False
Set getWorkbook = Workbooks.Open(bkPath, False)
Application.AskToUpdateLinks = True
End Function
Followup
Sigil, приведенный ниже код также работает с файлами со сломанными ссылками. Вот мой тестовый код.
Условия испытаний
Sample1.xlsx
и Sample2.xlsx
и сохраните их на C:\
A1
of Sample1.xlsx
введите эту формулу ='C:\[Sample2.xlsx]Sheet1'!$A$1
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 2016 У меня была похожая проблема, когда я создавал книгу/книгу, а затем менял имена, но каким-то образом старое имя книги было сохранено. После долгих поисков... ну, не нашел там окончательного ответа...
Перейдите в DATA → Edit Link → Startup Prompt (внизу), затем выберите лучший вариант для вас.
Я хотел бы подавить приглашение, которое спрашивает, хотите ли вы обновлять ссылки на другую книгу, когда моя книга открывается вручную в 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()
для каждой из книг в моем целевом наборе.
(У меня недостаточно точек повторения, чтобы добавить комментарий, но я хочу внести ясность в ответы здесь)
Application.AskToUpdateLinks = False, вероятно, не то, что вы хотите.
Если установлено значение False, то MS Excel будет пытаться автоматически обновлять ссылки, но просто не будет предлагать пользователю заранее, что-то вроде контринтуитивно.
Правильное решение, если вы хотите открыть файл без обновления ссылок, должно быть:
Workbook.Open(UpdateLinks: = 0)
Ссылка по теме: Разница в AskToUpdateLinks = False и UpdateLinks: = 0
Надеемся дать дополнительный вклад в решение этого вопроса (или его части).
Это будет работать для открытия файла 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
без проблем или предупреждений и полностью обновлен.