powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Короткий код получения поддиапазона ячеек из другого диапазона
14 сообщений из 14, страница 1 из 1
Короткий код получения поддиапазона ячеек из другого диапазона
    #36779799
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часто приходиться работать с таблицами в Excel которые расположены не в начале листа, а где-то ниже, правее. Координаты шапки таблицы известны, размеры таблицы неизвестны.
Нужно извлекать некоторые данные из этой таблицы.

Перефразирую это на примере.
Есть некий диапазон ячеек, к примеру столбец A.
Из этого диапазона интересует к примеру используемый диапазон, но не с первой ячейки, а к примеру с пятой.
Как наиболее коротко написать код, а то в моем варианте он слишком длинный получается, надоедает постоянно такие конструкции рисовать.

Например для данного я написал бы примерно такой код:

Код: plaintext
1.
2.
3.
4.
5.
Dim rang As Range
 
With ActiveSheet
  Set rang = Intersect(.UsedRange, .Columns( 1 ))   'Нашли диапазон используемых ячеек в 1-ом столбце.
  Set rang = Range(Cells( 5 ,  1 ), Cells(rang.Row + rang.Rows.Count -  1 ,  1 ))   'Из этого диапазона взяли ячейки начинающиеся с 5-ой строки.
End With

Хотелось бы что-то более красивое.

Пока писал комменты придумал ещё другой код, строк меньше, но громоздкий:

Код: plaintext
1.
2.
3.
4.
Dim rang As Range

With ActiveSheet
  Set rang = Intersect(.UsedRange, .Columns( 1 ), Range(Cells( 5 ,  1 ), Cells(.Cells.Rows.Count,  1 )))
End With
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36779875
fortik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
копайте в сторону offset
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36805676
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortikкопайте в сторону offsetOffset конечно хорошо, но если у меня например нижняя граница диапазона 65536, то после применения Offset будет ошибка.
Например:
Код: plaintext
Range("A1:A65536").Offset( 5 ,  0 ).Select 'Будет ошибка из-за выхода за пределы строк.
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36805943
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
With ActiveSheet.UsedRange
  Set rang = range("a5:a" & .rows.count - .row)
End With
[/quot][/SRC]
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36809370
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
  With ActiveSheet.UsedRange
    Set Rng = Range("A5:A" & .Cells( 1 ).Offset(.Rows.Count -  1 ).Row)
  End With
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36809371
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так лучше, потому что вместо ActiveSheet может быть любой лист:
Код: plaintext
1.
2.
3.
  With ActiveSheet
    Set Rng = .Range("A5:A" & .Cells.SpecialCells(xlCellTypeLastCell).Row)
  End With
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36809392
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
    With ActiveSheet.Cells
      Set Rng = .Range("A5:A" & .SpecialCells( 11 ).Row)
    End With
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36810481
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо все варианты делают то что надо.

Правда изучая их, заметил один побочный эффект (видимо так и задумано разработчиками Excel), в том числе и у моего кода.

Предположим, что у нас данные заполнены только в ячейках A1:A3.
Все выше перечисленные коды как результат дадут диапазон A3:A5, что конкретно для моей задачи будет не верно, в данном случае для меня правильным результатом должно быть что-то типа Nothing, т.к. меня интересуют только данные расположенные начиная с 5-ой ячейки, а данных там нет.

Но с другой стороны у меня такой случай и не возникает, так что задачу можно считать решённой, всем спасибо.
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36820552
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon Player,

Dim rng As Range
Set rng = Columns(1)
Set rng = rng.Resize(rng.Rows.Count - 4).Offset(4)
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36821448
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_,

Учитывая, то в условиях задачи нужно выделять данные из используемого диапазона, немного модифицировал ваш код:
Код: plaintext
1.
Set rng = ActiveSheet.UsedRange.Columns( 1 )
Set rng = rng.Resize(rng.Rows.Count -  4 ).Offset( 4 )

Правда и этот код будет работать неправильно, если используемый диапазон данных не будет включать в себя ячейку A1.

Если например сделать активным совершенно пустой лист на который ещё ничего не вводилось и запустить такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub test()
 Dim rng As Range
 
 Range("A3:B10").Value =  1 
 
 Set rng = ActiveSheet.UsedRange.Columns( 1 )
 Set rng = rng.Resize(rng.Rows.Count -  4 ).Offset( 4 )
 rng.Select
End Sub
То будут выделены ячейки A7:A10, вместо A5:A10.
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36827433
_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)
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36827749
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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.
Sub test()
 Dim rang As Range
 
 Range("A3:B10").Value =  1 
 
 With ActiveSheet
   Set rang = Intersect(.UsedRange, .Columns( 1 ), Range(Cells( 5 ,  1 ), Cells(.Cells.Rows.Count,  1 )))
 End With
 
 rang.Select
End Sub
Конечно перед выполнением rang.Select надо ещё проверить не является ли он Nothing, но это уже другая история, главное именно получение самого rang.
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36828076
_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)



больше не знаю как объяснить.

с наилучшими пожеланиями умываю руки.
...
Рейтинг: 0 / 0
Короткий код получения поддиапазона ячеек из другого диапазона
    #36828511
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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. Устраивают оба эти варианта.

Надеюсь всё правильно объяснил, хотя чем больше пишешь, тем больше вероятности допустить опечатку, ошибку и прочее.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Короткий код получения поддиапазона ячеек из другого диапазона
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]