|
02.05.2010, 15:28 | #1 |
Участник
|
Excel диапазон ячеек
Добрый день. Можно ли как нибудь узнать по названию именованной ячейки в Excel'e адрес ее последней ячейки?
То есть имеется диапазон под названием Area ("B2: D4"). В итоге нужно получить номер колонки ячейки D4. Это нужно для определения ячейки, в которую будет вставлен скопированный диапазон Area. |
|
02.05.2010, 19:09 | #2 |
Moderator
|
А что есть "последняя ячека"? А если дипазон задан как "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) У 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 |
Участник
|
Да, похоже придется использовать перебор ячеек для определения "конца диапазона"... Это был последний вариант у меня.
Диапазон range используется непрерывный. Я его использую для вывода ценников, в итоге встала задача копировать (распределять) исходный шаблон ценника по всему листу А4. Т.е. возможность скопировать ценник "вправо", и "вниз" |
|
02.05.2010, 19:54 | #4 |
Moderator
|
Цитата:
Диапазон range используется непрерывный.
|
|
02.05.2010, 19:59 | #5 |
Участник
|
Но, в том-то и дело, что диапазон задается по имени, например "Area".
Так легче обрабатывать шаблоны разного размера (они разной высоты). |
|
03.05.2010, 14:22 | #6 |
Microsoft Dynamics
|
Если у вас DAX 4.0 SP2 FP1 и выше, обратите внимание на метод \Classes\ComExcelDocument_RU\cellAddress для преобразования именованной ячейки в координаты, и на метод \Classes\ComExcelDocument_RU\cellRegion2ColRow, что бы посмотреть, как получается значение переменной lastCell.
|
|
|
За это сообщение автора поблагодарили: andrewK (1). |
03.05.2010, 14:40 | #7 |
Moderator
|
На 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 ) Код: ? Range("B2:D4").Cells.Item(Range("B2:D4").Cells.Count).Address(false,false) D4 P.S. Проиллюстрирую нумерацию ячеек внутри диапазона B2: D4, который состоит из следующих ячеек Код: B2 C2 D2 B3 C3 D3 B4 C4 D4 Код: (1,1) (1,2) (1,3) (2,1) (2,2) (2,3) (3,1) (3,2) (3,3) При обращении через Range("B2: D4").Cells.Item(i) - т.е. при одномерной индексации - индекс (i) соответственно выглядит так (нумерация идёт по строкам): Код: (1) (2) (3) (4) (5) (6) (7) (8) (9) Последний раз редактировалось Gustav; 04.05.2010 в 11:44. Причина: добавил иллюстрацию различных способов нумерации ячеек |
|
|
За это сообщение автора поблагодарили: andrewK (1). |
03.05.2010, 14:43 | #8 |
Участник
|
|
|
03.05.2010, 20:31 | #9 |
Moderator
|
Кстати, если вся задача формулируется буквально вот так:
...то это совсем просто - надо использовать у Range свойства Column (номер колонки верхней левой ячейки) и свойство Columns.Count (кол-во колонок диапазона). На VBA в окне отладки получается: Код: Set rng = Range("B2:D4") : ? rng.Column + rng.Columns.Count - 1 4 |
|
03.05.2010, 20:37 | #10 |
Участник
|
Спасибо всем большое, получается можно закрыть тему.
|
|
|
|