.OldValue 属性 在表单的撤消按钮处理程序中给出 运行-时间错误 2448

.OldValue property in Undo button handler of form gives run-time error 2448

这是我的第一个问题,希望我答对了。

我正在进行一个审查员工信息的项目。我使用了两种形式,第一种是 "ReadOnly," 第二种是 "EditOnly."

"ReadOnly" 表单绑定到一个查询,该查询定义要显示的特定记录的条件。

"EditOnly" 表单有一个子表单,绑定到 2 个表(它们也是 "ReadOnly" 表单来源的查询的一部分),具有一对多关系(使用此答案中的信息: ).

"EditOnly" 表单通过按钮打开,用于编辑特定员工的数据。在这种形式中,我有一个 Undo 按钮,使用此代码:

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

这会还原不需要的更改。但是在测试函数时,更改一些数据后我得到 运行-time error 2448。使用 Debug 突出显示此行:

ctlC.Value = ctlC.OldValue

有没有办法让撤消按钮起作用?

错误 2448 是 "Can't assign a value to this object"。

如果您尝试为表单上已读取 only/locked 或已禁用的任何文本框分配值,则会出现此错误。

修改您的代码以检查 ctlc 是否有 EnabledLocked 并跳过任何不可分配的控件,如下所示:

  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

调试提示:

您可以通过单步执行或直接写入 window (Debug.Print ctlc.Name) 来检查 ctlc.Name 的值,以查看哪个文本框是问题的根源。