Смещение ячеек в excel макрос

Свойство Offset объекта Range, возвращающее смещенный диапазон, в том числе отдельную ячейку, в коде VBA Excel. Синтаксис, параметры, примеры.

Offset – это свойство объекта Range, возвращающее диапазон той же размерности, но смещенный относительно указанного диапазона на заданное количество строк и столбцов.

Синтаксис

Синтаксис свойства Range.Offset:

Expression.Offset (RowOffset, ColumnOffset)

Expression – это выражение (переменная), возвращающее исходный объект Range, относительно которого производится смещение.

Параметры

RowOffset – это параметр, задающий смещение диапазона по вертикали относительно исходного на указанное количество строк.

Значение RowOffset Направление смещения
Отрицательное вверх
Положительное вниз
0 (по умолчанию) нет смещения

ColumnOffset – это параметр, задающий смещение диапазона по горизонтали относительно исходного на указанное число столбцов.

Значение ColumnOffset Направление смещения
Отрицательное влево
Положительное вправо
0 (по умолчанию) нет смещения

Необходимо следить за тем, чтобы возвращаемый диапазон не вышел за пределы рабочего листа Excel. В противном случае VBA сгенерирует ошибку (Пример 3).

Примеры

Пример 1
Обращение к ячейкам, смещенным относительно ячейки A1:

Sub Primer1()

  Cells(1, 1).Offset(5).Select

    MsgBox ActiveCell.Address

  Cells(1, 1).Offset(, 2).Select

    MsgBox ActiveCell.Address

  Cells(1, 1).Offset(5, 2).Select

    MsgBox ActiveCell.Address

End Sub

Пример 2
Обращение к диапазону, смещенному относительно исходного:

Sub Primer2()

  Range(«C8:F12»).Offset(3, 5).Select

    MsgBox Selection.Address

End Sub

Пример 3
Пример ошибки при выходе за границы диапазона рабочего листа:

Sub Primer3()

On Error GoTo ErrorText

  Cells(1, 1).Offset(3).Select

Exit Sub

ErrorText:

  MsgBox «Ошибка: « & Err.Description

End Sub

excelvbatutorialExcel is the most commonly used spreadsheet management software. VBA , or Visual Basic for Applications, takes it a step further and makes it easy for you to automate just about anything in Excel (check out this tutorial for a quick into to VBA). In today’s tutorial, we’re going to show you how to use the Offset function in VBA, to select a cell or a range of cells. You require basic familiarity with both Excel and VBA.

If you’re new to them, no problem, you can try out our course for VBA with Excel.

What is the Offset Function

The OffSet() returns the value of the cell, at an offset that you’ve specified.  The syntax of this function looks like this:

 OffSet(Cell reference, rows, columns, height, width)

Here’s what each parameter means

  1. Cell reference: refers to a single cell or range of cells.
  2. Rows: specify the number of rows away from the given cell. If the value entered is negative, the given cell shifts to the left.
  3. Columns: specify the number of columns away from the given cell. If value is negative, the cell shifts up.

Note that height and width are optional. They are used to specify the height and width of the returned range in cells. You can insert the OffSet() formula in any cell in the worksheet, except obviously, the cells from which you want the offset.

Combining Range() with OffSet()

The OffSet property is usually used in tandem with the Range property to specify a new location. Let’s take a look at this example

Range("B1").Offset(RowOffSet:=1, ColumnOffset:=1).Select

This code will select C2. The parameter RowOffSet is used to move 1 row from cell B1. Similarly, the parameter ColumnOffSet is used to move 1 column from cell B1. Note that the parameters have to be separated by a comma.

An easier way to accomplish the same result is to use a shorthand method, like we show below

 Range("A1").Offset(1, 1).Select.

Here we only specified the numbers for the row and column offset. VBA will internally “know” that the first one is for the row offset, while the second one is for the column offset.  If you’d like to explore the Range() function more, you can take a look at our course on VBA macros. Now, let’s move on to some more examples.

How to Specify Only Rows

It’s possible to specify just the rows and not the columns. Here’s how you can do it.

 Range("B1").Offset(1).Select

Here we’ve omitted the column parameter and its comma. This code results in only moving 1 row down from the original cell location. It will select the entire row, not just a single cell.

How to Specify Only Columns

Similarly it’s possible to just specify the columns and omit the rows. The code will look like this:

 Range("B1").Offset(, 1 ).Select

The comma is necessary for Excel to know that only column offset has been set.

How to Specify Negative OffSet

Can you guess how to do this? It’s simple enough. Here’s the code

Range("D2").Offset(-1, -1 ).Select

This makes the selection go up 1 row and 1 column from the starting position. That is from cell D2 we move up to cell C1.

How to OffSet a Range of Cells

It is also possible to specify more than one cell for the Range. Say you want to select or get the offset for a range of cells

Range("B1:D4").Offset(1, 1).Select

Here, we start off with the range of cells from B1 to D4. The objective is to offset this complete range of cells by 1 row and 1 column. The new range of cells will be from C2 to E5.

Combining Active Cell with Offset

The active cell refers to the currently selected cell. Let’s check a few examples that involve active cells. Here is the code to move one cell down from the currently selected cells is

 ActiveCell.Offset(1,0).Select

Combining Active Cell with Range() and Offset()

The following code selects a cell in addition to four more to the right which are to be copied/pasted in another location.

 Range(ActiveCell,ActiveCell.Offset(0,4)).Copy

Take note that there is a comma after the first ActiveCell instance and a double closing parenthesis before the Copy. Let us now  move on to cover simple programs that use OffSet functionality to obtain desired results.

Example 1: To Count the Rows in an Excel Worksheet

Sub CountNumRows()
Dim Count1 as Long
Count1 = 0
Do
Count1 = Count1 + 1
ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActiveCell.Offset(0, 1))
MsgBox "There are" Count1 "Rows"
End Sub

In this program, we declared Count1 as a variable of type long. Count is incremented by 1. Then OffSet() is used to loop through the rows. When an empty row is encountered the loop terminates. The variable count1 contains the total number of rows.MsgBox() displays a pop-up box with the total number of rows.

Example 2: Combining Range with OffSet to Fill a Range of Cells with Even Numbers from 1 to 100.

Sub prog1()
Dim Num
Num = 0
For Row = 0 To 9
For Col = 0 To 9
Range(“A1”).Offset(Row, Col).Value = Num
Num = Num + 2
Next Col
Next Row
End Sub

In this program, A1 is the given cell and the resultant range is from A1 to J10. Variable Num is initialized to zero and is incremented by the value 2 each time in the loop. The resultant range of cells contain each and every even number without duplicates from 1 to 100.

Hope you found the offset function useful, and can now use it in your own programs.  We have just covered the tip of the iceberg. There’s lots more to it. You can check out more details with this ultimate VBA course, and if you’d like to hop over to advanced Macros we just the right course with Mr Excel!

Смещение относительно текущей ячейки

The_Immortal

Дата: Четверг, 19.06.2014, 12:58 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Всех приветствую!

Друзья, подскажите, пожалуйста, незнающему как сместиться относительно известного адреса ячейки?

Вот мое безобразие:

[vba]

Код

Sub Search()

           For i = 1 To Application.ActiveWorkbook.Sheets.Count
         With Worksheets(i).Range(«A1:C30»)
             Set isFound = .Find(«Фамилия, имя,», LookAt:=xlPart)

                           If Not isFound Is Nothing Then
                 MsgBox («Got it! The address is » & isFound.Address)
             End If
         End With
     Next i

End Sub

[/vba]

В isFound.Address сидит адрес обнаруженной ячейки. Теперь мне надо, скажем, переместиться на 2 строки вниз и на один столбец вправо от текущей ячейки. Как это сделать?

Спасибо!

 

Ответить

nilem

Дата: Четверг, 19.06.2014, 13:16 |
Сообщение № 2

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

[vba]

Код

If Not isFound Is Nothing Then
     isFound.Offset(2, 1).Value = «asdasd» ‘на 2 строки вниз и на один столбец вправо
     ‘или
‘    isFound(3, 2).Value = «asdasd» ‘то же самое
End If

[/vba]


Яндекс.Деньги 4100159601573

 

Ответить

The_Immortal

Дата: Пятница, 20.06.2014, 14:43 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Благодарю!

А можно как-то выдрать номер столбца и номер строки из isFound (Range)? Смещение мне не очень подходит, оказывается…

 

Ответить

_Boroda_

Дата: Пятница, 20.06.2014, 14:52 |
Сообщение № 4

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Адрес[vba]

Код

qq=.Find(«Фамилия, имя,», LookAt:=xlPart).Address

[/vba]
Строка[vba]

Код

qq=.Find(«Фамилия, имя,», LookAt:=xlPart).Row

[/vba]
Столбец[vba]

Код

qq=.Find(«Фамилия, имя,», LookAt:=xlPart).Column

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Для движения по таблице используется функция.

переменная.Offset(RowOffset, ColumnOffset)

В качестве переменных может выступать как ячейка так и диапазон (Range) удобно пользоваться этой функцией для смещения относительно текущей ячейки.

Например, смещение ввниз на одну ячейку и выделение ее:

ActiveCell.Offset(1, 0).Select

Если нужно двигаться вверх, то нужно использовать отрицательное число:

ActiveCell.Offset(-1, 0).Select

Функция ниже использует эту возможность для того, чтобы пробежаться вниз до первой пустой ячейки.

Sub beg()
	Dim a As Boolean
	Dim d As Double
	Dim c As Range
	a = True
	Set c = Range(ActiveCell.address)
	c.Select
	d = c.Value
	c.Value = d
	While (a = True)
		ActiveCell.Offset(1, 0).Select
		If (IsEmpty(ActiveCell.Value) = False) Then
			Set c = Range(ActiveCell.address)
			c.Select
			d = c.Value
			c.Value = d
		Else
			a = False
		End If
	Wend
End Sub
 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Доброго времени суток!

Подскажите, пожалуйста, макрос для одновременного сдвига ячеек столбцов А, I (красный цвет) вниз на одну ячейку.
Или, может, макрос, который сможет центрировать ячейки (красный цвет) относительно ячеек столбца В, игнорируя ячейки, ниже которых есть непустые. Количество ячеек, относительно которых нужно центрировать, будет всегда разным.

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

А что делать, если
1. Будет всего две строки между зелёными?
2. Будет три подряд красных?

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Юрий М,вот так будет. А 3 подряд красных в изначальном варианте никогда не будет.

Прикрепленные файлы

  • 2.jpg (35.29 КБ)

Изменено: flower17.08.2019 22:00:33

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

Ещё вопрос: красные в столбцах 1 и 9 всегда синхронно?

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

А можно заменить условное форматирование обычной заливкой?

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Юрий М,для зеленого цвета? можно, но с ним мне удобней ориентироваться по листу

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

С УФ будут проблемы. По крайней мере у меня.

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Юрий М,у меня есть вот такой макрос, но он не подходит для моего случая, таблица изменилась.
не могу найти, как здесь правильно макрос оформить.

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

#10

17.08.2019 22:38:47

Юрий М,

Код
Sub ToCentre()
  Dim Lr&, R&, R1&, rg As Range
  Lr = ActiveCell.End(xlDown).Row:   Set rg = ActiveCell.Offset(0, -1)
  Do While R < Lr
    If Not IsEmpty(rg.Offset(1, 0)) Then R = rg.Row + 1 Else R = rg.End(xlDown).Row - 1: If R > Lr Then R = Lr
    If R - rg.Row > 3 Then
      R1 = Int((rg.Row + R) / 2): Cells(R1, 1) = rg:  Cells(R1, 9) = rg.Offset(0, 
      rg = Empty:  rg.Offset(0,  = Empty
    End If
    Set rg = Cells(R, 1)
  Loop
End Sub 

Изменено: flower17.08.2019 22:40:32

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Юрий М,что такое УФ?) поняла) ну раз так, то, конечно, можно его убрать

Изменено: flower17.08.2019 22:48:13

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

УФ — условное форматирование. Насколько я помню, в 2003 ещё не было возможности с помощью VBA работать с УФ.

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Юрий М,вы привязываетесь к цветам ячеек? Макрос, что выше в сообщении, работал, пока не появились в таблице одиночные строки (поз.3 и 7). Т.е. он останавливается на этих строках и если его запустить ниже, то работает некорректно.

Изменено: flower17.08.2019 22:57:02

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

На работе — отвлекают, гады ))
См. вариант.

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

Юрий М, Спасибо! Опробовала макрос на другой табличке, не везде центрирует (лист 2 — новая табличка, лист 3 — результат).

а макросы для разового синхронного смещения вниз (вверх) ячеек столбцов А и I (чтобы макрос запускался, когда активна нужная ячейка столбца А), чтобы при этом все остальные ячейки оставались на своих местах не подскажете? думаю, они тоже пригодились бы для разовых операций

Изменено: flower18.08.2019 11:50:05

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

#18

18.08.2019 16:48:08

Цитата
flower написал:
макрос на другой табличке, не везде центрирует

В предыдущем Вашем файле в блоке, ограниченном словами «запас» (от этого и отталкивался), всегда было не более двух красных ячеек. Теперь есть и три. Следовательно, на такой таблице макрос будет работать не корректно. Напишите в ячейке С18 слово «запас» и всё сработает правильно. Другими словами: макрос «центрирует» между строками, в которых имеется слово «запас».

 

flower

Пользователь

Сообщений: 58
Регистрация: 03.04.2017

#19

20.08.2019 14:52:02

Юрий М,все, разобралась, спасибооо!!! :-)

Если не спросить — никогда не узнаешь, если знаешь — нужно лишь спросить.

Понравилась статья? Поделить с друзьями:
  • Смещение ячеек excel формула
  • Смещение формул в excel
  • Смещение таблиц в word
  • Смещение таблиц в excel
  • Смещение оси в excel