|
![]() |
#1 |
Участник
|
Способы есть. Причем не один
X++: static void Job_Excel_ExistsRange(Args _args) { COMExcelDocument_RU excel; MSOfficeBookMark_RU bookMark = 'test3'; // Имя, которое ищем COM comWorkSheet; COM comNames; COM comName; int totalI; int nextI; str strName; str strSearh; COM comApplication; COM comRange; boolean existsRange = false; str strRange; ; excel = new ComExcelDocument_RU(); excel.newFile('',true); excel.visible(true); comWorkSheet = excel.getWorkSheet(1); comNames = comWorkSheet.Names(); // Для тестирования создаю именованные диапазоны comNames.add('test1','=$A$1'); comNames.add('test2','=$A$2'); // comNames.add('test3','=$A$3'); // Вариант 1 - перебор существующих имен для поиска совпадений /* Коллекция Names есть на всех 3 уровнях: Application, WorkBook, WorkSheet Можно использовать перебор по любой коллекции Возвращаемое из коллекции имя предваряется именем листа, поэтому надо дополнить искомое имя диапазона именем листа с восклицательным знаком */ totalI = comNames.Count(); strSearh = comWorkSheet.Name() + '!' + bookMark; for (nextI = 1; nextI <= totalI; nextI++) { comName = comNames.Item(nextI); strName = comName.Name(); if (strName == strSearh) { existsRange = true; break; } // if (strName == strSearh) } // for (nextI = 1; nextI <= totalI; nextI++) if (existsRange) { info('Вариант 1: ' + bookMark + ' - найден'); } // Вариант 2 - "макроподстановка" existsRange = false; comApplication = comWorkSheet.application(); // m_comDocument.application(); // Ошибка в Range генерит сообщение об ошибке, которое не подавляется Try...Catch // comRange = comApplication.range(bookMark); // Поэтому использую "макроподстановку" Evaluate comRange = comApplication.evaluate(bookMark); // В объекте comRange нет метода Error(), поэтому штатно прочитать ошибку не получается // Конвертирую объект в строку и ищу в нем ключевое слово "ERROR" strRange = comRange.toString(); if (strScan(strRange,'ERROR',1,strLen(strRange)) == 0) { existsRange = true; } if (existsRange) { info('Вариант 2: ' + bookMark + ' - найден'); } if (! existsRange) { info(bookMark + ' - не существует'); } } Только вот, сам факт использования именованных диапазонов особого смысла не имеет. Больно уж специфические способы модификации файла Excel требуются, чтобы использование именованных диапазонов было оправдано. В общем случае - это просто бессмысленно. PS: Иногда возвращаемое имя диапазона из коллекции Names() может и не предваряться именем листа. В каких случаях имя листа указывается, а в каких - нет лично я не понял
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 17.01.2013 в 18:14. |
|
|
За это сообщение автора поблагодарили: RVS (3), Polgid (1). |
![]() |
#2 |
Сенбернар
|
Цитата:
Пример : есть восемь дизайнов одного и того же документа. Накладной, СФ. Именованные диапазоны - простейшее решение для того, чтобы одним и тем же кодом распихать данные по любому из этих дизайнов (ИМХО). Кстати, желание проверить, есть имя в данном шаблоне или нет - из той же оперы, не все клиенты хотят видеть все данные, которые распихиваем.. Спасибо, завтра попробую )
__________________
Best Regards, Roman |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от RVS
![]() Ну, даже и не знаю.. )
Пример : есть восемь дизайнов одного и того же документа. Накладной, СФ. Именованные диапазоны - простейшее решение для того, чтобы одним и тем же кодом распихать данные по любому из этих дизайнов (ИМХО). Кстати, желание проверить, есть имя в данном шаблоне или нет - из той же оперы, не все клиенты хотят видеть все данные, которые распихиваем.. ![]() Если имеем несколько дизайнов, то, как правило, дело вовсе не ограничивается банальным изменением положения той или иной надписи на листе. Обычно все-таки добавляются некие дополнительные объекты дизайна. Ну, и стоит ли из-за 2..3 общих объектов "городить огород" с именованными диапазонами? Кроме того, а как это все в коде оформляется-то? Очевидно, через макросы (#define). Ну и в чем проблема для каждого дизайна сделать свой набор макросов, только вместо имен диапазонов так прямо и писать адрес верхней левой ячейки? X++: #define.BookMark_Title('A1')
comRange = comApplication.range(#BookMark_Title);
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
Теги |
excel, range |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|