Событие afterupdate vba excel

События

Событие AddControl (добавился элемент)

Событие AddControl возникает при добавлении во время работы программы нового элемента управления в диалоговое окно (UserForm), рамку (Frame), набор вкладок (MultiPage) или на одну вкладку (Page). При добавлении элементов на стадии проектирования окна и при выводе окна на экран в процессе работы это событие не возникает. Инициируется оно методом Add (Добавить).

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

Private Sub объект_AddControl ()

Для диалогового окна в качестве параметра передается добавляемый элемент:

Private Sub UserForm_AddControl (ByVal ctrl As MSForms. Control)

При добавлении элемента в набор страниц вызов этой процедуры имеет вид:

Private Sub объект_AddControl (index As Long,  ctrl As Control)

Здесь объект — это тот объект, в который добавляется элемент управления, index — индекс вкладки, в которую добавляется элемент, а ctrl — сам добавляемый элемент.

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

Private Sub UserForm_AddControl (ByVal Ctrl As MSForms. Control) 
	MsgBox "Появился новый элемент"
End Sub

Событие AfterUpdate (После модификации)

Возникает после изменения пользователем данных в элементе управления. Это событие не может быть отменено. Оно происходит после события BeforeUpdate и перед событием Exit для текущего элемента и перед событием Enter для элемента, на который переместится фокус после нажатия клавиши Tab. Вызов процедуры обработки события AfterUpdate имеет вид:

Private Sub объект_AfterUpdate ()

Событие BeforeDragOver (Перед завершением перетаскивания)

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

Набор параметров, передаваемых процедуре обработки события BeforeDragOver, зависит от вида элемента управления. Они имеют следующий вид.

  • для рамки ( Frame ) :
    Private Sub объект_BeforeDragOver (ByVal Cancel As MSForms. 
    ReturnBoolean,  ctrl As Control,  ByVal Data As DataObject,  
    ByVal X As Single,  ByVal Y As Single,  ByVal DragState As fmDragState,  
    ByVal Effect As MSForms. ReturnEffect,  ByVal Shift As fmShiftState) ;
  • для набора страниц ( MultiPage ) :
    Private Sub объект_BeforeDragOver (index As Long,  ByVal Cancel As MSForms. 
    ReturnBoolean,  ctrl As Control,  ByVal Data As DataObject,  
    ByVal X As Single,  ByVal Y As Single,  ByVal DragState As fmDragState,  
    ByVal Effect As MSForms. ReturnEffect,  ByVal Shift As fmShiftState) ;
  • для полосы вкладок ( TabStrip ) :
    Private Sub объект_BeforeDragOver (index As Long,  ByVal Cancel As MSForms. 
    ReturnBoolean,  ByVal Data As DataObject,  ByVal X As Single,  ByVal Y As 
    Single,  ByVal DragState As fmDragState,  ByVal Effect As MSForms. 
    ReturnEffect,  ByVal Shift As fmShiftState) ;
  • для других элементов управления:
    Private Sub объект_BeforeDragOver (ByVal Cancel As MSForms. 
    ReturnBoolean,  ByVal Data As DataObject,  ByVal X As Single,  
    ByVal Y As Single,  ByVal DragState As fmDragState,  ByVal Effect As MSForms. 
    ReturnEffect,  ByVal Shift As fmShiftState).

Здесь объект — имя объекта, которому принадлежит процедура, index — индекс вкладки из набора вкладок, затрагиваемой операцией перетаскивания, Cancel — обязательный статус обработки события, False означает, что оно будет обрабатываться элементом (по умолчанию), True показывает, что событие будет обрабатываться приложением. Параметр ctrl — тот элемент, перетаскивание которого завершается. Параметр Data содержит перетаскиваемые данные в формате объекта типа DataObject. Параметры X и Y задают горизонтальную и вертикальную координаты положения указателя мыши в элементе, измеряемые в точках. X — расстояние от левого края элемента, Y — от верхнего края. Параметр DragState указывает состояние указателя мыши относительно целевого элемента. Его возможные значения: fmDragStateEnter = 0 — указатель внутри целевого элемента, fmDragStateLeave = 1 — указатель вне области целевого элемента, fmDragStateOver = 2 — указатель находится в новом положении, но внутри того же элемента. Параметр Effect определяет возможные операции, выполняемые над опущенным исходным элементом. Его возможные значения те же, что и у описанного выше метода StartDrag. Параметр Shift задает состояние клавиш Shift, Ctrl и Alt. Его возможные значения: fmShiftMask = 1 — нажата клавиша Shift, fmCtrlMask = 2 — клавиша Ctrl, fmAltMask = 4 — Alt.

Большинство элементов управления не поддерживает перетаскивание при значении аргумента Cancel = False (это значение устанавливается по умолчанию). Эти элементы не позволяют перетащить что-либо на себя и не возбуждают событие BeforeDropOrPaste. Исключения — поле ввода ( TextBox ) и комбинированный список ( ComboBox ), разрешающие перетаскивание даже при значении параметра Cancel = False.

Событие BeforeDropOrPaste (Перед опусканием или вставкой)

Возникает, когда пользователь собирается поместить или вставить данные в объект. Для набора страниц и полосы вкладок VBA инициирует это событие, когда перемещает данные на элемент, а для остальных элементов — перед операциями опускания или вставки.

Набор параметров, передаваемых процедуре обработки события BeforeDropOrPaste, зависит от типа элемента управления. Они имеют такой вид:

  • для рамки ( Frame ) :
    Private Sub объект_BeforeDropOrPaste (ByVal Cancel As MSForms. 
    ReturnBoolean,  ctrl As Control,  ByVal Action As fmAction,  
    ByVal Data As DataObject,  ByVal X As Single,  ByVal Y As Single,  
    ByVal Effect As MSForms. ReturnEffect,  ByVal Shift As fmShiftState),
  • для набора страниц ( MultiPage ) :
    Private Sub объект_BeforeDropOrPaste (index As Long,  ByVal Cancel As MSForms. 
    ReturnBoolean,  ctrl As Control,  ByVal Action As fmAction,  ByVal Data As 
    DataObject,  ByVal X As Single,  ByVal Y As Single,  ByVal Effect As MSForms. 
    ReturnEffect,  ByVal Shift As fmShiftState),
  • для полосы вкладок ( TabStrip ) :
    Private Sub объект_BeforeDropOrPaste (index As Long,  ByVal Cancel As MSForms. 
    ReturnBoolean,  ByVal Action As fmAction,  ByVal Data As DataObject,  ByVal X 
    As Single,  ByVal Y As Single,  ByVal Effect As MSForms. ReturnEffect,  ByVal 
    Shift As fmShiftState),
  • для других элементов:
    Private Sub объект_BeforeDropOrPaste (ByVal Cancel As MSForms. 
    Return-Boolean,  ByVal Action As fmAction,  ByVal Data As DataObject,  
    ByVal X As Single,  ByVal Y As Single,  ByVal Effect As MSForms. ReturnEffect,  
    ByVal Shift As fmShiftState)

Здесь имя элемента объект и параметры index, Cancel, Data, Effect, X, Y и Shift имеют тот же смысл и значение, что и в процедуре обработки события BeforeDragOver, описанной выше. Параметр Action определяет результат выполняемой операции перетаскивания, основываясь на текущем состоянии клавиатуры. Возможные значения: fmActionPaste = 2 — вставить выбранный объект на предназначенное место, fmActionDragDrop = 3 — указывает, что пользователь перетащил объект с исходного места и опустил его на место назначения.

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

Если Effect равно fmDropEffectCopyOrMove, в качестве значения для Action можно установить fmDropEffectNone, fmDropEffectCopy или fmDropEffectMove. Если Effect равно fmDropEffectCopy или fmDropEffectMove, можно задать значение fmDropEffectNone. Если Effect установлено как fmDropEffectNone, Action изменять нельзя.

Событие BeforeUpdate (Перед модификацией)

Возникает перед изменением данных в элементе управления. Его появление не зависит от того, связаны ли данные элемента с таблицей Excel, т. е. определено ли свойство RowSource. Событие BeforeUpdate предшествует событиям AfterUpdate и Exit для того же элемента управления и событию Enter для элемента, который следующим попадет в фокус. Вот заголовок процедуры обработки этого события:

Private Sub объект_BeforeUpdate (ByVal Cancel As MSForms. ReturnBoolean)

Здесь объект — имя объекта, которому принадлежит процедура, а Cancel — обязательный статус обработки события, его значение False означает, что оно будет обрабатываться элементом (устанавливается по умолчанию), True — что событие будет обрабатываться приложением. При этом элемент остается в фокусе, но ни AfterUpdate, ни Exit для него не инициируются.

Событие Change (Изменение)

Возникает при изменении значения элемента, т. е. свойства Value. Это изменение может быть вызвано как действиями пользователя в диалоговом окне, так и программы. В частности, изменение состояния происходит:

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

Заголовок процедуры обработки события Change:

Private Sub объект_Change ()

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

 

OlegO

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

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

#1

27.10.2020 17:47:38

Доброго времени суток, уважаемые форумчане. Пол-дня сегодня потерял, пытаясь разобраться. Итак, на форме есть текстбокс и придумалось мне, чтобы код по вставке данных срабатывал на нажатие Enter после ввода числа в упомянутый текстбокс (подобрал перебором, change или select не подходят, т.к. число может быть из нескольких разрядов). Код вышел таким (Write_mat это имя текстбокса, формы вызывается двойным кликом в столбце G):

Код
Private Sub Write_mat_AfterUpdate() 'аналог кнопки (сработка по Enter)
    Dim LastRow_r As Long
        On Error Resume Next
        If Len(Me.Consumer.Value) > 0 Then
            If CDbl(Me.Write_mat.Value) <= CDbl(Me.Rest.Value) Then
                With Sheets("Расход")
                    LastRow_r = .Cells(Rows.Count, 2).End(xlUp).Row + 1
                    .Cells(LastRow_r, 1).Value = ActiveCell.Offset(, -5).Value 'дата расхода
 ...
                End With
                    Unload Me
            Else: MsgBox "Вы не можете списать более " & Me.Rest.Value & ActiveCell.Offset(, -1).Value, vbCritical, "Внимание! Превышение остатка": Exit Sub
            End If
            If CDbl(Me.Write_mat.Value) = CDbl(Me.Rest.Value) Then ActiveCell.Interior.Color = &HFF00& 'визуализация полного расхода позиции
        Else
            Me.Consumer.BackColor = &HFF&
            MsgBox "Вы не указали потребителя (поле выделено красным цветом), исправьте", vbInformation, "Внимание!": Exit Sub
    End If
End Sub

но когда начал тестировать, то excel всякий раз выпадал с ошибкой: automation error. Вызванный объект был отключен от клиентов. Пробовал отключать все что можно и в коде инициализации формы и в приведенном выше коде и в коде листов — ничего не помогает. Уже от отчаяния попробовал перенести код с события  AfterUpdate просто на кнопку и все заработало, так что решение так или иначе есть, но вопросы все-таки остались: почему такое поведение события AfterUpdate  и можно ли все таки сделать так ,чтобы код срабатывал на нажатие на клавиатуре кнопки Enter?
Заранее спасибо всем откликнувшимся.

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

  • тесt.xlsm (28.61 КБ)

 

Александр Макаров

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

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

#2

27.10.2020 19:34:01

Возможно вам проще сделать используя событие TextBox_KeyDown и проверку нажатия enter

Код
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
       'Здесь ваш код
    End If
End Sub

Изменено: Александр Макаров27.10.2020 19:46:47

 

OlegO

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

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

Александр Макаров

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

 

Александр Макаров

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

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

#4

27.10.2020 19:50:16

Цитата
OlegO написал:
код на основной и цифровой клавиатуре отличаться

Если вы имеете ввиду дополнительную клавиатуру (NumLock), то отличий нет.

Можно так же написать KeyCode = 13
(проверить можно в VBE в окне Immediate — набрать ?vbKeyReturn и нажать ввод получите 13)

Изменено: Александр Макаров27.10.2020 19:54:05

 

OlegO

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

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

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

 

На сколько я понял вы вставляете в text_box значение и после того, как вы вставили нажимаете enter.
Так вот событие срабатывает на каждое нажатие клавиши в поле text_box и получает параметр (keycode) клавиши
(как-то так, если что гуру поправят), вот этот параметр мы и смотрим.

Посмотрите в файле

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

  • тесt.xlsm (28.04 КБ)

Изменено: Александр Макаров27.10.2020 20:10:36

 

OlegO

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

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

я имел ввиду немного не то. Почему такая реакция Excel была на попытку использовать AfterUpdate? Сами можете убедиться в прилагаемом файле: вставьть любое значение в текстбокс ,нажмите Enter и вуаля — крах

 

RAN

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

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

#8

27.10.2020 20:16:08

Уберите выгрузку формы, или замените ее на Me.Hide,

Цитата
OlegO написал:
нажмите Enter и вуаля — крах

не произойдет.

 

OlegO

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

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

Спасибо за отклик и совет, RAN. А все таки, для моего самообразования, почему мой вариант приводит к краху?

 

Вставил в предыдущее сообщение ваш файл с корректированным кодом
Для вашей задачи лучше использовать это событие

Как написал RAN у вас в коде события AfterUpdate стоит Unload Me (выгрузка формы), что приводит к событию Update формы и всех её элементов, а форма уже выгружена и поэтому УПС!

Изменено: Александр Макаров27.10.2020 20:39:23

 

OlegO

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

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

 

_Igor_61

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

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

#12

27.10.2020 20:59:14

Цитата
OlegO написал:
Вызванный объект был отключен от клиентов

Тоже (правда давно и не часто) сталкивался с этой ошибкой, заметил что это происходило если действия производятся на разных листах (обращения к листам конкретные — ThisWorkbook.Worksheets(«такой-то»).Cells… или Range… т.е. — листы указаны). Лечил в коде либо активацией листа перед производимыми на нем действиями (и до сих пор так делаю, т.к. помогло в первый раз) либо пересохранением книги в проблемных местах где выскакивала ошибка (тупо ThisWorkbook.Save) — и то и другое помогало избавиться от этой ошибки. Переустановка Office тоже помогала.  :)  Формы не выгружались, применял для скрытия и отображения только Hide и Activate. Откуда и почему такое так и не понял. Наверное, возникает какая-то путаница среди объектов создаваемых пользователем и созданных разработчиком. А может и есть что-то об этом в документации, просто не нашел.

Изменено: _Igor_6127.10.2020 21:14:19

Permalink

Cannot retrieve contributors at this time

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

AfterUpdate event

fm20.chm5224934

fm20.chm5224934

office

Office.AfterUpdate

3d15efd4-06c8-136f-c315-7efc44db35b1

11/15/2018

medium

Occurs after data in a control is changed through the user interface.

Syntax

Private Subobject _AfterUpdate( )

The AfterUpdate event syntax has these parts:

Part Description
object Required. A valid object.

Remarks

The AfterUpdate event occurs regardless of whether the control is bound (that is, when the RowSource property specifies a data source for the control). This event cannot be canceled. If you want to cancel the update (to restore the previous value of the control), use the BeforeUpdate event and set the Cancel argument to True.

The AfterUpdate event occurs after the BeforeUpdate event and before the Exit event for the current control, and before the Enter event for the next control in the tab order.

See also

  • Microsoft Forms examples
  • Microsoft Forms reference
  • Microsoft Forms concepts

[!includeSupport and feedback]

Файл в студию, плз.

Добавлено через 11 часов 51 минуту
С событием Enter в своём случае разобрался. Как и предполагалось через костыли. Влепил код для Enter в обработчик MouseMuve (как вариант — MouseDown). В обработчики KeyUp, KeyDown, KeyPress влепил ссылки на MouseMuve с параметрами «1, 0, 0, 0», хотя, думаю подойдут любые параметры. Для моих целей подошло. Код выполняется с небольшой (мс) задержкой… Пойдёт.
Может кому пригодиться.

Теперь остался грёбаный AfterUpdate. Работаем…

Добавлено через 3 часа 48 минут
Разобрался и с AfterUpdate. Принцип тот же. Разместил код в обработчике KeyDown и указал условия выполнения. При нажатии клавиш Enter, TAB, стрелки выполняется часть кода. Осталась одна проблема. Что если пользователь не нажимает клавиши а выбирает TextBox’ы мышью.

Добавлено через 27 минут
Есть одна мысль. Как запомнить в некой переменной последний изменяемый TextBox? Что-то типа PreviousControl в Access.

Добавлено через 21 час 48 минут
Запихал в Public имя TextBox’а из TextBox_KeyUp модуля класса и применил этот Public в процедуре MouseDown, а из TextBox_KeyDown модуля классов с условиями vbKeyDown = 9, 13, 37, 38, 39, 40 отправил в MouseDown с параметрами 1, 0, 0, 0.
Вот вам 100% замена события AfterUpdate в модуле классов для Text_ и Combo_ Box’ов. Пользуйтесь.
Всем спасибо за участие. Будут какие-то мысли, пишите, я на связи.

title keywords f1_keywords ms.prod api_name ms.assetid ms.date

TextBox.AfterUpdate Event (Access)

vbaac10.chm14195

vbaac10.chm14195

access

Access.TextBox.AfterUpdate

609ef5f3-3894-85eb-4879-5db3fc7ff188

06/08/2017

TextBox.AfterUpdate Event (Access)

The AfterUpdate event occurs after changed data in a control or record is updated.

Syntax

expression. AfterUpdate

expression A variable that represents a TextBox object.

Remarks

Changing data in a control by using Visual Basic or a macro containing the SetValue action doesn’t trigger these events for the control. However, if you then move to another record or save the record, the form’s AfterUpdate event does occur.

To run a macro or event procedure when this event occurs, set the AfterUpdate property to the name of the macro or to [Event Procedure].

The AfterUpdate event is triggered when a control or record is updated. Within a record, changed data in each control is updated when the control loses the focus or when the user presses ENTER or TAB.

When you enter new or changed data in a control on a form and then move to another record or save the record by clicking Save Record on the Records menu, the AfterUpdate event for the form occur immediately after the AfterUpdate event for the control. When you move to a different record, the Exit and LostFocus events for the control occur, followed by the Current event for the record you moved to, and the Enter and GotFocus events for the first control in this record. To run the AfterUpdate macro or event procedure without running the Exit and LostFocus macros or event procedures, save the record by using the Save Record command on the Records menu.

AfterUpdate macros and event procedures run only if you change the data in a control. This event does not occur when a value changes in a calculated control. AfterUpdate macros and event procedures for a form run only if you change the data in one or more controls in the record.

For bound controls, the OldValue property isn’t set to the updated value until after the AfterUpdate event for the form occurs. Even if the user enters a new value in the control, the OldValue property setting isn’t changed until the data is saved (the record is updated). If you cancel an update, the value of the OldValue property replaces the existing value in the control.

Note To perform simple validations, or more complex validations such as requiring a value in a field or validating more than one control on a form, you can use the ValidationRule property for controls and the ValidationRule and Required properties for fields and records in tables.

See also

Concepts

TextBox Object

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