Offset(RowOffset, ColumnOffset) — КиберПедия 

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

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Offset(RowOffset, ColumnOffset)

2020-12-08 151
Offset(RowOffset, ColumnOffset) 0.00 из 5.00 0 оценок
Заказать работу

Скрытые перемещения

Я решил выделить отдельный урок, в котором будут описаны относительные команды скрытых перемещений по книге. Например каким образом возможно выполнить перемещение курсора на 3 столбца влево и на 6 строк вниз относительно активной ячейки. Это бывает очень удобно когда вы работаете с одними и теми же данными, с одинаковыми таблицами, из которых Вам надо выделить только определённые значения, скопировать их или наоборот оставить только их, а всё остальное удалить. При этом у Вас всё время выполняется одна и таже операция, которая уже надоела. Почему бы не написать готовый макрос, который будет работать и опираться на определённую ячейку таблицы - активную ячейку. Именно это я и решил собрать всё в одном уроке - Скрытые перемещения.

Относительные перемещения

Рассмотрим команду относительного перемещения, которая называется:

Offset(RowOffset, ColumnOffset)

RowOffset - это на сколько строк вверх или вниз необходимо сделать перемещение. Может принимать как положительные значения (при перемещении вниз), так и отрицательные значения (при перемещении вверх);
ColumnOffset - это на сколько столбцов влево или вправо необходимо сделать перемещение. Может принимать как положительные значения (при перемещении вправо), так и отрицательные значения (при перемещении влево);

Sub Primer()     ActiveCell.Offset(0, 2).Select '1     ActiveCell.Offset(4, 0).Select '2     ActiveCell.Offset(-2, 0).Select '3     ActiveCell.Offset(0, -2).Select '4 End Sub

В первом случае курсор выделит ячеку находящуюся на 2 ячейки вправо от активной ячейки. Во втором случае выделится ячейка находящаяся на 4 строки вниз от предыдущей - активной ячейки. В третьем случае выделится ячейка находящаяся на две строки выше от предыдущей - активной ячейки. И в последнем случае выделится ячейка находящаяся на два столбца влево от предыдущей - активной ячейки.

В следующем примере показано как выделить столбец находящийся на два столбца правее от 4 столбца ("D"). Вместо цифры 4 можно использовать какую-то переменную, относительно которой уже будет происходить выполнение Вашего макроса.

Sub Primer()     Columns(4).Offset(0, 2).Select End Sub

Перемещаемся по листам не зная их имён

Иногда возникает необходимость выполнить перемещение по листам, но при этом их имена постоянно меняются или Вы делаете такую программу, в которой Вы заранее не знаете имена листов, но перемещаться в ней по этим листам как-то надо. Для этого можно воспользоваться записью относительной:

Sheets(X)

Sheets - это лист;
(X) - это номер листа;

Ниже на примере показано как можно выделить лист №2, и не важно какое у него имя, второй по счёту лист будет выделен:

Sub Primer()     Sheets(2).Select End Sub

Лист можно не только выделить, но и перименовать и дальше испоьлзовать в программе ваше имя.

Sub Primer()     Sheets(2).Name = "Пример" End Sub

Крайние перемещения

Возможно кто-то уже задавался вопросом: "Как определить край таблицы или последний заполненный столбец, строку?" Вот тут я и покажу как определить последнюю заполненную ячейку. Зная эту ячейку можно определить конечную координату таблицы, которую в последствии можно успешно обработать. Ниже показан пример выделения конечных ячеек относительно текущей.

Sub Primer()     Selection.End(xlToRight).Select '1     Selection.End(xlUp).Select '2     Selection.End(xlToLeft).Select '3     Selection.End(xlDown).Select '4 End Sub

1 - это выделение крайней правой яейки;
2 - это выделение самой верхней ячейки;
3 - это выделение крайней левой ячейки;
4 - это выделение нижней заполненной ячейки;

При помощи этих команд можно не только выделять ячейки, но и сразу заносить в них данные без предварительного перемещения в них курсора, например:

Sub Primer()     Selection.End(xlToRight) = "Пример" End Sub

Относительные формулы

Некоторые наверно обращали внимание на то, что при записи макроса вводимые формулы имеют непонятый вид. Тут хотелось бы развеять все непонятки и показать, что в этих формулах нет ничего сложного, и в них всё логично, хоть они и выглядят по другому. Рассмотрим простую формулу сложения двух ячеек.

Sub Primer()     Cells(4, 5) = "=RC[-3]+RC[-1]"     Cells(5, 5) = "=R[-3]C+R[-1]C" End Sub

R - это строка, от слова Row;
C - это столбец, от слова Column;

В квадратных скобках указано на какое количество столбцов или строк необходимо переместится от заданной ячейки. Принцип отчёта такой же как и в команде рассмотренной самой первой в этом уроке - Offset. И как видно на примере, значения в квадратных скобках могут быть как отрицательные так и положительные.

В первом примере показано, что сумма в ячейке Cells(4, 5) равна сумме двух ячеек, одна из которых находится на третьем столбце влево от заданной ячейки, а другая на один столбец влево от заданной ячейки, при этом строка остаётся неизменной. На втором примере всё аналогично, только тут уже столбец остаётся неизменным а меняются строки.

Столбцы и строки

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

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

   Rows(6).Select   'Строка   Columns(6).Select 'Столбец

Это самая простая запись не требующая никаких кавычек, Вы просто указываете номер строки или столбца и дальше делаете с ней что угодно, например закрасить в синий цвет:

   Rows(6).Interior.ColorIndex = 5  'Строка   Columns(6).Interior.ColorIndex = 5 'Столбец

Если Вам необходимо выделить более одной строки или столбца, то можно воспользоваться следующей записью:

   Rows("2:2").Select   'Строка   Columns("B:B").Select 'Столбец

Такая запись выделяет только одну строку и только один столбец.
А вот если записать так:

   Rows("2:5").Select   'Строка   Columns("B:F").Select 'Столбец

то мы сможем обработать целый диапазон строк и столбцов, но он сплошной. Если мы хотим обработать разные строки, например 1, 4, 6-8, и разные столбцы, например B, D, F-G, то запись необходимо произвести следующим образом:

   Range("1:1,4:4,6:8").Select 'Строка   Range("B:B,D:D,F:G").Select 'Столбец

При такой записи у нас получается уже диапазон. И умногих возник вопрос: "Каким образом можно одновременно выделить и строки и столбцы?". Пример ниже выделяет одновременно 8 строчку и столбец D:

   Range("D:D,8:8").Select

А этот пример выделяет сразу несколько строк и столбцов одновременно:

   Range("B:B,D:D,3:6,9:9").Select

Error. Обработка ошибок

Ну вот и пришёл тот долгожданный день, когда Вы задумались об обработке ошибок. Хорошо когда в программах работаете только Вы, и Вы знаете куда в ней можно нажать, а куда не стоит потому что случится ошибка. Но если Вы пишите программу, в которой работает несколько человек помимо Вас и они понятия не имеют что в ней можно и что нельзя, и они обязательно будут тыкать туда куда нельзя, и эти ошибки Вас просто погубят, потому что все будут грешить на вашу программу.
Конечно же в любой программе необходимо предусмотреть "защиту от дурака", но иногда "дурак" превосходит все ожидания. Если честно, я редко пользуюсь командами для обработки ошибок. Стараюсь предусматривать все возможные варианты действий пользователя, но это иногда заставляет написать такую огромную защиту, что сама программа того не стоит. Вообщем приступим.


Скачать пример

Искусственно создадим ошибку. Самый простой способ - взять любое число и поделить его на ноль. Напишем простенькую программу и на ней будем рассматривать различные способы обхода ошибки.

   Sub primer1()   a = 10   b = InputBox("Введите число отличное от 0", "Ввод данных", "0")    c = a / b    MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"    End Sub

On Error

которая и говорит о том, что необходимо включить отслеживание ошибок. А команда GoTo уже перенаправит программу на то место, которое мы укажем. На примере нашей программе это можно продемонстрировать так:

   Sub primer1()   On Error GoTo errors   a = 10   b = InputBox("Введите число отличное от 0", "Ввод данных", "0")    c = a / b    MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"   GoTo Endprimer    errors:   MsgBox "Ошибка! Вводите корректные данные", vbCritical, "Ошибка"    Endprimer:   End Sub

Поясню. При возникновении ошибки, программа с места ошибки сразу перенаправится на errors: и уже будет продолжать выполнять код с этого места. То-есть с информационного сообщения о том, что у нас возникла ошибка, после этого сообщения программа так и продолжит выполнять макрос дальше, в данном случае программа просто закончится. В случае, если ошибки нет, нам покажется результат и код перенаправится на Endprimer:, так как туда нас перенаправил GoTo.
Если Вы не хотите чтобы макрос выполнялся дальше, то можно добавить команду для выхода из макроса Exit Sub (завершение выполнения текущего макроса).

   Sub primer1()   On Error GoTo errors   a = 10   b = InputBox("Введите число отличное от 0", "Ввод данных", "0")    c = a / b     MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"   GoTo Endprimer    errors:   MsgBox "Ошибка! Вводите кооректные данные", vbCritical, "Ошибка"   Exit Sub           Endprimer:   End Sub

Способ №4. Очистка ошибки

Если Вы написли программу, которая выполняется очень долго и в ней море ошибок, то вы можете просто напросто очистить эти ошибки и отследить их все, а в конечном сообщении вывести результат об ошибках. Делается это на подобии этого.

   Sub primer4()   On Error Resume Next   a = 10   b = InputBox("Введите число отличное от 0", "Ввод данных", "0")    c = a / b    MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"    If Err.Number <> 0 Then       p = Err.Number       Err.Clear       MsgBox "Ошибка " & p & " очищена!", vbInformation, "Уведомление"   End If    End Sub

Способ №5. Идём напролом

Если Вам наплевать на все ошибки и Вы даже не хотите о них слышать, то можно воспользоваться следующей записью.

   Sub primer5()   On Error Resume Next           a = 10   b = InputBox("Введите число отличное от 0", "Ввод данных", "0")    c = a / b    MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"    End Sub

При такой записи макрос будет продолжать выполняться не смотря на все ошибки.

Я думаю, что на основе этих примеров и уловок остальные способы обработки ошибок Вы сможете придумать сами, придумать такие, на какие Вам хватит фантазии.


Функция (отображение, оператор, преобразование) — математическое понятие, отражающее связь между какими-либо значениями. Можно сказать, что функция — это «закон», по которому одна величина зависит от другой величины.

Это стандартное определение, которое все знают из википедии. И в принципе уже всё понятно. Однако, хочу заметить, что в Excel, функция может быть и не математической. А, например, логической, финансовой или текстовой.

Большинство результатов можно добиться при пощи тех функций, которые имеютя в Excel. В этом занятии я покажу как можно создать свои собственные функции, если вам недостаточно базовых, которые заложены в Excel. Весь список функций, можно найти нажав вот на такую пиктограмму в строке формул

или на ленте выбрать вкладку Формулы и сразу откроется весь список имеющихся функций

Цифры прописью

Теперь рассмотрим другой пример. Создадим функцию, которая будет определять цифры от 1 до 10 и записывать их прописью.

Для этого в модуле запишем следующий код:

   Function Cifra(C As Variant)

       Select Case C

       Case 1

           Cifra = "Один"

       Case 2

           Cifra = "Два"

       Case 3

           Cifra = "Три"

       Case 4

           Cifra = "Четыре"

       Case 5

           Cifra = "Пять"

       Case 6

           Cifra = "Шесть"

       Case 7

           Cifra = "Семь"

       Case 8

           Cifra = "Восемь"

       Case 9

           Cifra = "Девять"

       Case 10

           Cifra = "Десять"

       Case Else

           Cifra = "Введены некорректные данные"

       End Select

   End Function

В связи с тем, что пользователь может записать вместо цифры буквы, то описываем переменную С значением Variant. Теперь остаётся только в ячейку В2 записать нашу функцию и всё будет готово.


 

Безусловно всем хотелось отобразить процесс выполнения макроса, сделать вот такой или что-то на подобии Progressbar.

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

Создадим форму, которую назовём Progressbar, на неё добавим два объекта - Label1 и Label2.
Label1 закрасим, например, в синий цвет и удалим весь текст из него - это и будет наша шкала, которая будет отображать процесс загрузки. В Label2 напишем Процесс загрузки данных:

Теперь создадим на листе 1 кнопку Загрузить данные, в коде которой будем вызывать созданную нами форму.

   Private Sub CommandButton1_Click()

       Progressbar.Show

   End Sub

Элементы формы Label находятся на панели инструментов Toolbox

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

Итак, пусть это будет обыкновенный цикл, который ставит ноли в ячейки (в очень много ячеек). Например такой:

   Sub Zapolnenie()

   Dim a As Byte

   Dim b As Byte

       For a = 1 To 250

           For b = 1 To 250

               Worksheets("Лист1").Cells(a, b) = 0

           Next b

       Next a

   End Sub

Теперь наша задача сделать так, чтобы нам появлялась форма и показывала процесс выполнения макроса.

Хочу обратить внимание на то, что я не случайно взял диапазон от 1 до 250.
250 - это ширина Label1 (синего цвета). Т.е. при выполнения выше указанной процедуры значение a будет передаваться на форму и будет отвечать за ширину Label1. Тобишь при увеличении в цикле значения а будет увеличиваться ширина Label1, т.е. она будет показывать процесс выполнения макроса.

Но пока что кнопка Загрузить данные никак не связана с самим циклом. Для этого мы в коде формы должны записать процедуру, которая будет запускать цикл Zapolnenie расположенный на модуле. Т.е. при запуске формы надо как-то активировать форму, для этого используем команду UserForm_Activate в названии макроса.

Теперь при активации формы у нас будет запускаться макрос с названием Zapolnenie

   Private Sub UserForm_Activate()

       Call Zapolnenie

   End Sub

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

   Sub Zapolnenie()

   Dim a As Byte

   Dim b As Byte

       For a = 1 To 250

       Progressbar.Label1.Width = a

       Progressbar.Repaint

           For b = 1 To 250

               Worksheets("Лист1").Cells(a, b) = 0

           Next b

       Next a

       Worksheets("Лист1").Range("A1:IP250") = ""

       Unload Progressbar

   End Sub

Как видно из кода мы добавили три строки.

Progressbar.Label1.Width = a - передаёт значение на форму и ширина Label1 изменяется;
Progressbar.Repaint - обновляем форму. Если это упустить, то мы не сможем наблюдать за процессом заполнения;
Unload Progressbar - выгружаем форму после завершения загрузки данных;
Worksheets("Лист1").Range("A1:IP250") = "" - очищаем ячейки от нолей.

Ну вот. Теперь всё работает так как мы хотели. Если кто-то что-то не понял, всегда можно скачать пример и разобраться.
В видеоролике продемонстрировано как это всё работает


 

Заставка приветствия
реализованная на UserForm

· Видеоурок по данной теме

И вот мы сделали программу, которой все пользуются. Но хотелось бы отличиться и приблизить программу к настоящей, полноценной.
Многие замечали, что при открытии большинства программ, нам появляется заставка приветствия (например у Total Commander, AIMP и т.д.). Давайте сделаем подобие, пусть при открытии книги нам на 2 секунды появляется такая вот картинка.

Для этого создадим новый документ, в котором создадим новую форму с именем Zstvk.

Теперь фоном этой формы сделаем нашу картинку. В профиле формы выбираем пункт Picture. И загрузим выбранную картинку. Придаём форме необходимые размеры, пишем в шапке "Приветствие" (строка Caption в профиле).

Чтобы форма появлялась при открытии книги необходимо добавить в книгу макрос, который срабатыват при открытии книги. Производим двойной щелчок мыши по вкладке "Эта книга" и добавляем туда код, который будет вызывать форму.

Private Sub Workbook_Open()     Zstvk.Show End Sub

Для того, чтобы форма появлялась на 2 секунды воспользуемся таймером.
Перейдём в код формы и выберем макрос, который срабатывает при активации формы.

Теперь добавим в этот код таймер.

Private Sub UserForm_Activate()     Application.OnTime Now + TimeValue("00:00:02"), "Vigruzit" End Sub

Vigruzit - это имя макроса, который сработает через 2 секунды. При помощи этого макроса заставка будет автоматически закрываться. Для этого добавим в книгу новый модуль и создадим в нём вот такой макрос.

Sub Vigruzit()     Unload Zstvk End Sub

Ну вот, всё готово. Сохраняем книгу закрываем и открываем. При этом нам появляется созданное окно приветствия.


 

Выпадающий список
ComboBox на UserForm

· Видеоурок по данной теме

Создадим в проекте форму с выподающим списком, в которой будет указан список некоторых сотрудников, которых необходимо "обработать".

Работа с ComboBox

Итак, добавим форму - пункт меню Insert/UserForm, и назовём её к примеру Vibor.
Теперь из панели инструментов добавим на неё ComboBox. Придаём ему необходимые размеры и расположение на форме.
Ну и кнопку добавим на форму, которая и будет обрабатывать данные выпадающего списка.

Выделим мышкой добавленный ComboBox и зададим ему имя Sotrudniki, дабы понятно было.

Добавим на лист в столбец А список произвольных не повторяющихся имён и кнопку, которая будет вызывать созданную форму.
Ниже показан код кнопки находящейся, на листе.

   Private Sub CommandButton1_Click()       Vibor.Show   End Sub

Ну вот, сотрудники готовы. Теперь их как-то надо загрузить в ComboBox, который находится на форме. Для этого заходим в код формы. Щёлкаем правой кнопкой мыши по ней в окне Project-VBAProject и выбираем пункт View Code.

Выбираем из выподающего списка UserForm и Initialize. Это тот код который будет инициализировать форму Vibor при её загрузке.

Теперь воспользуемся обычным циклом, который будет перебирать имена и записывать их в Combobox-Sotrudniki.
Код будет выглядеть таким образом:

   Private Sub UserForm_Initialize()   Dim Imena As String   Dim a As Byte    For a = 2 To 9 Step 1       Imena = Cells(a, 1)       Sotrudniki.AddItem Imena   Next a   End Sub

Imena - это строковая переменная, в которую записываются имена;
a - это числовая переменная, которая равна количеству имён (от 2 до 9, так как имена начинаются со второй строки и заканчиваются девятой строкой);
Sotrudniki.AddItem Imena - добавляет в выпадающий список имена из переменной Imena;
Cells(a, 1) - ячейка с переменной строкой и постоянным столбцом А, из которой заносятся имена в переменную Imena;

Теперь перейдём к самому главному - нажмём на кнопку Обработать, чтобы запустить форму.

Для того чтобы орабоать выбранное имя перейдём в код кнопки ОК и разместим следующий код.

   Private Sub CommandButton1_Click() 'Кнопка Ок   If Sotrudniki.Text = "" Then         MsgBox "Сотрудник не выбран", vbCritical, "Ошибка"   Else         MsgBox "Производим обработку данных сотрудника " & _           Sotrudniki.Text, vbExclamation, "Пример"   End If   End Sub

В этом коде говорится, что если сотрудник не выбран, то нам появляется первое критическое сообщение, если имя сотрудника указано, то нам выводится второе сообщение.

Application.ScreenUpdating

Application.ScreenUpdating - отвечает за обновление экрана и может принимать два значения - False (обновление экрана отключено) и True (обновление экрана включено). В коде это обычно прописывается в том месете, где происходит мелькание различных окон или видно как производится расчёт и происходит заполнение таблицы. Ниже показан пример заполнения ячеек, и данную команду вставили в начало и конец макроса, т.е. сначала отключаем обновление экрана, а потом включаем обновление экрана. При такой записи мы не увидим процесс заполнения ячеек. А вот если убрать эти команды, то мы сможем наблюдать за процессом заполнения этих ячеек.

   Sub Primer()   Application.ScreenUpdating = False   For a = 1 To 100       For b = 1 To 100           Cells(a, b) = "Пример"       Next b   Next a   Application.ScreenUpdating = True   End Sub

Application.Calculation

Application.Calculation - отвечает за автоматический расчёт в книге Excel и может принимать два значения - xlCalculationManual (ручной расчёт) и xlCalculationAutomatic (автоматический расчёт - по умолчанию установлен в Excel). Но тут есть одна осторожность, если вы перевели Excel в ручной расчёт, и в макросе произошла ошибка и он так и не выполнился до конца - т.е. не включился автоматический расчёт формул, то все ваши вычисления в дальнейшем будут в пустую. Так как формулы не будут автоматически пересчитываться, Excel превратиться в обычную таблицу. Но данная команда играет одну из основных ролей в быстроте выполнеия макроса. Вообщем лучше сделать код, который исключает ошибки, чтобы макрос полюбому выполнился и Excel перевёлся в автоматический расчёт. Если у Вас имеется большая таблица с многочисленными формулами, и часть вычислений вы производите при помощи макросов, то для быстроты выполнения расчётов разумно в начало и конец кода поместить команду Application.Calculation.

   Sub Primer2()   Application.Calculation = xlCalculationManual      ...................      ...................      ...................   Application.Calculation = xlCalculationAutomatic   End Sub

Application.EnableEvents

Application.EnableEvents - команда отвечающая за выполнение сторонних событий. Эту команду мы уже затрагивали в этом уроке. И она также может принимать два значения - это False (отключить собтие) и True (включить выполнение промежуточных событий). Но теперь ещё известно, что она играет значительную роль в скорости выполнения некоторых кодов макроса. Пример можно взять из Урока №23.

   Private Sub Worksheet_Change(ByVal Target As Range)       Application.EnableEvents = False           Target.Cells = "Привет"       Application.EnableEvents = True   End Sub

Application.DisplayAlerts

Application.DisplayAlerts - команда отвечающая за события в Excel. Может принимать два значения - False (отключаем запросы Excel) и True (включаем события Excel). Это чень интересная и полезная команда при помощи которой можно отключить запросы Excel, например, чтобы он не спрашивал нужно ли сохранить изменения в книге, или отключить запрос на совместимость версий Excel. Ниже приведён пример, в котором книга закрывает сама себя, при этом независимо от того внесли вы изменения или нет в книгу, при закрытии книги вам не поступит запрос "Сохранить изменения", а книга просто закроется без сохранения и уведомления пользователя.

   Sub Primer()   Application.DisplayAlerts = False       ThisWorkbook.Close        Application.DisplayAlerts = True   End Sub

Глобальное ускорение

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

   sub Primer()       Application.ScreenUpdating = False       Application.Calculation = xlCalculationManual       Application.EnableEvents = False       Application.DisplayStatusBar = False       Application.DisplayAlerts = False        .........................        .........................        .........................        .........................       Application.ScreenUpdating = True       Application.Calculation = xlCalculationAutomatic       Application.EnableEvents = True       Application.DisplayStatusBar = True       Application.DisplayAlerts = True   End Sub

 

Скрытые перемещения

Я решил выделить отдельный урок, в котором будут описаны относительные команды скрытых перемещений по книге. Например каким образом возможно выполнить перемещение курсора на 3 столбца влево и на 6 строк вниз относительно активной ячейки. Это бывает очень удобно когда вы работаете с одними и теми же данными, с одинаковыми таблицами, из которых Вам надо выделить только определённые значения, скопировать их или наоборот оставить только их, а всё остальное удалить. При этом у Вас всё время выполняется одна и таже операция, которая уже надоела. Почему бы не написать готовый макрос, который будет работать и опираться на определённую ячейку таблицы - активную ячейку. Именно это я и решил собрать всё в одном уроке - Скрытые перемещения.

Относительные перемещения

Рассмотрим команду относительного перемещения, которая называется:

Offset(RowOffset, ColumnOffset)

RowOffset - это на сколько строк вверх или вниз необходимо сделать перемещение. Может принимать как положительные значения (при перемещении вниз), так и отрицательные значения (при перемещении вверх);
ColumnOffset - это на сколько столбцов влево или вправо необходимо сделать перемещение. Может принимать как положительные значения (при перемещении вправо), так и отрицательные значения (при перемещении влево);

Sub Primer()     ActiveCell.Offset(0, 2).Select '1     ActiveCell.Offset(4, 0).Select '2     ActiveCell.Offset(-2, 0).Select '3     ActiveCell.Offset(0, -2).Select '4 End Sub

В первом случае курсор выделит ячеку находящуюся на 2 ячейки вправо от активной ячейки. Во втором случае выделится ячейка находящаяся на 4 строки вниз от предыдущей - активной ячейки. В третьем случае выделится ячейка находящаяся на две строки выше от предыдущей - активной ячейки. И в последнем случае выделится ячейка находящаяся на два столбца влево от предыдущей - активной ячейки.

В следующем примере показано как выделить столбец находящийся на два столбца правее от 4 столбца ("D"). Вместо цифры 4 можно использовать какую-то переменную, относительно которой уже будет происходить выполнение Вашего макроса.

Sub Primer()     Columns(4).Offset(0, 2).Select End Sub

Поделиться с друзьями:

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.102 с.