Target в vba excel что это

Событие Worksheet.SelectionChange, используемое в VBA Excel для запуска процедур при выборе диапазона на рабочем листе, в том числе отдельной ячейки.

Синтаксис процедуры, выполнение которой инициируется событием Worksheet.SelectionChange:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

‘Операторы процедуры

End Sub

Эта процедура VBA Excel запускается при смене на рабочем листе выделенного диапазона (SelectionChange). Она должна быть размещена в модуле рабочего листа Excel, смена выбранного диапазона ячеек которого будет инициировать ее запуск.

Аргумент Target — это новый выбранный диапазон на рабочем листе.

Шаблон процедуры можно скопировать и вставить в модуль рабочего листа, но не обязательно. Если открыть модуль нужного листа, выбрать в левом верхнем поле объект Worksheet, шаблон процедуры будет добавлен автоматически:

Выбор события Worksheet.SelectionChange в модуле рабочего листа

У объекта Worksheet есть и другие события, которые можно выбрать в правом верхнем поле модуля рабочего листа. Процедура с событием SelectionChange добавляется по умолчанию.

Примеры кода с Worksheet.SelectionChange

Пример разработчика

Замечательный пример дан на сайте разработчика:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   With ActiveWindow

      .ScrollRow = Target.Row

      .ScrollColumn = Target.Column

   End With

End Sub

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

Эта процедура работает и при выборе ячейки через адресную строку (слева над обозначениями столбцов), и при выборе из кода VBA Excel, например:

Выбор одной отдельной ячейки

Инициируем выполнение основных операторов процедуры с событием Worksheet.SelectionChange выбором одной отдельной ячейки:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Address = «$E$5» Then

        MsgBox «Выбрана ячейка E5»

    End If

End Sub

Основной оператор MsgBox "Выбрана ячейка E5" будет выполнен при выборе ячейки E5.

Примечание:
В условии примера используется свойство Address переменной Target, так как в прямом выражении Target = Range("E5") по умолчанию сравниваются значения диапазонов. В результате этого, при выборе другой ячейки со значением, совпадающим со значением ячейки E5, равенство будет истинным и основные операторы будут выполнены, а при выборе более одной ячейки, будет сгенерирована ошибка.

Выбор диапазона с заданной ячейкой

Выполнение основных операторов процедуры при вхождении заданной ячейки в выбранный диапазон:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Not Intersect(Target, Range(«B3»)) Is Nothing Then

        MsgBox «Ячейка B3 входит в выбранный диапазон»

    End If

End Sub

Основной оператор MsgBox "Ячейка B3 входит в выбранный диапазон" будет выполнен при выделении диапазона, в который входит ячейка B3, в том числе и при выделении одной этой ячейки.

Выбор ячейки в заданной строке

Инициируем выполнение основных операторов процедуры с событием Worksheet.SelectionChange выбором любой отдельной ячейки во второй строке:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count > 1 Then Exit Sub

        If Target.Row = 2 Then

            MsgBox «Выбрана ячейка во второй строке»

        End If

End Sub

Дополнительный оператор If Target.Count > 1 Then Exit Sub необходим для выхода из процедуры при выделении более одной ячейки. Причина: при выделении произвольного диапазона, ограниченного сверху второй строкой, выражение Target.Row = 2 будет возвращать значение True, и операторы в блоке If ... End If будут выполнены.

Ввод даты в ячейку первого столбца

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count > 1 Or Target.Row = 1 Or Target.Row = ActiveSheet.Rows.Count Then Exit Sub

        If Target.Column = 1 And Target.Offset(1, 0) <> «» And Target.Offset(1, 0) = «» Then

            Target = Format(Now, «DD.MM.YYYY»)

        End If

End Sub

Этот код VBA может быть полезен при ведении реестра, базы данных на листе Excel с записью текущей даты в первой колонке.

Условие If Target.Count > 1 Or Target.Row = 1 Or Target.Row = ActiveSheet.Rows.Count Then Exit Sub завершает процедуру при выборе более одной ячейки, при выборе ячейки A1 и при выборе последней ячейки первого столбца.

Выбор ячейки A1 приводит к ошибке при проверке условия Target.Offset(-1, 0) <> "", так как происходит выход за границы диапазона рабочего листа.

Ошибка выхода за пределы рабочего листа происходит и при проверке условия Target.Offset(1, 0) = "", если выбрать последнюю ячейку первой колонки.

Примечание:
Текущая дата будет введена в следующую пустую ячейку первого столбца при переходе к ней от заполненной в том числе нажатием клавиши «Enter».

Пример без отслеживания Target

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If [B1] > 100 Then

        [A1].Interior.Color = vbGreen

    Else

        [A1].Interior.Color = vbBlue

    End If

End Sub

После ввода значения в ячейку B1, можно нажать Enter или кликнуть по любой другой ячейке рабочего листа, и событие Worksheet.SelectionChange сработает.


Return to VBA Code Examples

This article will demonstrate the use of VBA Target.Address.

vba target address selection change event

Target.Address

Target is the given name of the Range object variable that is contained in the argument of Worksheet Object Events, such as Worksheet_SelectionChange.

This event is triggered when you move from one cell to another in your worksheet.

To create a Worksheet Event, on the VBE Editor, select the appropriate worksheet and then, in the Object drop down box, select Worksheet.

vba target address worksheet

Consider the following code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$F$2" Then
    Range(Target.Address).Font.Bold = True
  End If
End Sub

Whenever you move your cursor this event will run and the IF Statement will test if the selected cell is F2. If it is, the cell will be set to Bold.

NOTE: The Target.Address is an absolute ($F$2), so when checking to see if you are on the appropriate cell, you must use $ signs in your string (“$F$2”).

The Target Range (and therefore the Target.Address method) is also avaialable with the Worksheet_Change; Worksheet_BeforeDoubleClick and Worksheet_BeforeRightClick event procedures in your Worksheet object.

13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

1

объясните самоучке

26.01.2016, 20:52. Показов 23145. Ответов 28


Студворк — интернет-сервис помощи студентам

Люди добрые, подскажите плиз как обращаться с этим зверем: «Private Sub Worksheet_Change(ByVal Target As Range)»
В литературе типа VBA для чайников и прочей написано кратко: Хочешь, чтобы макрос срабатывал при изменении ячейки, применяй Private Sub Worksheet_Change(ByVal Target As Range). Но я понять не могу как обозначить Target. Чего не делаю — или ошибки вылезают или просто не работает. Выкручиваюсь назначением кнопки на запуск макроса, но хотелось бы освоить сию возможность.
Не прошу разжевать (хотя, если у кого хватит терпения, готов внимать пояснения), подскажите где посмотреть. Свою задачу выкладывать тоже бессмысленно, т.к. не хочу, чтобы ее решили, хочу решить самостоятельно (хватит уже на Вашей шее сидеть)
Спасибо.



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

26.01.2016, 20:57

2

Цитата
Сообщение от teplovdl
Посмотреть сообщение

Но я понять не могу как обозначить Target

Что значит «обозначить» ?



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

26.01.2016, 21:00

3

teplovdl, сделайте поиск по этому разделу по фразе Worksheet_Change — примеров полно.
Если кратко — это процедура обработки события. Если пользователь (или макрос, или другая программа) меняет содержимое какого-то диапазона — происходит вызов этой процедуры, и Target содержит ссылку на измененный диапазон. Попробуйте для начала

Visual Basic
1
2
3
Private Sub Worksheet_Change(ByVal Target As Range)
  MsgBox Target.Address
End Sub

Код необходимо вставить в модуль листа (правый клик по ярлычку листа — Исходный текст).



1



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

26.01.2016, 21:05

 [ТС]

4

Может не правильно выразился, хотел сказать следующее. В теле данной процедуры как я понял необходимо определить что есть target, например target.cell или что-то в этом роде. Например есть желание, чтобы процедура срабатывала для ячеек определенного столбца, значит я должен это обозначить (назначить target). Может есть какой-нибудь синтаксис данной процедуры… но что-то мне не встречался.



0



Аксима

6076 / 1320 / 195

Регистрация: 12.12.2012

Сообщений: 1,023

26.01.2016, 21:12

5

Цитата
Сообщение от teplovdl
Посмотреть сообщение

чтобы процедура срабатывала для ячеек определенного столбца

…можно написать так:

Visual Basic
1
2
3
4
5
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target,Range("B:B")) Is Nothing Then
        MsgBox "Вы изменили ячейку(ки) столбца B: " & Intersect(Target,Range("B:B")).Address
    End If
End Sub

В обработчик события Worksheet_Change всегда передается ссылка на измененный диапазон.

С уважением,

Аксима



1



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

26.01.2016, 21:22

 [ТС]

6

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

Добавлено через 3 минуты

Цитата
Сообщение от Аксима
Посмотреть сообщение

Последний раз редактировалось Аксима; Сегодня в 23:16. Причина: Поправка — не ячейка, а диапазон.

А почему так, потому что (ByVal Target As Range)? и в качестве Target нужно всегда диапазон указывать? Тогда как быть с примером Казанский, где просто на адрес ссылаются?



0



Shersh

Заблокирован

26.01.2016, 21:40

7

Цитата
Сообщение от teplovdl
Посмотреть сообщение

в качестве Target нужно всегда диапазон указывать?

Ничего не надо указывать — он уже указан Excel`ем. Пример Казанского выдал адрес измененного диапазона, пример Аксимы — адрес ячеек, измененных в столбце [B:B].



0



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

26.01.2016, 21:43

 [ТС]

8

Цитата
Сообщение от Shersh
Посмотреть сообщение

Ничего не надо указывать

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



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

26.01.2016, 22:00

9

Цитата
Сообщение от teplovdl
Посмотреть сообщение

зачем тогда в теле процедуры нужно обязательно писать Target

Можете не писать
Но в чём тогда смысл кода? Просто сообщить что что-то на листе изменилось? Тоже вариант… хотя обычно это и так изменившему известно.



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

26.01.2016, 22:07

10

Цитата
Сообщение от teplovdl
Посмотреть сообщение

зачем тогда в теле процедуры нужно обязательно писать Target

В теле процедуры Вы можете не использовать Target. Например, по событию изменения листа Вы хотите просто увеличить какую-то переменную на 1.
Вы не обязаны называть переменную именно Target. Процедура может быть не «Private».

Visual Basic
1
2
3
Sub Worksheet_Change(ByVal vasya As Range)
  MsgBox vasya.Address
End Sub

, но «ByVal» и «As Range» должно присутствовать обязательно, т.к. диспетчер событий приложения вызывает процедуру в расчете на такой способ передачи и тип аргумента.



1



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

26.01.2016, 22:12

 [ТС]

11

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Но в чём тогда смысл кода? Просто сообщить что что-то на листе изменилось? Тоже вариант… хотя обычно это и так изменившему известно.

Я понимаю ваше юмористическое настроение. Попробовал бы я объяснять ребенку зачем яблоко кусать, ведь можно просто глотать…
Теперь теме. По мне так написал Private Sub Worksheet_Change(ByVal Target As Range) и она понимает, что если что-то на листе изменилось, то запускай процедуру. А тут нет,нужно Target куда то впихать. Книжек то или статей по этому поводу что ли нет? Понятно, что людям, которые эти проги уже спинным мозгом пишут практически на уровне рефлексов все понимают, трудно простому чайнику объяснить как ноги переставлять, чтобы пойти.



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

26.01.2016, 22:15

12

Цитата
Сообщение от teplovdl
Посмотреть сообщение

А тут нет,нужно Target куда то впихать.

Не обязательно впихивать



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

26.01.2016, 22:15

13

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



0



SoftIce

es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

26.01.2016, 22:16

14

Цитата
Сообщение от SoftIce
Посмотреть сообщение

Не обязательно впихивать

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
   'здесь вызываете нужный макрос, но он будет вызываться каждый раз при изменении любой ячейки.
 
 
   ' чтобы этого не происходило поставьте какое-нибудь условие, например
   if target.column=1 then ' при изменении ячейки в столбце А
      'вызов макроса
   end if
End Sub



3



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

26.01.2016, 22:23

 [ТС]

15

Цитата
Сообщение от Казанский
Посмотреть сообщение

Visual Basic
1
2
3
Sub Worksheet_Change(ByVal vasya As Range)
* MsgBox vasya.Address
End Sub

Т.е. если я хочу, чтобы процедура сработала для столбца 2 при изменении строк с 1 по 10, то я просто вместо (ByVal vasya As Range) пишу (ByVal i As Range), а потом в цикле указываю For i=1 to 10?

Добавлено через 4 минуты

Цитата
Сообщение от SoftIce
Посмотреть сообщение

Private Sub Worksheet_Change(ByVal Target As Range)
* *’здесь вызываете нужный макрос, но он будет вызываться каждый раз при изменении любой ячейки.
‘ чтобы этого не происходило поставьте какое-нибудь условие, например
* if target.column=1 then ‘ при изменении ячейки в столбце А
* * *’вызов макроса
* end if
End Sub

Извиняюсь, пишем друг другу одновременно, поэтому мои глупые вопросы отстают от Ваших пояснений. Но вообще становится уже понятнее. Хотя где то читал, что target нужно обязательно указывать. Может там и имелось ввиду, что (ByVal vasya As Range) обязательно должно быть, правда эта часть процедуры вроде сама подтягивается…



0



SoftIce

es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

26.01.2016, 22:31

16

Цитата
Сообщение от teplovdl
Посмотреть сообщение

что target нужно обязательно указывать

target или vasya Вам нужны.

Цитата
Сообщение от teplovdl
Посмотреть сообщение

Т.е. если я хочу, чтобы процедура сработала для столбца 2 при изменении строк с 1 по 10, то я просто вместо (ByVal vasya As Range) пишу (ByVal i As Range), а потом в цикле указываю For i=1 to 10?

Можно сделать, например так. Но это не единственный вариант.

Visual Basic
1
2
3
4
5
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Column = 2 And Target.Row <= 10 Then
         MsgBox Target.Address
   End If
End Sub



1



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

26.01.2016, 22:37

17

Лучше использовать пересечение диапазонов как выше написал Аксима.
И ещё нужно учитывать, что часто изменяются сразу одновременно много ячеек — что будете делать в этом случае?



1



13 / 13 / 0

Регистрация: 24.10.2015

Сообщений: 267

26.01.2016, 22:41

 [ТС]

18

Цитата
Сообщение от SoftIce
Посмотреть сообщение

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
* *If Target.Column = 2 And Target.Row <= 10 Then
* * * * *MsgBox Target.Address
* *End If
End Sub

Понятно… А что если в условии привычные нам i или j?

Добавлено через 3 минуты

Цитата
Сообщение от Hugo121
Посмотреть сообщение

И ещё нужно учитывать, что часто изменяются сразу одновременно много ячеек — что будете делать в этом случае?

Я уже понял, что Target нужно использовать для сокращения так сказать поля зрения процедуры. Скорее всего это единственное ее назначение. Если например пользователю открыт один столбец для внесения изменений, то вообще Target можно не использовать. Так?



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

26.01.2016, 22:44

19

В столбце бывает миллион ячеек… Конечно если не важно какая изменилась — можно не использовать.
И можно не использовать если открыта только одна ячейка листа — но всё равно как параметр эта переменная должна быть, выше ведь уже говорили.



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

26.01.2016, 22:46

20

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Лучше использовать пересечение диапазонов как выше написал Аксима.

Согласен , я старался сделать пример попроще для понимания.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

26.01.2016, 22:46

20

You may want to run your macro/VBA snippet when a cell changes its value, when a double click happens, when a sheet is selected, etc. In all these cases we use Worksheet Event Handler.  The Event Handler helps us run VBA code whenever a certain event occurs.

In this article, we will learn briefly about each Worksheet Event Handler.

What is a Worksheets Event Handler?

A worksheet event handler is a subroutine that is local to a worksheet module.

Where to write Worksheet Event Handler Code?

The worksheet Events are written in sheets objects only. If you write a worksheet event in some module or class module, there will be no error but they will just won’t work.

To write in the sheet object. Double click on it or right-click and click on view code. The code writing area will be shown.

How to write code for a specific event on the worksheet?

Now when you are in the editing mode, in the top-left corner dropdown menu you will see general. Click on the drop-down and select worksheet. Now in the top-right corner dropdown, all events will show. Choose whichever you need and a skeletal code for that event will be written for you.

Each event has a fixed procedure name. These are the reserved subroutine names. You can’t use them for other subroutines on a sheet. In a module, they will work as a normal subroutine.

Important: Each subroutine from that list will run on the specified event.
One type of worksheet event procedure can be written only once on one sheet. If you write two same event handling procedures on one sheet, it will result in an error and none of them will be executed. Of course, the error will be ambiguous subroutines.

Let’s learn briefly about each of the events.

1. The Worksheet_Change (ByVal Target As Range) Event

This event triggers when we make any change to containing worksheets (formatting excluded). If you want to do something if any change made in the entire sheet then the code will be:

Private Sub Worksheet_Change(ByVal Target As Range)
  'do somehting 
  Msgbox "done something"
End Sub

The «Target» is the Active cell always.

Another example: You may want to put date and time in Cell B1 if A1 changes. In that case, we use the worksheet_change event. The code would look like this:

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$A$1" Then
  Range("B1").Value2 = Format(Now(), "hh:mm:ss")
 End If
End Sub

This will target only the cell A1.

If you want to target a range then use the below example:

Run Macro If Any Change Made on Sheet in Specified Range

2. The Worksheet_SelectionChange(ByVal Target As Range) Event

As the name suggests, this event triggers when the selection changes. In other words, if your cursor is in Cell A1 and it moves to some other cell, the code in this subroutine will run.

The below code will change the active cells color if whenever it changes and if it is an even row.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Target.Row Mod 2 = 0 Then
    Target.Interior.ColorIndex = 22
 End If
End Sub

Now, whenever my cursor will move on even row, it will be colored. Odd row cells will be spared.

Another Example of the Worksheet_SelectionChange event:

Simplest VBA Code to Highlight Current Row and Column Using

3. The Worksheet_Activate() Event

This event is triggered when the event code containing sheet activates. The skeletal code for this event is:

Private Sub Worksheet_Activate()

End Sub

A simple example is showing the sheet name when it gets selected.

Private Sub Worksheet_Activate()

  MsgBox "You are on " & ActiveSheet.Name

End Sub

As soon as you will come on the sheet that contains this code, the event will run and will be shown a message that «You are on sheet name» (sheet2 is in my case).

4. The Worksheet_Deactivate() Event

This event triggers when leaving the code containing sheet. In other words, if you want to do something, like hiding rows or anything when you leave the sheet, use this VBA event. The syntax is:

Private Sub Worksheet_Deactivate()
'your code
'
End Sub

The below example Worksheet_Deativate event will simply pop up a message that you have left the master sheet, when you will leave this sheet.

Private Sub Worksheet_Deactivate()
  MsgBox "You Left The Master Sheet"
End Sub


5. The Worksheet_BeforeDelete() Event

This event triggers when you confirm the deletion of the VBA event containing sheet. The syntax is simple:

Private Sub Worksheet_BeforeDelete()

End Sub

The below code will ask you if you want to copy the content of the about-to-delete sheet.

Private Sub Worksheet_BeforeDelete()
    ans = MsgBox("Do you want to copy the content of this sheet to a new sheet?", vbYesNo)
    If ans = True Then
    'code to copy
 End If
End Sub

6. The Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Event

This event triggers when you double click on the targeted cell. The syntax of this VBA Worksheet Event is:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

End Sub

If you don’t set the target cell or range, it will fire on every double click on the sheet.
The Cancel variable is a boolean variable. If you set it True, the default action won’t happen. It means if you double click on the cell it won’t get into editing mode.
The below code will make the cell fill with a color if you double click on any cell.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True
Target.Interior.ColorIndex = 7

End Sub

The below code targets the cell A1. If it is already filled with the specified color then it will vanish the color. It is much like a like button or check box.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   If Target.Address = "$A$1" Then
   
   Cancel = True
    If Target.Interior.ColorIndex = 4 Then
        Target.Interior.ColorIndex = xlColorIndexNone
    Else
        Target.Interior.ColorIndex = 4
    End If
    
   End If
   
End Sub

7. The Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Event

This event triggers when you Right-Click on the targeted cell. The syntax of this VBA Worksheet Event is:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
   Cancel = True
   '
   'your code
   '
End Sub

The below code will fill the cell with value 1 if you right-click on it. It won’t show the default right-click options since we have set the «Cancel» Operator to True.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
   Cancel = True
   Target.Value = 1
End Sub

8. The Worksheet_Calculate() Event

If you want something to happen when a excel calculates a sheet, use this event. It will trigger whenever excel calculates a sheet. The syntax is simple:

Private Sub Worksheet_Calculate()
  '
   'your code
   '  
End Sub

6. The Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Event

This procedure will run when you click on a hyperlink on the sheet.  The basic syntax of this event handler is:

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    '
   'your code
   ' 

End Sub

You can set the target hyperlink if you want. If you don’t set the target hyperlink, it will get executed if you click on any hyperlink on the code containing sheet.

So yeah guys, these were some basic worksheet events that will be handy if you know about them. Below are some related articles that you may like to read.

If you have any doubts regarding this article or any other excel/VBA related article, let us know in the comments section below.

Related Articles:

Using Worksheet Change Event To Run Macro When any Change is Made | So to run your macro whenever the sheet updates, we use the Worksheet Events of VBA.

Run Macro If Any Change Made on Sheet in Specified Range | To run your macro code when the value in a specified range changes, use this VBA code. It detects any change made in the specified range and will fire the event.

Simplest VBA Code to Highlight Current Row and Column Using | Use this small VBA snippet to highlight the current row and column of the sheet.

Popular Articles:

50 Excel Shortcuts to Increase Your Productivity | Get faster at your task. These 50 shortcuts will make your work even faster on Excel.

The VLOOKUP Function in Excel | This is one of the most used and popular functions of excel that is used to lookup value from different ranges and sheets. 

COUNTIF in Excel 2016 | Count values with conditions using this amazing function. You don’t need to filter your data to count specific value. Countif function is essential to prepare your dashboard.

How to Use SUMIF Function in Excel | This is another dashboard essential function. This helps you sum up values on specific conditions.

Событие листа

Worksheet_SelectionChange

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

Заходим в окно VB, нажимая Alt+F11. Слева мы видим названия наших листов. Щёлкаем двойным щелчком по желаемому листу. Вверху имеется два окошка в которых по умолчанию написано General и Declarations.

Выбираем в левом окне Worksheets, а в правом SelectionChange.

После этого появится следующая запись кода:

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

      End Sub

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

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

          Selection.Interior.ColorIndex = 5

      End Sub

то какой бы мы диапазон не выделили на этом листе, он окрасится в синий цвет.

Хочу обратить внимание, что макрос работает только на том листе, который Вы выбрали слева в списке листов.

Рассмотрим ещё один пример, в котором будет выделяться всегда только одна ячейка на листе — активная ячейка (в видеоролике показано как это работает).

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

          ActiveCell.Select

      End Sub

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

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

          a = ActiveCell.Column

      If a < 10 Then

          MsgBox «Курсор находится на столбце №» & a & » — это меньше 10.», _

          vbInformation, «Пример»

      Else

          MsgBox «Курсор находится за пределами моего понимания!», _

          vbInformation, «Пример»

      End If

      End Sub

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

Worksheet_Change

Рассмотрим событие, которое возникает при редактировании ячейки. Т.е. мы внесли какие-то данные в ячейку, вышли из режима редактирования и при этом у нас сразу сработал какой-то макрос.
Делается это следующим образом. Заходим в окно VB, щёлкаем слева по листу, событие которого хотим отслеживать. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet и правом окошке Change.

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

      Private Sub Worksheet_Change(ByVal Target As Range)

      End Sub

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

      Stolbec = Target.Column

      Stroka = Target.Row

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

      Private Sub Worksheet_Change(ByVal Target As Range)

      Stolbec = Target.Column

      Stroka = Target.Row

      MsgBox «Отредактирована ячейка Cells(» & Stroka & «,» & Stolbec & «)», _

              vbInformation, «Пример»

      End Sub

Рассмотрим такой пример когда, после редактирования ячейки, её текст автоматически закрашивается в синий цвет, а ячейка окрашивается в жёлтый цвет.

      Private Sub Worksheet_Change(ByVal Target As Range)

          Target.Font.ColorIndex = 5 ‘синий

          Target.Interior.ColorIndex = 6 ‘жёлтый

      End Sub

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

      Private Sub Worksheet_Change(ByVal Target As Range)

          Target.Cells = «Привет»

      End Sub

А загрустим потому, что мы будем заносить в изменённую ячейку какие-то данные. То-есть мы опять её редактируем. Следовательно, как только макрос заносит данные в ячейку, он снова запускает сам себя. И у нас получается зацикливание. Для того чтобы этого не происходило мы используем дополнительную запись, которая блокирует запуск события в момент выполнения текущего.

      Private Sub Worksheet_Change(ByVal Target As Range)

          Application.EnableEvents = False

              Target.Cells = «Привет»

          Application.EnableEvents = True

      End Sub

Получается, что при выполнении макроса мы отключаем запуск события, затем прописываем в изменённую ячейку данные, затем снова включаем запуск сторонних событий. Вот при такой записи зацикливания не произойдёт. Попробуйте выполнить два выше указанных макроса через F8, и вы поймёте в чём разница этих двух записей, и когда именно неоходимо применять Application.EnableEvents.

Двойной щелчок мыши. BeforeDoubleClick

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

Что можно сделать при помощи такого макроса? Таблицы, в которых данные можно заносить при помощи двойного щелчка мыши. Например, устанавливать галочки напротив выбранных наименований.

Делается это следующим образом. Заходим в окно VB, щёлкаем слева по необходимому листу. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet, а правом окошке BeforeDoubleClick.

После этого появится следующие начало и конец макроса, который и отвечает за двойной щелчок мыши, производимый по ячейке.

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

      End Sub

Если в этот код поместить какое-нибудь информационное сообщение, то при двойном щелчке по ячейке, будет появляться это сообщение.

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

          MsgBox «Вы совершили двойной клик!», vbInformation, «Пример»

      End Sub

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

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

      Cancel = True

          MsgBox «Вы совершили двойной клик!», vbInformation, «Пример»

      End Sub

Cancel = True может принимать только два значения True или False и об этом указано в наименовании макроса Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean).

Но такая запись активизирует двойной щелчёк на всём листе, и это конечно хорошо, но иногда возникает потребность задействовать только часть листа, например только столбец А. На этом этапе мы уже начинаем придумывать какие-то условия. И это можно осуществить всё при помощи того же If … End If или Select Case … End Select.

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

          If ActiveCell.Column = 1 Then

              Cancel = True

              MsgBox «Вы совершили двойной клик!», vbInformation, «Пример»

          End If

      End Sub

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

Усложним пример. Сделаем так, как показано в начале урока на левом рисунке. Попробуем Установить галочки, причём не во всём столбце, а в некотором диапазоне, например В2:В8. Ниже приведён макрос, который может это осуществить.

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

      If Not Intersect(Target, Range(«B2:B8»)) Is Nothing Then ‘ищем пересечение в данном диапазоне

      Target.Font.Name = «Marlett» ‘Задаем текст при двойном шелчке и шрифт текста, в котором символ А и есть галочка

      Cancel = True

          If Target = «a» Then ‘Искомый текст

              Target.Interior.ColorIndex = 23 ‘цвет синий

              Target = «»

          Else

              Target = «a»

              Target.Interior.ColorIndex = 6

          End If

      End If

End Sub

Теперь самое время пояснить его составляющие.

If Not … Is Nothing Then — если производится действие в указанном диапазоне, то выполняем условие. Другими словами, если ячейка, по которой произвели двойной щелчок, попадает в диапазон В2:В8, то выполняем макрос дальше после слова Then;

Intersect(Target, Range(«B2:B8»)) — это указывает переменную, которая должна принимать участие в диапазоне В2:В8, т.е. пересекаться в этом диапазоне, в данном случае это изменяемая ячейка;

Target.Font.Name = «Marlett» — устанавливаем имя шрифта в ячейке, который и отвечает за галочку;

If Target = «a» Then … — если в редактируемой ячейке стоит галочка, то убираем её и закрашиваем ячейку в синий цвет. В противном случае устанавливаем галочку и закрашиваем ячейку в жёлтый цвет.

Ту же самую функцию можно осуществить через другую запись:

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

      St = Target.Column

      Sk = Target.Row

      If St = 2 And Sk > 1 And Sk < 9 Then

      Target.Font.Name = «Marlett»

      Cancel = True

          If Target = «a» Then

              Target.Interior.ColorIndex = 23

              Target = «»

          Else

              Target = «a»

              Target.Interior.ColorIndex = 6

          End If

      End If

      End Sub

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

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

В видеоматериале показаны примеры работ приведённых макросов, а также продемонстрирована полная запись их написания.

Правая кнопка мыши. BeforeRightClick

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

Делается это следующим образом. Заходим в окно VB, щёлкаем слева по листу, событие которого хотим отслеживать. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet и правом окошке BeforeRightClick.

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

      Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

      End Sub

И если в этот макрос вставить какое-нибудь информационное сообщение, то при нажатии на правую кнопку мыши на заданном листе, нам отобразится оно.

      Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

          MsgBox «Вы нажали на ПКМ», vbInformation, «Пример»

      End Sub

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

      Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

          Cancel = True

          MsgBox «Вы нажали на ПКМ», vbInformation, «Пример»

      End Sub

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

      Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

          Cancel = True

          a = ActiveCell.Column

          Select Case a

          Case 1

          ActiveCell.Interior.ColorIndex = 3

          Case 2

          ActiveCell.Interior.ColorIndex = 4

          Case 3

          ActiveCell.Interior.ColorIndex = 5

          Case 4

          ActiveCell.Interior.ColorIndex = 6

          Case 5

          ActiveCell.Interior.ColorIndex = 7

          Case Else

          ActiveCell.Interior.ColorIndex = xlNone

          End Select

      End Sub

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

Если выполнить вот такую запись:

      Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

          Cancel = True

      End Sub

то правая кнопка мыши просто напросто не будет «работать», то-есть меню не будет появляться.

Добавление своего раздела в меню правой кнопки мыши

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

    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

        Dim a As Object

        For Each a In Application.CommandBars(«cell»).Controls

            If a.Tag = «brccm» Then a.Delete

        Next a

            With Application.CommandBars(«cell»).Controls.Add(Type:=msoControlButton, _

            before:=1, temporary:=True)

               .Caption = «Окрасить ячейку»

               .OnAction = «cvet1»

               .Tag = «brccm»

            End With

            With Application.CommandBars(«cell»).Controls.Add(Type:=msoControlButton, _

            before:=2, temporary:=True)

               .Caption = «Обесцветить ячейку»

               .OnAction = «cvet0»

               .Tag = «brccm»

            End With

    End Sub

При выборе «Окрасить ячейку», выделенный диапазон заливается синим цветом. При нажатии на «Обесцветить ячейку», выделенный диапазон ячеек обесцвечивается.
Работу данного кода можно посмотреть на «Листе 3» в примере. На видеоролике так же можно посмотреть его работу.

Понравилась статья? Поделить с друзьями:
  • Synonyms of word expect
  • Target vba excel описание
  • Synonyms of word eat
  • Target offset vba excel
  • Synonyms of word design