Прежде чем разобрать причины ошибки разрыва связей, не лишним будет разобраться что такое вообще связи в Excel и откуда они берутся. Если все это Вам известно - можете пропустить этот раздел :)
- Что такое связи в Excel и как их создать
- Как разорвать/удалить связи
- Что делать, если связи не разрываются
Иногда при работе с различными отчетами приходится создавать связи с другими книгами(отчетами). Чаще всего это используется в функциях вроде ВПР
или
[Продажи 2018.xlsx] - обозначает книгу, в которой итоговое значение. Такие книги так же называют источникамиОтчет - имя листа в этой книге$A:$F и$A1 - непосредственно ячейка или диапазон со значениями
Если закрыть книгу, на которую была создана такая ссылка, то ссылка сразу изменяется и принимает более "длинный" вид:
='C:\Users\Дмитрий\Desktop\[Продажи 2018.xlsx]Отчет'!$A1
Предположу, что большинство такими ссылками не удивишь. Такие ссылки так же принято называть связыванием книг. Поэтому как только создается такая ссылка на вкладке
Если нажать
Так же изменение связей доступно непосредственно из вкладки
Как правило связи редко нужны на продолжительное время, т.к. они неизбежно увеличивают размер файла, особенно, если связей много. Поэтому чаще всего связь создается только для единовременно получения данных из другой книги. Исключениями являются случаи, когда связи делаются на общий файл, который ежедневного изменяется и дополняется различными сотрудниками и подразделениями, а в итоговом файле необходимо использовать именно актуальные данные этого файла.
Если решили разорвать связь, необходимо перейти на вкладку
Выделить нужные связи и нажать
Так же связи внутри формул разрываются, если формулы просто заменить значениями -выделяем нужные ячейки -копируем их -не снимая выделения жмем
Более подробно про замену формул значениями можно узнать из статьи: Как удалить в ячейке формулу, оставив значения?
Но иногда возникают ситуации, когда вроде все формулы во всех ячейках уже заменены на значения, но запрос на обновление каких-то связей все равно появляется. В этом случае есть парочка рекомендаций для поиска и удаления этих мифических связей:
- проверьте нет ли каких-либо связей в именованных диапазонах:
нажмите сочетание клавишCtrl +F3 или перейдите на вкладку Формулы(Formulas) -Диспетчер имен(Name Manager)
Читать подробнее про именованные диапазоны
Если в каком-либо имени есть ссылка с полным путем к какой-то книге(вроде такого'[Продажи 2018.xlsx]Отчет'!$A1 ), то такое имя надо либо изменить, либо удалить. Кстати, некоторые имена в итоге могут выдавать ошибку#ССЫЛКА! - к ним тоже стоит присмотреться. Имена с ошибками ничего хорошего как правило не делают.(#REF!)
Настоятельно рекомендую перед удалением имен создать резервную копию файла, т.к. неверное удаление таких имен может повлечь неправильную работу файла даже в случае, если сами ссылки возвращали в итоге ошибочное значение. - если удаление лишних имен не дает эффекта - проверьте условное форматирование:
вкладкаГлавная -(Home) Условное форматирование -(Conditional formatting) Управление правилами . В выпадающем списке проверить каждый лист и условия в нем:(Manage Rules)
Может случиться так, что условие было создано с использованием ссылки на другие книги. Как правило Excel запрещает это делать, но если ссылка будет внутри какого-то именованного диапазона - то диапазон такой можно будет применить в УФ, но после его удаления в самом УФ это имя все равно остается и генерирует ссылку на файл-источник. Такие условия можно удалять без сомнений - они все равно уже не выполняются как положено и лишь создают "пустую" связь. - Так же не помешает проверить наличие лишних ссылок и среди проверки данных(Что такое проверка данных). Как правило связи могут быть в проверке данных с типом Список. Но как их отыскать, если проверка данных распространена на множество ячеек?
Находим все ячейки с проверкой данных: выделяем одну любую ячейку на листе -вкладкаГлавная -группа(Home) Редактирование -(Editing) Найти и выделить -(Find & Select) Выделить группу ячеек . Отмечаем(Go to Special) Проверка данных -(Data validation) Всех . Жмем Ок. После этого можно выделить все эти ячейки каким-либо цветом, чтобы удобнее было потом просматривать. Но такой метод выделит ВСЕ ячейки с проверками данных, а не только ошибочные.(All)
Конечно, если вариантов кроме как найти руками нет и ячеек немного – просто заходим в проверку данных каждой ячейки(выделяем эту ячейку -вкладкаДанные -(Data) Проверка данных ) и смотрим, есть ли там проблемная формула со ссылками на другие книги.(Data validation)
Можно поступить более кардинально – после того как выделили все ячейки с проверкой данных идем на вкладкуДанные -(Data) Проверка данных и для всех ячеек в поле(Data validation) Тип данных выбираем(Allow) Любое значение . Это удалит все формулы из проверки данных всех ячеек.(Any value)
Но если ни удаление всех проверок данных, ни проверка каждой ячейки не подходит - я предлагаю коротенький код, который отыщет все такие ссылки быстрее и сэкономит время:Option Explicit '--------------------------------------------------------------------------------------- ' Author : The_Prist(Щербаков Дмитрий) ' Профессиональная разработка приложений для MS Office любой сложности ' Проведение тренингов по MS Excel ' https://www.excel-vba.ru ' info@excel-vba.ru ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' Purpose: '--------------------------------------------------------------------------------------- Sub FindErrLink() 'надо посмотреть в Данные -Изменить связи ссылку на файл-иточник 'и записать сюда ключевые слова в нижнем регистре(часть имени файла) 'звездочка просто заменяет любое кол-во символов, чтобы не париться с точным названием Const sToFndLink$ = "*продажи 2018*" Dim rr As Range, rc As Range, rres As Range, s$ 'определяем все ячейки с проверкой данных On Error Resume Next Set rr = ActiveSheet.UsedRange.SpecialCells(xlCellTypeAllValidation) If rr Is Nothing Then MsgBox "На активном листе нет ячеек с проверкой данных", vbInformation, "www.excel-vba.ru" Exit Sub End If On Error GoTo 0 'проверяем каждую ячейку на предмет наличия связей For Each rc In rr 'на всякий случай пропускаем ошибки - такое тоже может быть 'но наши связи должны быть без них и они точно отыщутся s = "" On Error Resume Next s = rc.Validation.Formula1 On Error GoTo 0 'нашли - собираем все в отдельный диапазон If LCase(s) Like sToFndLink Then If rres Is Nothing Then Set rres = rc Else Set rres = Union(rc, rres) End If End If Next 'если связь есть - выделяем все ячейки с такими проверками данных If Not rres Is Nothing Then rres.Select ' rres.Interior.Color = vbRed 'если надо выделить еще и цветом End If End Sub
Чтобы правильно использовать приведенный код, необходимо скопировать текст кода выше, перейти в редактор VBA( Alt +F11 ) -создать стандартный модуль(Insert -Module) и в него вставить скопированный текст. После чего вызвать макросы(Alt +F8 или вкладкаРазработчик -Макросы ), выбратьFindErrLink и нажать выполнить.
Есть пара нюансов:- Прежде чем искать ненужную связь необходимо определить её ссылку:
Данные -группа(Data) Запросы и подключения -(Queries & Coonections) Изменить связи . Запомнить имя файла и записать в этой строке внутри кавычек:(Edit Links)
Const sToFndLink$ = "*продажи 2018*"
Имя файла можно записать не полностью, все пробелы и другие символы можно заменить звездочкой дабы не ошибиться. Текст внутри кавычек должен быть в нижнем регистре. Например, на картинках выше есть связь с файлом"Продажи 2018.xlsx" , но я внутри кода записал"*продажи 2018*" - будет найдена любая связь, в имени которой есть"продажи 2018" . - Код ищет проверки данных только на активном листе
- Код только выделяет все найденные ячейки(обычное выделение), он ничего сам не удаляет
- Если надо подсветить ячейки цветом - достаточно убрать апостроф(') перед строкой
rres.Interior.Color = vbRed 'если надо выделить еще и цветом
- Прежде чем искать ненужную связь необходимо определить её ссылку:
Как правило после описанных выше действий лишних связей остаться не должно. Но если вдруг связи остались и найти Вы их никак не можете или по каким-то причинам разорвать связи не получается(например, лист со связью защищен)- можно пойти совершенно иным путем. Действует этот рецепт только для файлов новых форматов Excel 2007 и выше (если проблема с файлом более старого формата - можно пересохранить в новый формат):
- Обязательно делаем резервную копию файла, связи в котором никак не хотят разрываться
- Открываем файл при помощи любого архиватора(WinRAR отлично справляется, но это может быть и другой, работающий с форматом ZIP)
- В архиве перейти в папку
xl ->externalLinks - Сколько связей содержится в файле, столько файлов вида
externalLink1.xml и будет внутри. Файлы просто пронумерованы и никаких сведений о том, к какому конкретному файлу относится эта связь на поверхности нет. Чтобы узнать какой файл .xml к какой связи относится надо зайти в папку "_rels" и открыть там каждый из имеющихся файлов видаexternalLink1.xml.rels . Там и будет содержаться имя файла-источника. - Если надо удалить только связь на конкретный файл - удаляем только те
externalLink1.xml.rels иexternalLink1.xml , которые относятся к нему. Если удалить надо все связи - удаляем все содержимое папкиexternalLinks - Закрываем архив
- Открываем файл в Excel. Появится сообщение об ошибке вроде "Ошибка в части содержимого в Книге ...". Соглашаемся. Появится еще одно окно с перечислением ошибочного содержимого. Нажимаем закрыть.
После этого связи должны быть удалены.
Если и это не помогло - скорее всего "битая" связь связана с ошибкой самого файла и лучшим решением будет перенести все данные в новый файл.
Так же см.:
Найти скрытые связи
Оптимизировать книгу
Отличная статья! Офис 2010 - помогло через WinRAR, спасибо!
Спасибо, статья помогла!
В качестве благодарности - нашел способ найти ячейки с кривыми проверками (как раз мой случай оказался) без программы.
Надо нажать Проверка Данных / Обвести неверные данные
Так как все связи битые - то как раз эти ячейки и будут выделены
Еще раз спасибо
Большое спасибо автору. Много лет пытался найти причину неразрыва связи - и вот нашёл )).
Ещё раз большое спасибо.
У меня не сработал Макров (не возвращает никакого результата, как будто и не запускается) в Excel 2016. А удаление через архиватор не возымело смысла так как связи воссоздаются.
Иван, если честно - на какой ответ рассчитываете? Макрос и не обязан выдавать какой-либо результат, если связей в проверках данных нет изначально. Он только там их ищет. А в формулах, Условном Форматировании и именах Вам искать надо самостоятельно - инструкции приведены в статье.Найти скрытые связи
Но вообще-то, удаление связей через правку архива это 100% результат удаления связей. И если они каким-то чудесным образом именно воссоздаются - значит что-то их восстанавливает. И без Вашего файла этого не узнать. А может и файла будет мало, т.к. это может зависеть не от конкретного файла, а от подключенных надстроек и других программ на Вашем ПК.
Как вариант скачайте надстройку MulTEx - там более расширенный вариант поиска связей. 30 дней работает бесплатно. Возможно, хотя бы сможете понять откуда связи вообще берутся и где прячутся:
У меня тоже связь восстанавливалась из кэша в файле xlsx. Сохранил файл в бинарный формат xlsb, провалился в файл из Total Commander, удалил externalLinks. После открытия битая связь уже не восстановилась.
Спасибо большое!
Спасибо большое! Вы мне очень помогли! Отличная статья! Теперь буду знать, что мифические связи можно удалить через Условное форматирование!!!
Дмитрий, спасибо большое.
Спасли!!!
Ранее чаще всего помогал макрос, отображающий скрытые имена. Но тут в файле появились связи, которые никак не обрывались. Помог вариант с архиватором.
Огромная Вам благодарность за статью, за то, что делитесь своими бесценными знаниями.
Просто спасли меня.
Помог способ с архиватором. Огромное спасибо!
Спасибо большое за статью!!!Удалила связи через "Условное форматирование"