|
|
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Часто приходиться работать с таблицами в Excel которые расположены не в начале листа, а где-то ниже, правее. Координаты шапки таблицы известны, размеры таблицы неизвестны. Нужно извлекать некоторые данные из этой таблицы. Перефразирую это на примере. Есть некий диапазон ячеек, к примеру столбец A. Из этого диапазона интересует к примеру используемый диапазон, но не с первой ячейки, а к примеру с пятой. Как наиболее коротко написать код, а то в моем варианте он слишком длинный получается, надоедает постоянно такие конструкции рисовать. Например для данного я написал бы примерно такой код: Код: plaintext 1. 2. 3. 4. 5. Хотелось бы что-то более красивое. Пока писал комменты придумал ещё другой код, строк меньше, но громоздкий: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 16:37 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
копайте в сторону offset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2010, 17:05 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
fortikкопайте в сторону offsetOffset конечно хорошо, но если у меня например нижняя граница диапазона 65536, то после применения Offset будет ошибка. Например: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2010, 10:44 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2010, 12:19 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2010, 03:27 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Так лучше, потому что вместо ActiveSheet может быть любой лист: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2010, 03:35 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2010, 05:55 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Спасибо все варианты делают то что надо. Правда изучая их, заметил один побочный эффект (видимо так и задумано разработчиками Excel), в том числе и у моего кода. Предположим, что у нас данные заполнены только в ячейках A1:A3. Все выше перечисленные коды как результат дадут диапазон A3:A5, что конкретно для моей задачи будет не верно, в данном случае для меня правильным результатом должно быть что-то типа Nothing, т.к. меня интересуют только данные расположенные начиная с 5-ой ячейки, а данных там нет. Но с другой стороны у меня такой случай и не возникает, так что задачу можно считать решённой, всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2010, 14:04 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Djon Player, Dim rng As Range Set rng = Columns(1) Set rng = rng.Resize(rng.Rows.Count - 4).Offset(4) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2010, 11:06 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
_slan_, Учитывая, то в условиях задачи нужно выделять данные из используемого диапазона, немного модифицировал ваш код: Код: plaintext 1. Правда и этот код будет работать неправильно, если используемый диапазон данных не будет включать в себя ячейку A1. Если например сделать активным совершенно пустой лист на который ещё ничего не вводилось и запустить такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2010, 15:14 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Djon Player, вы не правы - суть кода в выделении диапазона, начало которого смещено относительно первоначального на количество строк, заданных константой( в данном коде 4). если у вас первоначально задан диапазон a3:a10, вы хотите выделить диапазон, смещенный на 4 строки вниз, то 3+4=7 - чем же это неправильно? почему должно быть 5? если надо с 5й строки( а относительно заданного диапазона это будет 3я), то так и пишите 3-1=2 - Set rng = rng.Resize(rng.Rows.Count - 2).Offset(2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:38 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
_slan_Djon Player, вы не правы - суть кода в выделении диапазона, начало которого смещено относительно первоначального на количество строк, заданных константой( в данном коде 4). если у вас первоначально задан диапазон a3:a10, вы хотите выделить диапазон, смещенный на 4 строки вниз, то 3+4=7 - чем же это неправильно? почему должно быть 5? если надо с 5й строки( а относительно заданного диапазона это будет 3я), то так и пишите 3-1=2 - Set rng = rng.Resize(rng.Rows.Count - 2).Offset(2) Ну почему-же не прав. Вы же код приводили как ответ на поставленную мной задачу. Я привёл пример, при котором он выделяет не то, что надо. Т.е. код то правильно работает, но при определённых условиях (когда данные находятся в диапазоне a3:a10) результат не соответствует тому, что нужно для конкретной задачи. Причем сам диапазон a3:a10 не является условием задачи, это просто возможный пример размещения данных, данные могут размещаться как угодно. А в условиях задачи дано только это: получить данные 1-ого столбца начиная с 5-ой строки и ниже в пределах заполненных данных. А главное сделать это с минимальным набором кода. А т.к. диапазон a3:a10 был показан как пример и там может быть любой диапазон, к примеру a2:a10, то заранее неизвестно какие константы устанавливать в случае использования вашего кода. Понятно что эти константы можно вычислить, но это приведёт к разрастанию кода. А так пример кода решающий мною поставленную задачу был приведён мной-же в самом первом посте и в частности для диапазона данных A3:B10 он даёт корректный результат. Просто хотелось код ещё как-то упростить, укоротить. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 12:13 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
Djon Player, вам дали более короткий код.. попробуйте его еще раз использовать(понять) вот ваши слова: <Из этого диапазона интересует к примеру используемый диапазон, но не с первой ячейки, а к примеру с пятой.?> "этот диапазон" - будет "$A$3:$A$10" Range("A3:B10").Value = 1 Set rng = ActiveSheet.UsedRange.Columns(1) "с пятой ячейки" этого диапазона и до конца будет a7:a10 что и дает код Set rng = rng.Resize(rng.Rows.Count - 4).Offset(4) больше не знаю как объяснить. с наилучшими пожеланиями умываю руки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 13:50 |
|
||
|
Короткий код получения поддиапазона ячеек из другого диапазона
|
|||
|---|---|---|---|
|
#18+
_slan_Djon Player, вам дали более короткий код.. попробуйте его еще раз использовать(понять) вот ваши слова: <Из этого диапазона интересует к примеру используемый диапазон, но не с первой ячейки, а к примеру с пятой.?> "этот диапазон" - будет "$A$3:$A$10" Range("A3:B10").Value = 1 Set rng = ActiveSheet.UsedRange.Columns(1) "с пятой ячейки" этого диапазона и до конца будет a7:a10 что и дает код Set rng = rng.Resize(rng.Rows.Count - 4).Offset(4) больше не знаю как объяснить. с наилучшими пожеланиями умываю руки.Только сейчас я понял, что загвоздка в этой фразе ""с пятой ячейки" этого диапазона". В оригинале моя фраза была немного другой "Из этого диапазона интересует к примеру используемый диапазон, но не с первой ячейки, а к примеру с пятой.", но тем не менее согласен, мой косяк, что если вчитываться дословно, то смысл действительно не тот, который я хотел выразить. Постараюсь ещё раз передать смысл в несколько предложений. И так есть некий файл, и на некотором текущем (активном) листе заполнены кем-то какие-то данные. В каких именно ячейках находятся эти данные мы не знаем, это должен уже анализировать макрос. Для упрощения задачи мы будем работать только с одним первым столбцом. Задача такая: Из заполненных (кем-то) данных надо найти диапазон ячеек в пределах 1-ого столбца и в пределах используемых ячеек (т.е. тех, что попадают в UsedRange) и только тех, у которых номер строки равен или больше 5. Теперь распишу три возможных случая в зависимости от того где были заполнены данные в зависимости от их размещения относительно ячейки A5: 1. Если ячейки из UsedRange 1-ого столбца не включают в себя ячейку A5 и номера строк всех этих ячеек меньше 5, то в качестве результата должно быть Nothing. 2. Если ячейки из UsedRange 1-ого столбца имеют номера строк, как меньше 5, так и больше 5 и среди них есть так-же ячейка A5, то в качестве результата должен быть диапазон из этих ячеек, но только тех, номера строк которых больше или равны 5. 3. Если все ячейки из UsedRange 1-ого столбца имеют номера строк больше или равные 5, то результатом должен быть либо просто ActiveSheet.UsedRange.Columns(1), либо диапазон ячеек первого столбца начиная с 5-ой строки и вниз до нижней границы UsedRange. Устраивают оба эти варианта. Надеюсь всё правильно объяснил, хотя чем больше пишешь, тем больше вероятности допустить опечатку, ошибку и прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:31 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=36827749&tid=2177716]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 422ms |

| 0 / 0 |
