удаленные имена в Wbk все еще существуют и ссылаются на несуществующие местоположения, медленный Excel - PullRequest
5 голосов
/ 19 марта 2012

В справке VBA для свойства RefersTo они приводят этот пример перечисления всех имен в Wkb (выделено, чтобы вы могли запустить его как есть)

 Sub showNames()'from VBA Help for "RefersTo"
   Dim newSheet As Worksheet
   Set newSheet = Worksheets.Add
   Dim i As Long, nm As Name
   i = 1
   For Each nm In ActiveWorkbook.Names
     newSheet.Cells(i, 1).Value = nm.Name
     newSheet.Cells(i, 2).Value = "'" & nm.RefersTo
     i = i + 1
   Next
   newSheet.Columns("A:B").AutoFit
 End Sub

Когда я запускаю это в моем текущем проекте, обнаруживаются многие имена, которые, как я думал, давно ушли. Но здесь они все еще слоняются вокруг и ссылаются на места, которых больше не существует. Я думаю, что это замедляет мою систему, и я хотел бы избавиться от этих имен, но они не отображаются в окне «Определить имя», так где я могу их найти?

edit: Имеется в виду, что элемент Links выделен серым цветом для этого Wbk.

Ответы [ 3 ]

6 голосов
/ 19 марта 2012

Update

вариант 1
ручной метод для удаления поврежденных имен с использованием R1C1 (я могу вспомнить, что JKP заявил на другом форуме, что у него был код для этого, но он не был готов предоставить его бесплатно)

  1. Выберите Инструменты, Параметры и перейдите на вкладку Общие.
  2. Установите флажок рядом с «Стиль ссылки R1C1», чтобы изменить текущую настройку.
  3. Нажмите ОК.
  4. Excel предложит вам изменить имя любого имени (во всех открытых книгах!), Содержащего недопустимые символы.
  5. Выберите Вставить, имя, определить, чтобы удалить только что переименованные имена.
  6. Установите стиль ссылки R1C1 обратно так, как вы предпочитаете, используя Инструменты, Параметры, Общие.

вариант 2
Крис Нейлсен опубликовал это на Любой шанс удалить программно поврежденные имена (с пробелами) в Excel (2007/2010)

Но вот возможная альтернатива: Сохранить как свою книгу в формате .xlsm Вы должны получить диалоговое окно с жалобой на недопустимые имена, с опцией переименовать и кнопку ОК для всех. После сохранения закройте и снова откройте файл, сохранить как .xls, и вы должны быть хороши, чтобы пойти

Initial Post
Скачать Name Manager , который является выдающимся дополнением от Jan Karel Pieterse и Charles Williams для управления именами

Он будет обрабатывать имена, которые

  • теперь выдается ошибка, поскольку диапазоны были удалены (ваша проблема),
  • ссылка на другие рабочие книги,
  • теперь повреждены

Кроме того, он преобразует глобальные имена в локальные имена листов, и наоборот и так далее

enter image description here

1 голос
/ 20 марта 2012

Вот еще два решения, которые могут работать для других, ищущих эту тему, но они все еще не исправляют мою конкретную рабочую книгу.

Я все еще ищу.

Это от Aaron Blood и показывает метод R1C1, упомянутый brettdj:

 Sub RemoveDemonLinks()
   Dim wbBook As Workbook
   Dim nName  As Name
   Dim i      As Long

   Set wbBook = ActiveWorkbook

   i = 0
   If wbBook.Names.Count > 0 Then
      With Application
        .ReferenceStyle = xlR1C1
        .ReferenceStyle = xlA1
      End With

    For Each nName In wbBook.Name
       If InStr(nName.RefersTo, "#REF!") > 0 Then nName.Delete
       i = i + 1
    Next nName

    If i > 0 Then MsgBox i & " corrupted names was deleted from " & wbBook.Name
    End If
 End Sub

Это из MS Help

 ' Module to remove all hidden names on active workbook
    Sub Remove_Hidden_Names()

    ' Dimension variables.
     Dim xName As Variant
     Dim Result As Variant
     Dim Vis As Variant

     ' Loop once for each name in the workbook.
     For Each xName In ActiveWorkbook.Names

       'If a name is not visible (it is hidden)...
       If xName.Visible = True Then
           Vis = "Visible"
       Else
           Vis = "Hidden"
       End If

       ' ...ask whether or not to delete the name.
       Result = MsgBox(prompt:="Delete " & Vis & " Name " & _
           Chr(10) & xName.Name & "?" & Chr(10) & _
           "Which refers to: " & Chr(10) & xName.RefersTo, _
           Buttons:=vbYesNo)

       ' If the result is true, then delete the name.
       If Result = vbYes Then xName.Delete

       ' Loop to the next name.
   Next xName
 End Sub
1 голос
/ 20 марта 2012

- Обновленный ответ -

Поскольку вы знаете имена недопустимых диапазонов, но не видите их в менеджере имен, вы можете попытаться удалить их вручную из VBA Immediate.окно.Имя, которое вы дали GrPix!patternListRange, указывает имя листа, поэтому вы можете удалить его, набрав

ActiveWorkbook.Names("GrPix!patternListRange").Delete

или

Sheets("GrPix").Names("patternListRange").Delete

в окне немедленного доступа


Оригинальный ответ

Вы пытались удалить недействительные имена с помощью кода?т.е.

For Each nm In ActiveWorkbook.Names
   If InStr(nm.RefersTo, "OldFileName.xls") > 0 Then
      nm.Delete
   End If
Next nm
...