Как удалить объект Excel.Name? - PullRequest
1 голос
/ 20 июля 2010

У меня есть набор объектов Excel.Name в коллекции Workbook.Names, которые содержат недопустимые ссылки.Другими словами, когда я оцениваю свойство Excel.Name.RefersTo, я получаю значение, начинающееся с «= # REF ...».Я попытался запустить следующий код, но, похоже, он не удаляет имена:

var ranges = myWorkBook.Names;
for (int i = 1; i <= ranges.Count; i++)
{
    var currentName = ranges.Item(i, Type.Missing, Type.Missing);
    var refersTo = currentName.RefersTo.ToString();
    if (refersTo.Contains("REF!"))
    {
        currentName.Delete();
    }
}

Кто-нибудь может подсказать, что я здесь делаю неправильно?Или, может быть, я пропускаю шаг?

Ответы [ 5 ]

2 голосов
/ 21 сентября 2010

Для удаления используйте имя:

workbook.Names.Item(rangeName, Type.Missing, Type.Missing).Delete();

(то есть в C #).

1 голос
/ 21 июля 2010

Попробуйте Workbook.Names[i].Delete().Вы не можете использовать currentName.Delete.(По памяти я попытаюсь найти свой код для этого.)

0 голосов
/ 15 января 2019

Я просто настроил ее как функцию VBA, а затем вызвал ее из C #:

VBA (могу раскомментировать одну строку, если вы хотите удалить только ошибку ref с именами range):

Sub DeleteNamedRanges()
   Dim nm As Object
   Dim mystr As String

   For Each nm In ThisWorkbook.Names
      On Error Resume Next
      'If InStr(1, nm.RefersTo, "#REF!") Then
      nm.Delete
      On Error GoTo 0
   Next
End Sub

C #:

XlApp.Application.Run($"'{fileName}'!{yourWorksheet.CodeName}.DeleteNamedRanges");

Заметка о C #, в моем случае я помещал этот VBA в код конкретной рабочей таблицы, потому что я копировал эту рабочую таблицу в другие рабочие книгии я хотел, чтобы это было доступно в этих книгах, поэтому мне пришлось вызывать полный путь к методу VBA.Было бы намного проще, если вам не нужно что-то подобное, просто поместить код VBA в ThisWorkbook или модуль и вызвать его более напрямую.

0 голосов
/ 08 мая 2017

Я столкнулся с проблемой, заключающейся в том, что при удалении группы имен из активной рабочей книги индекс коллекции имен немедленно обновляется. Это может привести к неправильному индексу / индексу вне диапазона исключений.

Если вы хотите обязательно удалить все доступные имена, используйте этот код:

public void finalize()
    {
        Microsoft.Office.Interop.Excel.Workbook myWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook;


        var ranges = myWorkbook.Names;
        int leftoveritems;
        leftoveritems = ranges.Count;

        while (leftoveritems > 0)
        {
            int i = 1;
            try
            {
                while (i <= leftoveritems)
                {
                    myWorkbook.Names.Item(i).Delete();
                    //System.Windows.Forms.MessageBox.Show(i + " deleted.");
                    i++;
                }
            }
            catch (Exception ex)
            {
                //System.Windows.Forms.MessageBox.Show(i + " failed " + ex.Message);
            }

            ranges = myWorkbook.Names;
            leftoveritems = ranges.Count;
        }
    }
0 голосов
/ 26 июля 2010

AMissico привел меня в правильном направлении. currentName.Delete() определенно не работает. Однако Workbook.Names [i] .Delete под VSTO 2005 SE не поддерживается, поэтому я покопался еще немного и обнаружил, что Workbook.Names.Item(i, Type.Missing, Type.Missing) справился.

Это пример кода, который будет работать:

var ranges = myWorkBook.Names;

int i = 1;
while (i <= ranges.Count)
{
    var currentName = ranges.Item(i, Type.Missing, Type.Missing);
    var refersTo = currentName.RefersTo.ToString();
    if (refersTo.Contains("REF!"))
    {
        ranges.Item(i, Type.Missing, Type.Missing).Delete();
    }
    else
    {
        i++;
    }
}
...