MyTetra Share
Делитесь знаниями!
Удаление проверки данных
Время создания: 26.05.2020 16:28
Текстовые метки: проверка данных, Validation, Names
Раздел: !Закладки - VBA - Excel - Names
Запись: xintrea/mytetra_db_adgaver_new/master/base/1590499699u723trc2jm/text.html на raw.githubusercontent.com

Так же не помешает проверить наличие лишних ссылок и среди проверки данных(Что такое проверка данных). Как правило связи могут быть в проверке данных с типом Список. Но как их отыскать, если проверка данных распространена на множество ячеек? Проверять каждую? Это очень долго. Поэтому я предлагаю коротенький код, который отыщет все такие ссылки быстрее и сэкономит время):


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



  • Есть пара нюансов:
    1. Прежде чем искать ненужную связь необходимо определить её ссылку: Данные -Изменить связи. Запомнить имя файла и записать в этой строке внутри кавычек:
    Const sToFndLink$ = "*продажи 2018*"
    Имя файла можно записать не полностью, все пробелы и другие символы можно заменить звездочкой дабы не ошибиться. Текст внутри кавычек должен быть в нижнем регистре. Например, на картинках выше есть связь с файлом "Продажи 2018.xlsx", но я внутри кода записал "*продажи 2018*" - будет найдена любая связь, в имени которой есть "продажи 2018".
    2. Код ищет проверки данных только на активном листе
    3. Код только выделяет все найденные ячейки(обычное выделение), он ничего сам не удаляет.
    4. Если надо подсветить ячейки цветом - достаточно убрать апостроф(') перед строкой
    rres.Interior.Color = vbRed 'если надо выделить еще и цветом

Как правило после описанных выше действий лишних связей остаться не должно. Но если вдруг связи остались и найти Вы их никак не можете или по каким-то причинам разорвать связи не получается(например, лист со связью защищен)- можно пойти совершенно иным путем. Действует этот рецепт только для файлов новых форматов Excel 2007 и выше:
1. Обязательно делаем резервную копию файла, связи в котором никак не хотят разрываться
2. Открываем файл при помощи любого архиватора(WinRAR отлично справляется, но это может быть и другой, работающий с форматом ZIP)
3. В архиве перейти в папку xl -> externalLinks
4. Сколько связей содержится в файле, столько файлов вида externalLink1.xml и будет внутри. Файлы просто пронумерованы и никаких сведений о том, к какому конкретному файлу относится эта связь на поверхности нет. Чтобы узнать какой файл .xml к какой связи относится надо зайти в папку "_rels" и открыть там каждый из имеющихся файлов вида externalLink1.xml.rels. Там и будет содержаться имя файла-источника.
5. Если надо удалить только связь на конкретный файл - удаляем только те externalLink1.xml.rels и externalLink1.xml, которые относятся к нему. Если удалить надо все связи - удаляем все содержимое папки externalLinks
6. Закрываем архив
7. Открываем файл в Excel. Появится сообщение об ошибке вроде "Ошибка в части содержимого в Книге ...". Соглашаемся. Появится еще одно окно с перечислением ошибочного содержимого. Нажимаем закрыть.

После этого связи должны быть удалены.

 
MyTetra Share v.0.59
Яндекс индекс цитирования