以有界形式自动大写字母

时间:2011-06-09 12:32:26

标签: ms-access vba access-vba

我有一个有界的,连续的形式,有一些用户可以修改的文本框。 我想使用一些代码来自动大写用户键入的内容,例如

Private Sub textbox_BeforeUpdate(Cancel As Integer)
    Me.textbox = UCase(Me.textbox)
End Sub

但它会导致错误......有什么建议吗?

我注意到,在一个有界的连续形式中,我无法将指针移动到其记录集中。

Me.Recordset.MoveNext

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

4 个答案:

答案 0 :(得分:2)

将UCase表达式放在文本框控件的After Update事件中。

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安装可能已损坏。

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

答案 1 :(得分:1)

对于第一个问题: 使用Keypress事件检查小写字母,然后返回大写字母对位部分:

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

更新:由于我收到了批评和对我的回答的暗示,我将详细说明您何时以及为何使用上述代码。

首先,让我说* After_Update *事件在与该事件相关的控件失去焦点后触发(通过制表符或实际移动到下一条记录)。 *如果用户剪切并粘贴文本,After_Update *也会识别粘贴;诚然,我的代码没有。如果您唯一关心的是以大写形式将文本存储在数据库中,请务必使用* After_Update *来UCase该值。

但是,* KEY_PRESS *按键会为您提供一个优势:能够实时更正按下的字母。

对于纯粹的开发者来说,这个事件可能看起来很浪费。但是,任何从公司领到薪水的人都应该认识到保持付费客户满意是必不可少的。如果该付费客户说“我希望在用户开始输入时看到大写字母”,那么您将使用上面的代码。它对应用程序的行为方式几乎没有(如果有的话)影响,并且会满足老板的要求。

事实上,也许客户说“嘿,这个字段用于为我们的库存输入序列号。所有产品的序列号都使用零,而不是字母O.因此,请确保它们不会为此字段输入O 。“

现在* KEY_PRESS *还有一个用处。您可以否定要按下的字母O,也可以用您需要的值替换字母O:

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

    Const UPPER_O = 79
    Const LOWER_O = 111
    Const ZERO_ASCII = 48

    Select Case KeyAscii

        Case UPPER_O, LOWER_O
            KeyAscii = 0 'Cancel it out
            'KeyAscii = ZERO_ASCII 'OR Replace it with the number zero
        Case ASCII_LOWER_A To ASCII_LOWER_Z
            KeyAscii = KeyAscii + UPPER_MODIFIER  'The old familiar code that will capitalize all other letters
        Case Else
        'Whatever other validations you want to do on the textbox here.

    End Select

End Sub

那么切割和粘贴无效值呢?这就是Form_BeforeUpdate事件的用途。您可以在保存之前检查所有值,如果没有jive,则设置Cancel = True。

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

答案 2 :(得分:-1)

您是否尝试将其放入TextBox1_Change Sub ???

答案 3 :(得分:-1)

尝试

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