Страницы: 1
RSS
Использование свойства AfterUpdate, Прошу объяснить поведение Excel
 
Доброго времени суток, уважаемые форумчане. Пол-дня сегодня потерял, пытаясь разобраться. Итак, на форме есть текстбокс и придумалось мне, чтобы код по вставке данных срабатывал на нажатие 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?
Заранее спасибо всем откликнувшимся.
 
Возможно вам проще сделать используя событие 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
 
Александр Макаров, я уже подумывал об этом, завтра на работе проверю, но хотел бы заранее уточнить:  каков код клавиши Enter и и будет ли этот код на основной и цифровой клавиатуре отличаться и если будет то как?
 
Цитата
OlegO написал:
код на основной и цифровой клавиатуре отличаться
Если вы имеете ввиду дополнительную клавиатуру (NumLock), то отличий нет.

Можно так же написать KeyCode = 13
(проверить можно в VBE в окне Immediate - набрать ?vbKeyReturn и нажать ввод получите 13)
Изменено: Александр Макаров - 27.10.2020 19:54:05
 
Спасибо, завтра проверю, но вообще-то немного разочаровался в своей первоначальной идее и кнопка становится все весомей. А по событию можете прояснить?
 
На сколько я понял вы вставляете в text_box значение и после того, как вы вставили нажимаете enter.
Так вот событие срабатывает на каждое нажатие клавиши в поле text_box и получает параметр (keycode) клавиши
(как-то так, если что гуру поправят), вот этот параметр мы и смотрим.

Посмотрите в файле
Изменено: Александр Макаров - 27.10.2020 20:10:36
 
я имел ввиду немного не то. Почему такая реакция Excel была на попытку использовать AfterUpdate? Сами можете убедиться в прилагаемом файле: вставьть любое значение в текстбокс ,нажмите Enter и вуаля - крах
 
Уберите выгрузку формы, или замените ее на Me.Hide,
Цитата
OlegO написал:
нажмите Enter и вуаля - крах
не произойдет.
 
Спасибо за отклик и совет, RAN. А все таки, для моего самообразования, почему мой вариант приводит к краху?
 
Вставил в предыдущее сообщение ваш файл с корректированным кодом
Для вашей задачи лучше использовать это событие

Как написал RAN у вас в коде события AfterUpdate стоит Unload Me (выгрузка формы), что приводит к событию Update формы и всех её элементов, а форма уже выгружена и поэтому УПС!
Изменено: Александр Макаров - 27.10.2020 20:39:23
 
Спасибо
 
Цитата
OlegO написал:
Вызванный объект был отключен от клиентов
Тоже (правда давно и не часто) сталкивался с этой ошибкой, заметил что это происходило если действия производятся на разных листах (обращения к листам конкретные - ThisWorkbook.Worksheets("такой-то").Cells... или Range... т.е. - листы указаны). Лечил в коде либо активацией листа перед производимыми на нем действиями (и до сих пор так делаю, т.к. помогло в первый раз) либо пересохранением книги в проблемных местах где выскакивала ошибка (тупо ThisWorkbook.Save) - и то и другое помогало избавиться от этой ошибки. Переустановка Office тоже помогала.  :)  Формы не выгружались, применял для скрытия и отображения только Hide и Activate. Откуда и почему такое так и не понял. Наверное, возникает какая-то путаница среди объектов создаваемых пользователем и созданных разработчиком. А может и есть что-то об этом в документации, просто не нашел.
Изменено: _Igor_61 - 27.10.2020 21:14:19
Страницы: 1
Наверх