AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.01.2008, 14:27   #1  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Узнать строку и столбец именованной области в 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  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
Когда я решал подобную задачу, выяснилось, что метод names.Item(...) принимает в качестве параметра целое значение индекса.
Пришлось сделать цикл for и перебор всех индексов до совпадения адресов ячеек.

А Ваша задача решается просто. Но по другому.
Типа:
comRange = m_comApplication.range(_anyVal);
cell = comRange.address();

Последний раз редактировалось AlexSD; 31.01.2008 в 14:39.
За это сообщение автора поблагодарили: player (1).
Старый 01.02.2008, 07:33   #3  
player is offline
player
Участник
 
107 / 69 (3) ++++
Регистрация: 25.08.2007
Всем спасибо! Все получилось. Считаю, тема раскрыта, полностью. P.S. Обращения на "Вы", после опыта прочих форумов настораживают
Старый 31.01.2008, 14:48   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Не знаю тонкостей задачи (например, необходимость перебора коллекции 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   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Всё же попробуем разобраться, почему не работает исходный код. Должен сработать следующий вариант:
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()];
Предпочтение, конечно, стоит отдать второму способу как более универсальному. Параметр метода int _workSheet = 1 в этом случае, получается, не особо и нужен. Тем более, что строка, возвращаемая RefersToR1C1, содержит в себе имя листа.
За это сообщение автора поблагодарили: gl00mie (3).
Старый 31.01.2008, 17:47   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Gustav Посмотреть сообщение
И убереги Вас Бог получать букву столбца для того, чтобы потом по нему перебором в цикле алфавита вычислять номер столбца...
Вроде бы вычисление номера столбца по букве и обратно уже реализовано в методах ComExcelDocument_RU::colName2Num() и ComExcelDocument_RU::numToNameCell()
Старый 31.01.2008, 17:57   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ох, фраза моя, наверное, не с тем оттенком прозвучала...
Имелось в виду, что-то типа "Товарисч! Просто бери Range(...).Column() и радуйся жизни!" вместо того, чтобы найти букву, а потом подать ее на вход одного из этих... ах, каких полезных методов, чтобы таки наконец получить цифру!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Excel. Узнать по именованной ячейке на каком она листе? Poleax DAX: Программирование 10 30.12.2008 13:48
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
скрыть столбец Excel Azat DAX: Программирование 3 11.03.2005 18:40
Как узнать числовые значения констант Word и Excel? Atani DAX: Программирование 2 26.01.2004 16:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:32.