![]() |
#1 |
Участник
|
Узнать строку и столбец именованной области в Excel
Для более гибких шаблонов потребовался сабж, следующий код (в виде расширения ComExcelDocument_RU) упорно не работает, укажите, пожалуйста, где неправ:
X++: //Возвращает контейнер из строки и столбца именованной области в Excel public container getNamedCellRowColumn(anytype _anyVal, int _workSheet = 1) { COM comWorkSheet; COM names, name; COMVAriant tmp; container ret = connull(); ; if (! m_comDocument) throw error(strfmt("@GEE6401", this.getApplicationName())); comWorkSheet = this.getWorkSheet(_workSheet); comWorkSheet.activate(); try { names = comWorkSheet.Names(); name = COM::createFromVariant(names.Item(_anyVal)); //ПАДАЕТ уже ЗДЕСЬ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tmp = name.RefersToR1C1(); ret = [tmp.bStr()]; } catch { checkFailed(strfmt("Чтение из Excel поля %1 завершилось ошибкой",_anyVal)); } return ret; } X++: cnt = excelDocument.getNamedCellRowColumn("ReportType"); |
|
![]() |
#2 |
Microsoft Dynamics
|
Когда я решал подобную задачу, выяснилось, что метод names.Item(...) принимает в качестве параметра целое значение индекса.
Пришлось сделать цикл for и перебор всех индексов до совпадения адресов ячеек. А Ваша задача решается просто. Но по другому. Типа: comRange = m_comApplication.range(_anyVal); cell = comRange.address(); Последний раз редактировалось AlexSD; 31.01.2008 в 14:39. |
|
|
За это сообщение автора поблагодарили: player (1). |
![]() |
#3 |
Moderator
|
Не знаю тонкостей задачи (например, необходимость перебора коллекции Names мне неочевидна), но на всякий случай на заметку:
Допустим, ячейке B2 присвоено имя MyCell, тогда ...Range("MyCell").Address() вернет строку: $B$2. Точно также, как и ...Range("B2").Address() вернет ту же строку: $B$2. P.S. Впрочем, AlexSD уже всё сказал ![]() P.P.S. А если потребуются целочисленные номера строк и столбцов, тогда ...Range("MyCell").Row() и ...Range("MyCell").Column(). И убереги Вас Бог получать букву столбца для того, чтобы потом по нему перебором в цикле алфавита вычислять номер столбца... ![]() |
|
|
За это сообщение автора поблагодарили: player (1). |
![]() |
#4 |
Moderator
|
Всё же попробуем разобраться, почему не работает исходный код. Должен сработать следующий вариант:
X++: names = comWorkSheet.Names(); name = names.Item(_anyVal); tmp = name.RefersToR1C1(); ret = [tmp.bStr()]; * имя ячейки введено как имя уровня листа, т.е. с именем листа, например, "Sheet1!MyCell" (а не просто "MyCell") * и comWorkSheet является тем самым листом (например, Sheet1), на котором это имя определено. Если же имя ячейки было задано как имя уровня рабочей книги - просто "MyCell" (а, скорее всего, именно так и было), то спасет тот же самый код, если вместо листа comWorkSheet указать книгу (допустим, некий comWorkBook) X++: COM comWorkBook;
comWorkBook = ...; // здесь нужно позаботиться о его получении
names = comWorkBook.Names();
name = names.Item(_anyVal);
tmp = name.RefersToR1C1();
ret = [tmp.bStr()]; |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
![]() |
#5 |
Участник
|
Цитата:
![]() |
|
![]() |
#6 |
Moderator
|
Ох, фраза моя, наверное, не с тем оттенком прозвучала...
![]() Имелось в виду, что-то типа "Товарисч! Просто бери Range(...).Column() и радуйся жизни!" вместо того, чтобы найти букву, а потом подать ее на вход одного из этих... ах, каких полезных методов, чтобы таки наконец получить цифру! ![]() |
|
![]() |
#7 |
Участник
|
Всем спасибо! Все получилось. Считаю, тема раскрыта, полностью. P.S. Обращения на "Вы", после опыта прочих форумов настораживают
![]() |
|
|
|