Foreversoft.ru

IT Справочник
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel vba target

События в Excel

Термин “Событие Excel” используется для обозначения определённых действий, совершаемых пользователем в Excel. Например, когда пользователь переключает лист рабочей книги – это событие. Ввод данных в ячейку или сохранение рабочей книги – это тоже события Excel.

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

Например, чтобы макрос запускался каждый раз, когда пользователь переключает рабочий лист в книге Excel, нужно создать код VBA, который будет выполняться каждый раз при возникновении события SheetActivate рабочей книги.

А если нужно, чтобы макрос запускался каждый раз при переходе на какой-то определённый рабочий лист (например, Лист1), то код VBA должен быть связан с событием Activate для этого листа.

Код VBA предназначенный для обработки событий Excel, должен быть помещён в соответствующем объекте рабочего листа или книги в окне редактора VBA (редактор можно открыть нажатием Alt+F11). Например, код, который должен выполняться каждый раз при возникновении определённого события на уровне рабочего листа, должен быть размещён в окне кода для этого рабочего листа. Это показано на рисунке:

В редакторе Visual Basic можно посмотреть набор всех событий Excel, доступных на уровне рабочей книги, рабочего листа или диаграммы. Откройте окно кода для выбранного объекта и в левом выпадающем меню в верхней части окна выберите тип объекта. В правом выпадающем меню вверху окна будут показаны события, определённые для этого объекта. На рисунке ниже показан список событий, связанных с рабочим листом Excel:

Кликните по нужному событию в правом выпадающем меню, и в окно кода для этого объекта будет автоматически вставлена процедура Sub. В заголовке процедуры Sub Excel автоматически вставляет необходимые аргументы (если таковые имеются). Остаётся только добавить код VBA, чтобы определить, какие действия процедура должна выполнить, когда нужное событие будет обнаружено.

Пример

В следующем примере каждый раз при выборе ячейки B1 на рабочем листе Лист1 появляется окно с сообщением.

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

Событие Selection_Change происходит при любом новом выделении. Но нам нужно, чтобы набор действий был выполнен только при выделении ячейки B1. Для этого будем отслеживать событие только в заданном диапазоне Target. Как это реализовано в программном коде, показанном ниже:

Как отследить событие(например выделение ячеек) в любой книге?

Иногда при разработке надстройки просто необходимо отследить какое-либо событие в книге. Но модуль ЭтаКнига и модули листов надстройки позволяют отследить лишь те события, которые происходят в той книге, в которой этот код прописан. А как же другие книги? Как, например, отследить событие открытия любой книги в Excel и сделать какое-то действие в зависимости от имени открытой книги? Или как отследить выделение ячейки в любой книге? Изменение значений ячеек?

На самом деле все до смешного просто:
В модуле ЭтаКнига главной книги(надстройка либо PERSONAL.XLS) необходимо создать переменную, которая будет ссылкой на все приложение Excel

Private WithEvents App As Application

На событие открытия главной книги (той, в которой пишется код и в которой объявили переменную App — опять же это надстройка либо PERSONAL.XLS) присваиваем этой переменной App значение запущенного приложения Excel:

Читать еще:  Как из видео извлечь текст

Private Sub Workbook_Open() Set App = Application End Sub

Т.е. мы теперь имеем как бы свою локальную управляемую ссылку на Excel. Это позволит нам получить доступ к событиям приложения Excel из VBA и отследить их. И среди прочих событий есть такие, которые относятся ко всем открытым книгам. Т.е. то же выделение ячеек мы сможем обработать только внутри своей надстройки, но срабатывать оно будет при выделении ячеек в любой открытой книге.
Теперь создаем непосредственно событие — аналогично выбору других событий в книге в левом окне выбора объектов выбираем App. В правом появятся все доступные события для нашего объекта App:

в этом окне перечислены все события, которые могут быть «перехвачены» в любой открытой книге, а не только той, в которой этот код записан. Сразу после выбора какого-либо события из списка автоматически будет создана пустая процедура, в которую надо будет лишь добавить необходимый код.
Рассмотрим некоторые из этих событий.

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

Private Sub App_WorkbookOpen(ByVal Wb As Workbook) MsgBox «Вы открыли книгу:» & Wb.Name End Sub

Теперь при открытии любой книги будет появляться сообщение с именем именно открытой книги.
Wb — это переменная событийной процедуры. Для каждой процедуры они могут отличаться или вовсе отсутствовать. Но если они есть — значит можно их использовать. Например, в этой процедуре( App_WorkbookOpen ) Wb это открываемая книга, т.е. объект типа Workbook. И к ней можно обращаться как к любой книге: перебрать листы, изменить какие-то свойства и т.п. Например, в коде выше я просто вывожу в информационное окно с именем открываемой книги.

Сам по себе код не заработает. Т.к. назначение значения переменной App происходит только при открытии самой книги(надстройки или PERSONAL), то после создания кодов надо будет сохранить эту книгу и открыть заново

А с помощью этого кода можно отследить создание новой книги :

Private Sub App_NewWorkbook(ByVal Wb As Workbook) MsgBox «Вы создали новую книгу» End Sub

Отслеживаем выделение ячеек во всех открытых книгах :

Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) MsgBox «Вы выделили ячейку с адресом: » & Target.Address End Sub

Target — это объект Range(ячейка или диапазон ячеек), которые были выделены в книге.
Sh — это объект Worksheet, ячейки которого были выделены.
Таким образом у нас есть две переменные, которые мы можем использовать. Например, можно производить определенные действия только на листах с конкретным именем:

Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = «Отчет» Then MsgBox «Вы выделили ячейку с адресом: » & Target.Address End If End Sub

А процедура ниже поможет отследить изменение значений ячеек во всех открытых книгах и отменить нежелательные изменения:

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim bUndo As Boolean If Sh.Name <> «Для изменений» Then If Sh.Name = «Описание» Then ‘для этого листа можно изменять только ячейки диапазона «A16:B20» If Intersect(Target, Sh.Range(«A16:B20»)) Is Nothing Then MsgBox «На этом листе изменять можно только ячейки в диапазоне ‘A16:B20’!», vbCritical, «www.excel-vba.ru» bUndo = True End If Else ‘для всех других листов, кроме листа «Для изменений» — изменять значения ячеек вообще нельзя MsgBox «Ячейки на этом листе нельзя изменять!», vbCritical, «www.excel-vba.ru» bUndo = True End If If bUndo Then With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End If End Sub

В приложенном к статье файле будет чуть более понятно что делает эта процедура.

Читать еще:  Диалоговое окно в excel

Естественно, в таких процедурах можно назначить выполнение и других(нужных) действий. Например, вызов макроса ( Call ИмяМакроса ). Макрос в таком случае должен быть размещен в стандартном модуле и иметь статус Public (или вовсе без статуса). Сам модуль должен тоже находится в той же книге.

Tips_Macro_How_Catch_Events.xls (60,5 KiB, 3 861 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Thread: Solved: VBA Target.value

Thread Tools
Display
  • Linear Mode
  • Switch to Hybrid Mode
  • Switch to Threaded Mode

Solved: VBA Target.value

Please need help with the «Target.value = 0» IF to clear the cell contents in the following code:

[vba]Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = 0 Then
Target.Offset.Offset(0, 1).ClearContents
End If
If Target.Column = 1 Then
If Target.Row > 10 Then
If Target.Row

Could this be the problem. You have:
[VBA]Target. Offset .Offset(0, 1).ClearContents [/VBA]

I did the correction suggested but I still can not run the IF section:

[VBA]If Target.Value = 0 Then
Target.Offset(0, 1).ClearContents
End If[/VBA]

See corrected vba code below:
[VBA]Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = 0 Then
Target.Offset(0, 1).ClearContents
End If
If Target.Column = 1 Then
If Target.Row > 10 Then
If Target.Row

the first if statement works for me, if I put a 0 in column A, anything in column B in the same row is cleared. Perhaps you need to exit the sub if the value is 0? try

[vba]
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = 0 Then
Target.Offset(0, 1).ClearContents
Exit Sub
End If
If Target.Column = 1 Then
If Target.Row > 10 Then
If Target.Row

Private Sub Worksheet_Change(ByVal Target As Range)

On Error GoTo ws_exit

If Target.Value = 0 Then

Target.Offset(0, 1).ClearContents
End If

If Not Intersect(Target, Me.Range(«A11:A14»)) Is Nothing Then

Target.Offset(0, 1) = Now()
End If

ws_exit:
Application.EnableEvents = True
End Sub
[/vba]

____________________________________________
Nihil simul inventum est et perfectum

Abusus non tollit usum

Last night I dreamed of a small consolation enjoyed only by the blind: Nobody knows the trouble I’ve not seen!
James Thurber

I am enclosed file with the code. May be there you can catch the problem.

Thanks for the help.

My code supplied earlier works fine with that workbook. Why didn’t you try it?

____________________________________________
Nihil simul inventum est et perfectum

Abusus non tollit usum

Last night I dreamed of a small consolation enjoyed only by the blind: Nobody knows the trouble I’ve not seen!
James Thurber

I just not want a solution but to learn what is the problem with the code that apparently should work.

I really appreciate your help.

You need to set EnableEvents to False before the code makes any changes
[vba]
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Exits
Application.EnableEvents = False
If Target.Value = 0 Then
Target.Offset.Offset(0, 1).ClearContents
End If
If Target.Column = 1 Then
If Target.Row > 10 Then
If Target.Row 06:39 AM . Reason: Minor revision

MVP (Excel 2008-2010)

Post a workbook with sample data and layout if you want a quicker solution.

To help indent your macros try Smart Indent

Please remember to mark threads ‘Solved’

Excel Dashboards VBA and more

Your Custom Text Here

Excel Dashboards VBA and more

Worksheet Change Event

Automatically Run Excel Macros When a Cell Changes

VBA Change to a Single Cell

In Excel a Worksheet Change Event is a trigger for a macro when a cell or group of cells change. I will start out by showing how a change to a single cell can trigger an action. The following will colour cell B2 Red whenever the cell changes. The following uses the(ByVal Target As Range) line which uses the Variable named Target. The Target is the Range which will trigger an action. You assign the Range within the code itself.

Читать еще:  Пропала строка меню в excel

Before you fill your boots with the following it is worth mentioning that when you employ the use of the VBA change events you lose the ability to undo in Excel. Normally Excel keeps a record of a number of actions.

The VBA code to perform this action needs to go in the sheet object you want to perform the event. If you wanted to put the code in Sheet1 then you would double click on the sheet you wish to run the code from.

The following is an example of Excel VBA coding you could put in Sheet1 or any of the other sheet objects.

In the example above you need to keep the $ (absolute sign) or the code will not work. So when referencing a single cell the range reference needs to be absolute.

The following VBA performs the same action as the above example. It is a little more flexible if you wish to add to the range. Once Inside the Worksheet Change Event, if the Target falls within the defined Range and the cell contents change, it will trigger an action inside VBA.

Private Sub Worksheet_Change( ByVal Target As Range ) ‘Excel VBA with more cells in the range.

Disable Events

Occasionally one of the things you may wish to do with the cell that is changing is delete, copy, cut or some other action which triggers a circular loop. For example, if you wanted to move a line to another sheet which met a condition, when the condition was met you would trigger the Change Event and when you deleted the row you would start another change event. This second change event would cause a debug error. To get around this you can turn Events off at the start of the procedure and turn them back on at the end of the procedure.

The line of code is;

and the following is an example of how it might be used.

The VBA macro will copy the entire row from one sheet to another and delete the row which was just copied. The example is shown in the file below.

VBA Worksheet Change Event Multiple Cells

When we want to perform an action when more than one cell is changed we can use the following VBA code to change a larger range.

VBA Double Click Event

A double click event in Excel VBA is self explanatory. It will occur on double click of a cell in the Target range. So if you have a range between C13 and O26 where you want to perform an action on Double click, the following should help.

VBA Before Save Event

This event is triggered as the name suggests before each Save. So as the save Excel file icon is clicked the code which is associated with this event will trigger.

The before Save event needs to go into the ThisWorkbook Object in order for it to run.

The following Excel VBA macro will put the word False in Cell A1 before the file is saved.

Ссылка на основную публикацию
Adblock
detector