VSTO 4 & C # NamedRange.RefersToRange создает исключение Com, когда диапазон большой - PullRequest
1 голос
/ 23 февраля 2012

Я использую NamedRanges для хранения «Представлений» моего листа Excel.Таким образом, когда пользователь выбирает View, он получает NamedRange для этого View (набор строк) и затем скрывает эти строки.Однако оказывается, что когда фактический диапазон в NamedRange становится слишком большим, я получаю исключение COM, когда пытаюсь сослаться на свойство RefersToRange

'(ViewRange) .RefersToRange' выдает исключениевведите 'System.Runtime.InteropServices.COMException'

Действительно интересная часть заключается в том, что я могу выбрать NamedRange в Excel, и он будет отлично выделять весь диапазон, а также другие свойства, такие как .RefersTo и .RefersToR1C1 возвращают просто отлично.

Я создаю NamedRange, сначала создав диапазон со всеми строками, а затем просто назвав его.

здесьпример того, что возвращает RefersToR1C1, когда я получаю сообщение об ошибке COM *

"= Sheet1! R13: R23, Sheet1! R26: R39, Sheet1! R41, Sheet1! R43: R46, Sheet1! R48: R49, Лист1 R51: R72, Лист1 R76: R78, Лист1 R83: R84, Лист1 R137: R147, Лист1 R150: R163, Лист1 R165, Лист1 R167:! R170, Лист1 R172: R173!, Лист1 R175: R196, R200 Лист1: R202, R207 Лист1: R208, Лист1! R261: R271, Лист1 R274: R287, Лист1 R289, Лист1 R291:! R294, Лист1 R296: R297, Лист1 R299: R320, Лист1 R324: R326, Лист1 R331: R332, Лист1 R385: R395, Лист1! R398: R411, Лист1! R413, Лист1! R415: R418, Лист1! R420: R421, Лист1! R423: R444, Лист1! R448: R450, Лист1! R455: R456 "

Вот код, где у меня возникла проблема

 Excel.Range rngAll = _Blocks.DataRange;
 rngAll.EntireRow.Hidden = false;
 Excel.Name ViewRange = Globals.ThisWorkbook.Names.Item(viewName, System.Type.Missing);

 string addy = ViewRange.RefersToR1C1 as string;   //this line works fine
 ViewRange.RefersToRange.EntireRow.Hidden = true;  //this line throws the COM Exception

Любая помощь будет признательна, или если у вас есть лучший способ выполнить мои «Представления», или есть способ даже использовать адрес формулывыше, чтобы создать экземпляр диапазона, который я мог бы затем скрыть?

ОБНОВЛЕНИЕ !!!

Хорошо Так что это не отвечает на первоначальный вопрос, поэтому я отредактировал вместо ответа.Если здесь есть уважаемые «Переполнители стека», пожалуйста, дайте мне знать, если я должен ответить вместо этого.

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

Globals.Sheet1.InnerObject.get_Range(viewName, System.Type.Missing).EntireRow.Hidden = true;

Спасибо, Пит

1 Ответ

1 голос
/ 18 апреля 2012

До сих пор не знаю, почему это не удается, но рабочее решение - получить доступ к диапазону имен с помощью метода get_Range () рабочего листа.

Globals.Sheet1.InnerObject.get_Range(viewName, System.Type.Missing).EntireRow.Hidden = true; 
...