31.01.2008, 14:27 | #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"); |
|
31.01.2008, 14:35 | #2 |
Microsoft Dynamics
|
Когда я решал подобную задачу, выяснилось, что метод names.Item(...) принимает в качестве параметра целое значение индекса.
Пришлось сделать цикл for и перебор всех индексов до совпадения адресов ячеек. А Ваша задача решается просто. Но по другому. Типа: comRange = m_comApplication.range(_anyVal); cell = comRange.address(); Последний раз редактировалось AlexSD; 31.01.2008 в 14:39. |
|
|
За это сообщение автора поблагодарили: player (1). |
31.01.2008, 14:48 | #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). |
31.01.2008, 17:37 | #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). |
31.01.2008, 17:47 | #5 |
Участник
|
Вроде бы вычисление номера столбца по букве и обратно уже реализовано в методах ComExcelDocument_RU::colName2Num() и ComExcelDocument_RU::numToNameCell()
|
|
31.01.2008, 17:57 | #6 |
Moderator
|
Ох, фраза моя, наверное, не с тем оттенком прозвучала...
Имелось в виду, что-то типа "Товарисч! Просто бери Range(...).Column() и радуйся жизни!" вместо того, чтобы найти букву, а потом подать ее на вход одного из этих... ах, каких полезных методов, чтобы таки наконец получить цифру! |
|
01.02.2008, 07:33 | #7 |
Участник
|
Всем спасибо! Все получилось. Считаю, тема раскрыта, полностью. P.S. Обращения на "Вы", после опыта прочих форумов настораживают
|
|
|
|