Свойство .OldValue в обработчике кнопки отмены формы дает ошибку времени выполнения 2448

Это мой первый вопрос, поэтому я надеюсь, что правильно его понял.

Я работаю над проектом по просмотру информации о сотрудниках. Я использую две формы, первая — «Только для чтения», вторая — «Только для редактирования».

Форма «Только для чтения» связана с запросом, который определяет критерии отображения определенных записей.

Форма «EditOnly» имеет подчиненную форму, привязанную к 2 таблицам (которые также являются частью запроса, который является источником для формы «ReadOnly»), которые имеют отношение «1 ко многим» (с использованием информации из этого ответа: Ошибка 3251 в свойстве управления .oldValue).

Форма «Только редактирование» открывается с помощью кнопки и используется для редактирования данных конкретного Сотрудника. В этой форме у меня есть кнопка Отменить, использующая этот код:

Sub UndoEdits()
  If Me.Dirty Then
    Me!btnUndo.Enabled = True
  Else
    Me!btnUndo.Enabled = False
  End If
End Sub

Sub btnUndo Click()
  Dim ctlC As Control
  For Each ctlC in Me.Controls
    If ctlC.ControlType = acTextBox Then
      ctlC.Value = ctlC.OldValue
    End If
  Next ctlC
End Sub

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

ctlC.Value = ctlC.OldValue

Есть ли способ заставить работать кнопку Отменить?


person Tomáš Kruliš    schedule 04.12.2017    source источник
comment
Не могли бы вы научить пользователей нажимать Esc один или два раза для получения одного и того же эффекта?   -  person Gustav    schedule 04.12.2017
comment
Это может быть вариант, но я хотел попробовать системное решение. Если это не разумно достижимо, я отвлекся на это решение.   -  person Tomáš Kruliš    schedule 04.12.2017
comment
Поздравляю с первым постом! Не так уж плохо для первого вопроса. На самом деле, по сравнению с большинством первых постов, я, наверное, должен сказать, что это просто блестяще! Единственное, что бросается в глаза, это отсутствие отступа кода. Очень важно убедиться, что ваш код имеет правильный отступ и что вы копируете и вставляете код напрямую, а не вводите его вручную. Другие изменения, которые я внес, заключались в демонстрации методов форматирования и исправлении грамматики. (Поскольку английский не является вашим родным языком, эти ошибки понятны, и в целом вопрос был достаточно ясен…   -  person robinCTS    schedule 06.12.2017
comment
…Третий абзац я не мог полностью понять, поэтому я не смог полностью исправить его, возможно, допустив ошибку. Однако, на мой взгляд, весь этот абзац следует опустить, поскольку он не добавляет никакой необходимой информации.) Если вы еще этого не сделали, я бы посоветовал прочитать Как задать вопрос после того, как вы пройдете тур, чтобы вы продолжали спрашивать хорошие вопросы по теме.   -  person robinCTS    schedule 06.12.2017
comment
@robinCTS Привет, Робин! Спасибо за хороший обзор! И, пожалуйста, позвольте мне извиниться за мой поздний ответ. Я получаю доступ к этой учетной записи только на работе, и у меня было несколько очень загруженных дней, поэтому я сделал это сейчас. Я больше сосредоточусь на коде и форматировании текста, чтобы мои вопросы (или когда-нибудь ответы) были более читаемыми. Третий абзац предназначался для добавления информации, которая, по моему мнению, была полезной (или могла бы исключить некоторые основные причины сбоя), но, возможно, в этом не было необходимости. Я смотрю на них, спасибо!   -  person Tomáš Kruliš    schedule 11.12.2017
comment
Ой, извините, хотел сказать четвертый абзац. Однако похоже, что мы оба не умеем считать и говорим об одном и том же ;-) Да, я полагаю, что лучше добавить лишнюю ненужную информацию, чем упустить что-то важное. Если понятно и понятно, конечно ;-)   -  person robinCTS    schedule 12.12.2017


Ответы (1)


Ошибка 2448: «Невозможно присвоить значение этому объекту».

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

Измените свой код, чтобы проверить ctlc на Enabled и Locked и пропустить все элементы управления, которые нельзя назначать, например:

  Dim ctlC As Control

  For Each ctlC in Me.Controls
    If ctlC.ControlType = acTextBox Then
        If ctlC.Enabled And Not ctlC.Locked Then
            ctlC.Value = ctlC.OldValue
        End If
    End If
  Next ctlC

Совет по отладке:

Вы можете проверить значение ctlc.Name либо пошагово, либо путем записи в непосредственное окно (Debug.Print ctlc.Name), чтобы увидеть, какое текстовое поле является источником проблемы.

person John Mo    schedule 04.12.2017
comment
Я с уважением не согласен. Ответ Джона был в некотором роде полезен, но я на самом деле присоединюсь к комментарию Густава и попытаюсь научить пользователей использовать Esc. - person Tomáš Kruliš; 05.12.2017
comment
Вопрос: Есть ли способ заставить работать кнопку «Отменить»? Ответ: Да: измените код, чтобы он не присваивал значения элементам управления вслепую, не проверяя, может ли элемент управления принять значение. - person John Mo; 05.12.2017
comment
С редактированием проблем нет. Я не уверен, что полностью разделяю мысль о том, что мне не следует создавать впечатление, что я помогаю устранить проблему. Разве не этим мы здесь занимаемся? Обычно я стараюсь включить совет о том, как бы я сам решил/отладил проблему, чтобы научить человека ловить рыбу... - person John Mo; 06.12.2017
comment
@JohnMo Не забудьте использовать @ответы, как я сделал здесь, чтобы пользователь, которому вы направляете свой комментарий, пинговался ( уведомлен). Меня не зацепил ваш предыдущий комментарий - я заметил его только случайно, так как меня зацепил комментарий Томаша к вопросу. Что касается отладки, это должен сделать OP. Если разумная попытка была предпринята, то да, помощь может быть оказана в комментариях. Комментарии предназначены для получения разъяснений (и для минимальной помощи по отладке). Ответы для… хорошо ответов. - person robinCTS; 12.12.2017
comment
При этом, если вы хотите пойти дальше и добавить советы по отладке (что, я согласен, является хорошей идеей), сделайте это после того, как вы напишете полный автономный ответ, возможно, в отдельном приложении к советам по отладке. . И что бы вы ни делали, не излагайте советы в явном стиле вопрос/ответ. С количеством бессмысленных ответов, размещенных на этом сайте (включая полномасштабные вопросы с кодом и всем остальным!), как рецензенту, слишком легко увидеть ответ, задающий вопросы (или просто вопрос ) и просто нажмите «Рекомендовать удаление», не задумываясь. - person robinCTS; 12.12.2017
comment
@JohnMo Здравствуйте, сэр, я пытался заставить его работать так, как вы предложили, но здесь меня могут превзойти: D Когда я пытаюсь выполнить код, я получаю: Ошибка 91: переменная объекта или переменная блока не установлена. - person Tomáš Kruliš; 12.12.2017
comment
Я попытался выяснить, что это на самом деле означает, используя эту страницу и страницу MSDN, но не нашел, как применить решения оттуда к моему делу. Я мог бы быть немного над моей головой здесь. У меня есть только базовое понимание VBA и MS Access, я учусь в основном на ходу. Я также пытался заставить работать отладочную печать в Immediate Window, но в итоге получаю ту же ошибку, даже не имея возможности анализировать свойства текстовых полей. Извините, что написал это в 2 комментариях, я действительно не мог отредактировать первый после того, как случайно добавил его. - person Tomáš Kruliš; 12.12.2017
comment
@TomášKruliš Я отредактировал ответ, чтобы добавить его в цикл. Как и фрагмент кода, он начал пытаться использовать ctlC без присвоения ему значения. Цикл For-Next — это то, что давало ctlC значение. Это сообщение об ошибке говорило вам. Переменная объекта — ctlC, и перед попыткой проверки свойств в операторе IF ей ничего не присваивалось. - person John Mo; 12.12.2017
comment
@Джон Мо Большое спасибо! Думаю, теперь я понимаю. Тем не менее проблема сохраняется. Похоже, что код в этой форме не может распознать .ControlType ctlC в форме, потому что цикл останавливается на изображениях или метках (автоматическое изображение, автоматический заголовок) с ошибкой 438: объект не поддерживает свойство или метод. Я уже многому научился, но должен сказать, что начинаю склоняться к тому, чтобы просто нажать кнопку Esc, чтобы отменить изменения: D Потому что я думаю, что действительно понимаю код, который вы разместили, и не вижу любой момент, где может быть проблема... - person Tomáš Kruliš; 12.12.2017
comment
@TomášKruliš Хорошо, еще одно редактирование. Проблема в том, что он пытается оценить все условия в операторе IF, даже если первое условие не выполняется. В других языках у нас есть короткие замыкания, которые выпрыгивают из оператора IF после того, как первое условие не выполняется. В VBA это можно сделать с помощью нескольких вложенных IF. - person John Mo; 12.12.2017
comment
@John Mo После всех испытаний я наконец заставил это работать! Также пришлось пропустить ID (который скрыт, поэтому я использовал свойство Visible). Большое спасибо, информация о том, что нужно вложить Ifs, была чрезвычайно полезной. Хорошего дня! Томаш - person Tomáš Kruliš; 12.12.2017