Ms access 在有界形式中自动大写字母

Ms access 在有界形式中自动大写字母,ms-access,vba,Ms Access,Vba,我有一个有界的、连续的表单,其中包含一些用户可以修改的文本框。 我想使用一些代码来自动大写用户输入的内容,比如 Private Sub textbox_BeforeUpdate(Cancel As Integer) Me.textbox = UCase(Me.textbox) End Sub 但它会导致错误。。。有什么建议吗 我注意到,在一个有界的连续形式中,我不能在它的记录集中移动指针 Me.Recordset.MoveNext 这会导致错误(编号3462)。为什么?对于第一个问题

我有一个有界的、连续的表单,其中包含一些用户可以修改的文本框。 我想使用一些代码来自动大写用户输入的内容,比如

Private Sub textbox_BeforeUpdate(Cancel As Integer)
    Me.textbox = UCase(Me.textbox)
End Sub
但它会导致错误。。。有什么建议吗

我注意到,在一个有界的连续形式中,我不能在它的记录集中移动指针

Me.Recordset.MoveNext

这会导致错误(编号3462)。为什么?

对于第一个问题,您是否尝试将其放入
文本框1\u Change
Sub??

: 使用按键事件检查小写字母,然后返回其大写计数器部分:

Private Sub textbox_KeyPress(KeyAscii As Integer)
  Const ASCII_LOWER_A = 97
  Const ASCII_LOWER_Z = 122
  Const UPPER_MODIFIER = -32

  If KeyAscii >= ASCII_LOWER_A And KeyAscii <= ASCII_LOWER_Z Then
    KeyAscii = KeyAscii + UPPER_MODIFIER
  End If

End Sub
那么,如何剪切和粘贴无效值呢?这就是Form_BeforeUpdate事件的用途。您可以在保存之前检查所有值,如果某些内容没有发生抖动,则设置Cancel=True


这是一个非常有用的事件,如果您想实时使用UCase字母,它完全适用。

将UCase表达式放入文本框控件的“更新后”事件中

Private Sub textbox_AfterUpdate()
    Me.textbox = UCase(Me.textbox)
End Sub
至于第二个问题,对于我的表单上的命令按钮来说,这不会出错

Private Sub cmdMoveNext_Click()
    Me.Recordset.MoveNext
End Sub
这是我在即时窗口中看到的您的错误号

? AccessError(3462)
Failure to load a DLL.
这就是你看到的错误文本吗?如果是这样,我不知道原因,但我想知道你的数据库是否损坏。能否在新数据库中重新创建此表单的简化版本,以查看它是否在那里工作?如果它也失败了,那么您的Access安装可能已中断

坦率地说,我只是在抓救命稻草。这对我来说似乎很不寻常。

试试看

Private Sub textbox_BeforeUpdate(Cancel As Integer)
    Dim strBuffer As String
    strBuffer = Me.textbox
    Me.textbox.Focus
    Me.textbox = UCase(strBuffer)
End Sub

是的,我已经在变更事件中复制了这些,但什么也没有发生。这个事件甚至没有被触发。每次击键都会触发,所以这是一个糟糕的选择。@David-W-Fenton请阅读下面的@Ray023评论。你对他和我的答案都投了反对票,而且你还担心处理能力。如果你能提供更好的选择,我也可以投反对票。是的,每次击键都会触发更改事件,但是现在处理能力真的很低,因为机器除了等待击键之外不会做太多事情。我一点也不担心处理能力——这是你编造的。我担心的是,当有一个事件的目的是特定于所问问题中涉及的操作类型时,答案会建议使用错误的事件。虽然这个答案是可行的,但它绝对不是最好的答案——因此是否决票,所以最好的答案的评分最高。这东西不是应该这样工作的吗?谢谢!更新之前和更新之后有什么区别?数据控件的更新之前是在检查值是否有效时。。。当无效时,将“真”指定为“取消”。。。防止用户在修复无效问题之前移动到另一个控件。一旦接受更改的控件值并且用户正在移动到另一个控件,更新后即发生。表单上的更新前后是不同的。这些发生在窗体的绑定值存储到行源之前和之后。啊…因为它是一个绑定窗体,所以我认为它是在更新之前(到数据库)和更新之后(到数据库)…看看帮助文件,了解控件事件和窗体事件。这里的解释将澄清目前困扰您的差异。BeforeUpdate中的更新会导致递归问题,因此除了撤消(Cancel=True)之外,您不应该在那里执行任何操作。这会触发每次按键。您想要一个只触发一次的事件,这是AfterUpdate。为什么建议将
KeyAscii作为MSForms.ReturnInteger
?这需要设置非标准引用以避免编译错误:“未定义用户定义的类型”。如果您想使用此方法,则最好使用
keyscii As Integer
。如果用户将文本粘贴到文本框中,则不会使用此方法将其转换为大写。此外,如果绑定字段已经包含文本,则所有文本都不会转换为大写,尽管通过控件添加的任何字符都将被转换为大写。这两个可能都不是交易杀手,但更新后,您可以轻松地确保更新字段中的所有字符都转换为大写。@HansUp第一点,我的错误。我有Excel中的代码,我从那里剪切和粘贴;更正。对于已经存在的值,如果将表单作为操作数据的唯一方式,则不应成为问题。对于粘贴…嗯,有几种方法…其中一种是使用“AFTER_UPDATE”:P…但问题仍然是当用户键入时自动资本化…因此,可能不适用。我正在考虑通过其他方式将数据添加到表中,如导入。在我看来,似乎不太可能有人只想要新添加的字符,用于通过大写形式添加/更新的值。你也是对的,我们不知道这些问题是否适用于这种情况。。。这就是我为什么写《也许不是交易杀手》的原因。在使用了您的代码之后,我决定比最初更喜欢它。如果客户坚持她必须立即看到大写字符,我会使用它。更新后可能也会使用UCase.:-)+从我这里得到1。
Private Sub textbox_BeforeUpdate(Cancel As Integer)
    Dim strBuffer As String
    strBuffer = Me.textbox
    Me.textbox.Focus
    Me.textbox = UCase(strBuffer)
End Sub