MS Access多控制按键CTRL + A处理程序

时间:2017-12-10 02:04:45

标签: vba ms-access access-vba ms-access-2016

我有一个包含10个以上文本控件的Access数据库。我想要一些代码来处理CTRL + A KeyPress事件。通常,在Access中按CTRL + A时,会选择所有记录。我的最终目标是让CTRL + A只选择控件的文本(比如在浏览器的URL栏中按CTRL + A,它只选择那个文本),这样我就只能删除该控件的文本。我检查this article,因为我想要一些可以处理任何文本框的东西(处理每个文本框的KeyPress = 60+行代码)。有没有办法,比如说,下一个循环?

Function HandleKeyPress(frm As Form, KeyAscii As Integer, ByVal e As KeyPressEventArgs) 'should it be a function or a sub?
    For Each ctl In Me.Controls
        If KeyAscii = 1 Then    'I think this is CTRL + A?
            e.Handled = True    'Stop this keypress from doing anything in access
            focused_text_box.SelStart = 0
            focused_text_box.SelLength = Len(focused_text_box.Text)
        End If
    Next
End Function

除此之外,如何将文本框的名称传递给此子/函数?

注意:如果您还没有注意到,我仍然是VBA / Access的菜鸟。

1 个答案:

答案 0 :(得分:4)

您当前的方法不起作用,因为它包含多个在VBA中不起作用的事情(如June7所述),并且因为表单keydown事件优先于文本框keydown事件

您可以使用以下代码(受this answer on SU启发):

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyA And Shift = acCtrlMask Then 'Catch Ctrl+A
        KeyCode = 0 'Suppress normal effect
        On Error GoTo ExitSub 'ActiveControl causes a runtime error if none is active
        If TypeOf Me.ActiveControl Is TextBox Then
            With Me.ActiveControl
                .SelStart = 0
                .SelLength = Len(.Text)
            End With
        End If
    End If
ExitSub:
End Sub

使用VBA或仅使用属性窗格将Form.KeyPreview属性设置为True非常重要,以允许此函数优先于默认行为。