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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2010, 15:28   #1  
andrewK is offline
andrewK
Участник
 
45 / 22 (1) +++
Регистрация: 03.11.2005
Excel диапазон ячеек
Добрый день. Можно ли как нибудь узнать по названию именованной ячейки в Excel'e адрес ее последней ячейки?
То есть имеется диапазон под названием Area ("B2: D4"). В итоге нужно получить номер колонки ячейки D4.
Это нужно для определения ячейки, в которую будет вставлен скопированный диапазон Area.
Старый 02.05.2010, 19:09   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
А что есть "последняя ячека"? А если дипазон задан как "A2,D4" или, скажем, так - "Sheet1!A2:Sheet14,Sheet1!A2:Sheet14". То есть, как я понимаю, диапазон в Excel не обязан быть непрерывной областью, а может быть набором ячеек, разбросанных по листам документа. В этом случае понятие "крайности" ячейки становится слишком субъективным.

Отвечая на вопрос, диапазон - это Range. Его можно получить так:

X++:
xlApp = new COM("Excel.Application");
xlBooks = xlApp.workbooks();
xlBook = xlBooks.open(filename);
range = xlApp.Range(range)
Естественно, я не призываю работать на прямую с COM - используйте какую-нибудь объектную обертку над ним - ComExcelDocument_Ru, если не написали еще свою.

У range есть методы columns() и rows(), можно попробовать использовать их. Я же во исключение сюрпризов с хитрым Range предпочитаю работать с дипазоном поячеечно:

X++:
application.goto reference:=range
for each cell in range
  label = cell.address(false, false)
   ...
next
Таким образом можно перебрать все ячейки, входящие в дипазон, получить их адреса и затем уж исходя из своих критериев реить какая из них "крайняя".
За это сообщение автора поблагодарили: andrewK (1).
Старый 02.05.2010, 19:51   #3  
andrewK is offline
andrewK
Участник
 
45 / 22 (1) +++
Регистрация: 03.11.2005
Да, похоже придется использовать перебор ячеек для определения "конца диапазона"... Это был последний вариант у меня.
Диапазон range используется непрерывный.

Я его использую для вывода ценников, в итоге встала задача копировать (распределять) исходный шаблон ценника по всему листу А4.
Т.е. возможность скопировать ценник "вправо", и "вниз"
Старый 02.05.2010, 19:54   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Диапазон range используется непрерывный.
Ну, в этом случае можно просто распарсить строку "B2: D4". Очевидно же, что крайняя ячейка будет D4 -правый нижний угол, то что после двоеточия. Если я правильно понял задачу.
Старый 02.05.2010, 19:59   #5  
andrewK is offline
andrewK
Участник
 
45 / 22 (1) +++
Регистрация: 03.11.2005
Но, в том-то и дело, что диапазон задается по имени, например "Area".
Так легче обрабатывать шаблоны разного размера (они разной высоты).
Старый 03.05.2010, 14:22   #6  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
Если у вас DAX 4.0 SP2 FP1 и выше, обратите внимание на метод \Classes\ComExcelDocument_RU\cellAddress для преобразования именованной ячейки в координаты, и на метод \Classes\ComExcelDocument_RU\cellRegion2ColRow, что бы посмотреть, как получается значение переменной lastCell.
За это сообщение автора поблагодарили: andrewK (1).
Старый 03.05.2010, 14:40   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
На VBA объект Range, ссылающийся на последнюю ячейку непрерывного прямоугольного диапазона B2: D4, может быть получен как:
Код:
lastCell = Range("B2:D4").Cells( Range("B2:D4").Cells.Count )

ну или в виде, более удобном для преобразования в X++ как :

lastCell = Range("B2:D4").Cells.Item( Range("B2:D4").Cells.Count )

или в именах этой конкретной задачи как:

lastCell = Range("Area").Cells.Item( Range("Area").Cells.Count )
В окне отладки VBA (immediate window) можно проверить так:
Код:
? Range("B2:D4").Cells.Item(Range("B2:D4").Cells.Count).Address(false,false)
D4
Фишка в том, что ячейки диапазона допускают не только двухмерную адресацию вида (строка внутри диапазона, столбец внутри диапазона), но и одномерную с индексом от 1 до кол-во ячеек диапазона (свойство Count).

P.S. Проиллюстрирую нумерацию ячеек внутри диапазона B2: D4, который состоит из следующих ячеек
Код:
B2 C2 D2
B3 C3 D3
B4 C4 D4
При обращении через Range("B2: D4").Cells.Item(row,col) - т.е. при двухмерной индексации - индексы (row,col) соответственно выглядят так:
Код:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)
Т.е. Range("D4") это то же самое, что Range("B2: D4").Cells.Item(3,3).

При обращении через Range("B2: D4").Cells.Item(i) - т.е. при одномерной индексации - индекс (i) соответственно выглядит так (нумерация идёт по строкам):
Код:
(1) (2) (3)
(4) (5) (6)
(7) (8) (9)
Т.е. Range("D4") это то же самое, что Range("B2: D4").Cells.Item(9), где 9 = Range("B2: D4").Cells.Count

Последний раз редактировалось Gustav; 04.05.2010 в 11:44. Причина: добавил иллюстрацию различных способов нумерации ячеек
За это сообщение автора поблагодарили: andrewK (1).
Старый 03.05.2010, 14:43   #8  
andrewK is offline
andrewK
Участник
 
45 / 22 (1) +++
Регистрация: 03.11.2005
Цитата:
Сообщение от AlexSD Посмотреть сообщение
Если у вас DAX 4.0 SP2 FP1 и выше, обратите внимание на метод \Classes\ComExcelDocument_RU\cellAddress... .
Вот похоже самое то.
А можно узнать содержимое этих методов? А то у меня их нет (версия AX 4.0.2501)
Старый 03.05.2010, 20:31   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Кстати, если вся задача формулируется буквально вот так:
Цитата:
Сообщение от andrewK Посмотреть сообщение
В итоге нужно получить номер колонки ячейки D4
...то это совсем просто - надо использовать у Range свойства Column (номер колонки верхней левой ячейки) и свойство Columns.Count (кол-во колонок диапазона). На VBA в окне отладки получается:
Код:
Set rng = Range("B2:D4") : ? rng.Column + rng.Columns.Count - 1
 4
Старый 03.05.2010, 20:37   #10  
andrewK is offline
andrewK
Участник
 
45 / 22 (1) +++
Регистрация: 03.11.2005
Спасибо всем большое, получается можно закрыть тему.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Высота ячеек Excel eva DAX: Программирование 8 20.03.2012 22:42
emeadaxsupport: How does the Export to Excel feature work under the hood? Blog bot DAX Blogs 0 07.09.2009 19:05
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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